Interactive Brokers Python API连接缓冲区

时间:2017-12-06 04:27:34

标签: python api interactive-brokers ibpy

我正在尝试开发一个股票筛选器,用于在多个股票的特定时间范围内筛选价格行为。因此,我需要在具有足够内存缓冲区的多台仪器上自动从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        

1 个答案:

答案 0 :(得分:1)

I'm working with the IBpy-library every day and I never had problems with the buffer size. Maybe you'll tell us more about your environment (OS, CPU, RAM)? Did other examples with IBpy work?

The communication with IB isn't easy but with putting some print("Line xx works")you will know where the error occurs and by sending more concrete information to IB by message they'll help you friendly.