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には全く新しいので、何か基本的なものを見逃しているかもしれません。
ご協力いただきありがとうございます。
ありがとうございます! – Emjora
あまりにも私は望んでいないが、誰かがpd.DataFrameに出力をどのように得るのかについての洞察を提供できるだろうか? – Emjora
@JohanEmilRasmussen他にあなたのコメントが表示されます。別の質問をする必要があります。私は例を使って答えを編集しましたが、私はPythonを使用しません。 Pythonの基礎を最初に学ぶべきです。 – brian