我从http://godelsmarket.blogspot.co.uk/2012/07/non-gui-ib-historical-data-downloader.html改编了以下代码。我想下载MMM的20151001的价格数据。
from time import sleep, strftime, localtime
from ib.ext.Contract import Contract
from ib.opt import ibConnection, message
new_symbolinput = ['MMM']
newDataList = []
dataDownload = []
def historical_data_handler(msg):
global newDataList
#print msg.reqId, msg.date, msg.open, msg.high, msg.low, msg.close, msg.volume
if ('finished' in str(msg.date)) == False:
new_symbol = new_symbolinput[msg.reqId]
dataStr = '%s, %s, %s, %s, %s, %s, %s' % (new_symbol, strftime("%Y-%m-%d %H:%M:%S", localtime(int(msg.date))), msg.open, msg.high, msg.low, msg.close, msg.volume)
newDataList = newDataList + [dataStr]
else:
new_symbol = new_symbolinput[msg.reqId]
filename = 'minutetrades' + new_symbol + '.csv'
csvfile = open('csv_day_test/' + filename,'wb')
for item in newDataList:
csvfile.write('%s n' % item)
csvfile.close()
newDataList = []
global dataDownload
dataDownload.append(new_symbol)
con = ibConnection()
con.register(historical_data_handler, message.historicalData)
print(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, '20151001', '1 D', '1 min', 'TRADES', 1, 2)
symbol_id = symbol_id + 1
sleep(0.5)
print (dataDownload)
但是,我得到的输出在末尾产生一个空数据列表:
Server Version: 68
TWS Time at connection:20151004 09:30:11 EST
True
MMM
[]
我做错了什么?谢谢!
首先应该为错误注册一个处理程序,否则为所有其他消息注册一个处理程序。
def watchAll(msg):
print(msg)
con = ibConnection()
con.registerAll(watchAll)
con.unregister(watchAll, message.historicalData)
con.register(historical_data_handler, message.historicalData)
那么你会得到一个错误,说你的日期时间格式是错误的。更改为20151001 00:00:00
。您可以添加时区。
csvfile.write('%s n' % item)
不能在python3中工作,请使用csvfile.write(bytes('%s n' % item,'UTF-8'))
并确保您创建了目录。但是这种二进制写入需要pythonista来检查。
你把睡眠时间从10改为0.5。这对你来说是可行的,因为你只需要一个符号,但10个符号可能是为了消除节奏错误。你每分钟可以请求的数据量是有限的。
变量名称qqq是陌生的。它一定是从某人下载符号qqq的例子中复制的。您应该将其重命名为contract
。