2017-03-22 11 views
1

インタラクティブブローカーのAPIとreqMktDataを使用してリアルタイムデータを受信する方法をテストしています。このアルゴリズムは無限のwhileループを介して実行され、スクリプトを停止するまでリアルタイムのストリーミングデータをリアルタイムで受け取ることができます。 私はそれを実行すると、以下のコードで指定されているように、コンソールにデータを連続的に印刷することになっています。しかし、何もは "私は現在のコマンドを停止"を押すまで印刷されます。それから私は、スクリプトの実行以来受け取ったすべてのデータからなる膨大なデータダンプを取得します。リアルタイムでコンソールにスクリプトが出力されない[PYTHON]

私はスクリプトの最初にsysをインポートし、各印刷後に出力をフラッシュする次のソリューションを試しました。しかし、これはどちらも動作しません:

import sys 
sys.stdout.flush() 

私はpython 2.7とスパイダーを使用しています - そして、Pythonにはかなり新しいです。

誰かが助けてくれることを願っています!どんな入力も大歓迎です。

スクリプト私がテストしている:私はインタラクティブブローカーのAPIについて何も知らないが、私の推測では、あなたのstart方法はの線に沿って何かに変更する必要があるということである

from ib.ext.Contract import Contract 
from ib.ext.Order import Order 
from ib.opt import Connection, message 
import pandas as pd 
import datetime as dt 


class AlgoSystem: 
    def __init__(self, symbol, qty, resample_interval, 
       averaging_period=5, port=7496): 
     self.client_id = 1 
     self.order_id = 1 
     self.qty = qty 
     self.symbol_id, self.symbol = 0, symbol 
     self.resample_interval = resample_interval 
     self.averaging_period = averaging_period 
     self.port = port 
     self.tws_conn = None 
     self.bid_price, self.ask_price = 0, 0 
     self.last_prices = pd.DataFrame(columns=[self.symbol_id]) 
     self.average_price = 0 
     self.account_code = None 

    def error_handler(self, msg): 
     if msg.typeName == "error" and msg.id != -1: 
      print "Server Error:", msg 


    def tick_event(self, msg): 
     if msg.field == 1: 
      self.bid_price = msg.price 
     elif msg.field == 2: 
      self.ask_price = msg.price 
     elif msg.field == 4: 
      self.last_prices.loc[dt.datetime.now()] = msg.price 
      resampled_prices = \ 
       self.last_prices.resample(self.resample_interval, 
              how='last', 
              fill_method="ffill") 
      self.average_price = resampled_prices.tail(
       self.averaging_period).mean()[0] 

     print dt.datetime.now(), "average:", self.average_price, \ 
      "bid:", self.bid_price, "ask:", self.ask_price 



    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 


    def request_market_data(self, symbol_id, symbol): 
     contract = self.create_contract(symbol, 
             'STK', 
             'SMART', 
             'SMART', 
             'USD') 
     self.tws_conn.reqMktData(symbol_id, contract, '', False) 
     time.sleep(1) 

    def cancel_market_data(self, symbol): 
     self.tws_conn.cancelMktData(symbol) 
     time.sleep(1) 


    def connect_to_tws(self): 
     self.tws_conn = Connection.create(port=self.port, 
              clientId=self.client_id) 
     self.tws_conn.connect() 

    def disconnect_from_tws(self): 
     if self.tws_conn is not None: 
      self.tws_conn.disconnect() 

    def register_callback_functions(self): 
     # Assign error handling function. 
     self.tws_conn.register(self.error_handler, 'Error') 

     # Register market data events. 
     self.tws_conn.register(self.tick_event, 
           message.tickPrice, 
           message.tickSize) 

    def start(self): 
     try: 
      self.connect_to_tws() 
      self.register_callback_functions() 
      self.request_market_data(self.symbol_id, self.symbol) 

      while True: 
       time.sleep(1) 

     except Exception, e: 
      print "Error:", e 
      self.cancel_market_data(self.symbol) 

     finally: 
      print "disconnected" 
      self.disconnect_from_tws() 

if __name__ == "__main__": 
    system = AlgoSystem("FB", 100, "30s", 5) 
    system.start() 

答えて

2

def start(self): 

    try: 
     self.connect_to_tws() 
     self.register_callback_functions() 
     while True: 
      self.request_market_data(self.symbol_id, self.symbol) 
      time.sleep(1) 

    except Exception, e: 
     print "Error:", e 
     self.cancel_market_data(self.symbol) 

    finally: 
     print "disconnected" 
     self.disconnect_from_tws() 

現在、あなたの無限ループは繰り返し眠っています。私はrequest_market_dataの中に入れてほしいと思います。 whileループ。

+0

こんにちは、ありがとうございました。ただし、この変更により、プログラムは継続的に接続し、データを取得して接続を切断します。 reqMktDataがオンになっているコードが1回だけ接続される前に、リアルタイムデータ用のスイッチとtick_eventがティック情報を含むすべての着信メッセージを処理するために作成されました。 – Emjora

+0

whileループの唯一のことは、 'time.sleep(1)'コマンドです。あなたがCtrl + Cを押すまでブロックされる理由です。データを収集するループの中に何かを置く必要があります。接続と切断を継続したくない場合は、ループの外に接続と切断のメソッドを置き、可能であれば 'request_market_data'メソッドをループの中に入れてください。 –

+0

@Emjoraが答えを編集しました –

関連する問題