2017-03-15 1 views
1

Ibpyを使用してインタラクティブブローカー(IB)から履歴データを取得しようとしています。 私はこの作業のためにいくつかのスクリプトを試しました。しかし、彼らのどれも私のために働く! 私はPythonに慣れていないので、私はこれらのメソッドの仕組みについて完全な洞察を持っていないことを認めていますが、最も明白な修正を試してみました。以下は私が試したスクリプトの2つを挙げたものです。 私はPython 2xを使用しています。IBPYのreqHistoricalDataは何も返しません。[python]

はTWSで、私は次の設定があります

確認:ActiveXとソケットクライアントを有効にします。 未チェック:DDEクライアントを有効にします。 未読:読み取り専用APIです。 がチェックされています:接続中の未処理注文をダウンロードします。 がチェックされています:ポートフォリオを送信するときにFXのポジションが含まれています。 チェック済み:EEPのステータスアップデートを送信します。 ソケットポート= 7496 チェック:自動注文をバインドするには、負の数値を使用します。 未チェック:APIメッセージログファイルを作成します。 チェックを外します:APIログファイルにマーケットデータを含めます。 ログレベル=エラー。 マスターAPIクライアントID = 222 バルクデータをAPIに送信するタイムアウトは30秒です。 コンポーネントExchセパレータ=空白。 チェック済み:ローカルホストからの接続のみを許可します。

API - 注意事項:APIオーダーの注意事項を守ってください。このタブでは他のすべてがチェックされていません。

Pythonスクリプトを実行するとTWSがログインして実行されています。上記のTWS API設定は、他の人がオンラインで話しているものと比べて正しいようです。私は米国の株式データを購読している実際のIB口座を持っています。さらに、IBPYを介して注文する別のスクリプトを実行しようとしたことにも言及する必要があります。これは機能しているため、履歴データを取得することに関して問題が(現時点で)少なくとも存在するようです。

スクリプト1:

from time import sleep, strftime, localtime 
from ib.ext.Contract import Contract 
from ib.opt import ibConnection, message 


new_symbolinput = ['AAPL'] 
newDataList = [] 
dataDownload = [] 

def historical_data_handler(msg): 
    global newDataList 
    print (msg.reqId, msg.date, msg.close) 
    if ('finished' in str(msg.date)) == False: 
     new_symbol = new_symbolinput[msg.reqId] 
     dataStr = '%s, %s, %s' % (new_symbol, strftime("%Y-%m-%d", localtime(int(msg.date))), msg.close) 
     newDataList = newDataList + [dataStr] 
    else: 
     new_symbol = new_symbolinput[msg.reqId] 
     filename = 'minutetrades' + new_symbol + '.csv' 
     csvfile = open('IBdata/' + filename,'w') 
     for item in newDataList: 
      csvfile.write('{} \n'.format(item)) 
     csvfile.close() 
     newDataList = [] 
     global dataDownload 
     dataDownload.append(new_symbol) 


con = ibConnection(port=7496, clientId=222) 
con.register(historical_data_handler, message.historicalData) 
con.connect() 

symbol_id = 0 
for i in new_symbolinput: 
    print (i) 
    qqq = Contract() 
    qqq.m_symbol = i 
    qqq.m_secType = 'STK' 
    qqq.m_exchange = 'SMART' 
    qqq.m_currency = 'USD' 
    con.reqHistoricalData(symbol_id, qqq, '20161101', '1 W', '1 D', 'MIDPOINT', 1, 2) 

    symbol_id = symbol_id + 1 
    sleep(10) 

print (dataDownload) 
filename = 'downloaded_symbols.csv' 
csvfile = open('IBdata/' + filename,'w') 
for item in dataDownload: 
    csvfile.write('%s \n' % item) 
csvfile.close() 

これは、CSVファイルのデータを返す必要があります。 csvファイルが作成されましたが、空です。

応答:

Server Version: 76 
TWS Time at connection:20170315 14:18:06 CET 
AAPL 
[] 

だから、はっきり何も返しません。

スクリプト2:

from time import sleep, strftime 
from ib.ext.Contract import Contract 
from ib.opt import ibConnection, message 

