2017-12-06 5 views
0

私は複数の株式の特定の時間枠で価格行動をスクリーニングするための株式スクリーナを開発しようとしています。したがって、十分なメモリバッファを備えた複数の計測器でIBからデータを引き出すことを自動化する必要があります。インタラクティブブローカーPython API接続バッファー

私はスクリプトを一度しか実行しないとサーバーをスムーズに接続できません。

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のコアコードを編集する必要はありません)

私はAPIサポートのためにIBのカスタマーサービスに連絡しようとしましたが、エラーコードがないため無駄でした。

以下は、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

私はIBpyライブラリを毎日使用していますが、バッファサイズに問題はありませんでした。 あなたの環境(OS、CPU、RAM)についてもっと教えてください。 IBpyで動作する他の例はありましたか?

IBとのコミュニケーションは簡単ではありませんが、エラーが発生した場所を知り、メッセージでIBに具体的な情報を送信することで、友好的にお手伝いします。print("Line xx works")