【发布时间】:2017-12-06 04:27:34
【问题描述】:
我正在尝试开发一种股票筛选器,用于在特定时间范围内筛选多只股票的价格行为。因此,我需要在具有足够内存缓冲区的多个工具上自动从 IB 提取数据。
如果我只运行一次脚本就可以顺利连接服务器。
TWS Time at connection:20171206 12:00:11 CST
连接成功后,我用ibpy拉出历史数据。数据下载成功,没有问题。 但是,当我再次尝试从具有相同设置的同一仪器中提取数据时。
TWS Time at connection:20171206 12:00:11 CST
Server Error: <error id=None, errorCode=None, errorMsg=unpack requires a buffer of 1 bytes>
我不确定如何分配内存缓冲区来执行此任务。我是 Python 的新手,对缓冲区分配一无所知。请以超级简单的语言提供解决服务器错误的建议。提前感谢您的帮助和努力!! (理想情况下,为了我更容易理解,无需深入编辑ibpy核心代码)
我尝试联系 IB 客户服务以获取 API 支持,但由于缺少错误代码而无济于事。
这里是与IB的连接相关的代码。
def connect_to_tws(self):
self.tws_conn = Connection.create(port=7497, clientId=5)
self.tws_conn.connect()
self.register_callback_functions()
def contract_creation(self):
self.listbox1.delete(0,END) # clears contents of the listbox
self.tws_conn.cancelHistoricalData(5) #cancels historical data
mySymbol = self.input.symbol # get the symbol from the combobox
contract = self.create_contract(mySymbol,
'STK', # security STK = stock
'SEHK', # exchange
'',# primary exchange
'HKD') # currency
duration = self.input.duration # get the duration ie. 1 D, 1 M, 1 Y
bar_size = self.input.barsize # get the bar size ie. 5 mins, 2 mins, 1 day
self.tws_conn.reqHistoricalData(tickerId = 5, # contract number can be any number
contract=contract, # contract detail from about
endDateTime=self.input.now, # end date and time
durationStr=duration,
barSizeSetting=bar_size,
whatToShow='TRADES', # what to show ie. MIDPOINT, BID, ASK,
useRTH=1, # Regular trading hours 1 = RTH, 0 = all data
formatDate=1) # 1 = 20161021 09:30:00 2 = Unix time (Epoch)
def register_callback_functions(self):
# Assign server messages handling function.
self.tws_conn.registerAll(self.server_handler)
# Assign error handling function.
self.tws_conn.register(self.error_handler, 'Error')
def error_handler(self, msg):
if msg.typeName == 'error'and msg.id != -1:
print ('Server Error:', msg)
def server_handler(self, msg):
if msg.typeName == 'historicalData':
hd_date = msg.date
hd_open = msg.open
hd_high = msg.high
hd_low = msg.low
hd_close = msg.close
hd_volume = msg.volume
str_date = str(hd_date)
str_open = str(hd_open)
str_high = str(hd_high)
str_low = str(hd_low)
str_close = str(hd_close)
str_volume = str(hd_volume)
# creates a string containing date, open, high, low, close, volume
priceData2 = hd_date+","+str_open+","+str_high+","+str_low+","+str_close+","+str_volume
if 'finished' in hd_date:
pass
else:
str_data = hd_date, hd_open, hd_high, hd_low, hd_close, hd_volume
print (str_data) # prints info to the Python shell
self.listbox1.insert(END, priceData2) # adds info to the listbox
elif msg.typeName == "error" and msg.id != -1:
return
def create_contract(self, symbol, sec_type, exch, prim_exch, curr):
contract = Contract()
contract.m_symbol = symbol
contract.m_secType = sec_type
contract.m_exchange = exch
contract.m_primaryExch = prim_exch
contract.m_currency = curr
return contract
【问题讨论】:
-
提取历史数据时同样的问题。虽然当我尝试提取大量历史数据时会特别出现错误消息。正在尝试识别特定实例...
-
我可以提取 2 M 的 1 分钟柱数据,但尝试提取 3 M 的 1 分钟柱数据会导致此错误:服务器错误:解包需要 1 个字节的缓冲区
标签: python api interactive-brokers ibpy