使用IBpy下载股票价格数据

时间:2015-10-04 13:32:01

标签: python ibpy

我从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
[]

我做错了什么?谢谢!

1 个答案:

答案 0 :(得分:1)

首先,您应该为错误注册处理程序,或者为所有其他消息注册一个处理程序。

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可能是为了消除起搏错误。您可以限制每分钟可以提出的大量数据。

var名称qqq很奇怪。必须从有人下载符号qqq的示例中复制它。您应该将其重命名为contract