def my_account_handler(msg): 
    print(msg) 

def my_tick_handler(msg): 
    print(msg) 

def my_hist_data_handler(msg): 
    print(msg) 


if __name__ == '__main__': 

    con = ibConnection(port=7496,clientId=222) 
    con.register(my_account_handler, 'UpdateAccountValue') 
    con.register(my_tick_handler, message.tickSize, message.tickPrice) 
    con.register(my_hist_data_handler, message.historicalData) 
    con.connect() 

    print(con.isConnected()) 

    def inner(): 

     qqqq = Contract() 
     qqqq.m_secType = "STK" 
     qqqq.m_symbol = "AAPL" 
     qqqq.m_currency = "USD" 
     qqqq.m_exchange = "SMART" 
     endtime = strftime('%Y%m%d %H:%M:%S') 
     print(endtime) 
     print(con.reqHistoricalData(1,qqqq,endtime,"1 W","1 D","MIDPOINT",1,2)) 



    sleep(10) 

    inner() 
    sleep(5) 
    print('disconnected', con.disconnect()) 
    print(con.isConnected()) 

ここ応答:

Server Version: 76 
TWS Time at connection:20170315 14:29:53 CET 
True 
20170315 14:30:05 
None 
('disconnected', True) 
False 

ここでも何も返されません。それは他の人のために働くように思えるように、なぜ私は考えがありません。私はPythonには全く新しいので、何か基本的なものを見逃しているかもしれません。

ご協力いただきありがとうございます。

答えて

0

エラーハンドラを常に実装してください.APIによって何が問題なのかがわかります。この場合、バーサイズに「1日」を使用します。

寝る必要はありません。接続の準備が整ったら、nextValidIdを使用してください。あなたが終わった時を知るには、さまざまな終わりの方法を使います。 historicalDataEndはまだIBpyで実装されていないようですので、「完了」を探してください

TWSとの間で送受信されるすべてのメッセージと同様に、エラーも表示されます。ログファイル内のマーケットデータは、かなり多くの場合、シャットオフすることができます。あなたのjtsディレクトリにあるファイル 'api.222.Wed.log'を探します。

from time import sleep, strftime 
from ib.ext.Contract import Contract 
from ib.opt import ibConnection, message 
import pandas as pd 
import numpy as np 

def nextValidId_handler(msg): 
    print(msg) 
    inner() 

hist = [] 

def my_hist_data_handler(msg): 
    print(msg) 
    if "finished" in msg.date: 
     print('disconnecting', con.disconnect()) 
     df = df = pd.DataFrame(index=np.arange(0, len(hist)), columns=('date', 'close', 'volume')) 
     for index, msg in enumerate(hist): 
      df.loc[index,'date':'volume'] = msg.date, msg.close, msg.volume 
     print(df) 
    else: 
     hist.append(msg)  

def error_handler(msg): 
    print(msg) 

if __name__ == '__main__': 

    con = ibConnection(port=7497,clientId=222) 
    con.register(error_handler, message.Error) 
    con.register(nextValidId_handler, message.nextValidId) 
    con.register(my_hist_data_handler, message.historicalData) 
    con.connect() 

    print(con.isConnected()) 

    def inner(): 

     qqqq = Contract() 
     qqqq.m_secType = "STK" 
     qqqq.m_symbol = "AAPL" 
     qqqq.m_currency = "USD" 
     qqqq.m_exchange = "SMART" 
     endtime = strftime('%Y%m%d %H:%M:%S') 
     print(endtime) 
     con.reqHistoricalData(1,qqqq,endtime,"1 W","1 day","MIDPOINT",1,2) 

    print(con.isConnected()) 
+0

ありがとうございます! – Emjora

+0

あまりにも私は望んでいないが、誰かがpd.DataFrameに出力をどのように得るのかについての洞察を提供できるだろうか? – Emjora

+0

@JohanEmilRasmussen他にあなたのコメントが表示されます。別の質問をする必要があります。私は例を使って答えを編集しましたが、私はPythonを使用しません。 Pythonの基礎を最初に学ぶべきです。 – brian

関連する問題