2017-06-05 16 views
0

私は、IB API WrapperとClientストリームを使用する方法を理解していません。私は、クライアントストリームを介してIBサーバーにリクエストを送信していることを理解していますが、Wrapperストリームを介して応答を受信して​​いますが、私は「pを押す」などのユーザー用のメニューを実装できるようにしたいと考えています、等。サーバーの応答と別のアクションのプロンプトが表示されます。IB APIで応答を受信中にリクエストを送信する方法は?

from ibapi import wrapper 
from ibapi.client import EClient 
from ibapi.utils import iswrapper 

# types 
from ibapi.common import * 
from ibapi.contract import * 


class TestClient(EClient): 
    def __init__(self, wrapper): 
     EClient.__init__(self, wrapper) 


class TestWrapper(wrapper.EWrapper): 
    def __init__(self): 
     wrapper.EWrapper.__init__(self) 


class TestApp(TestWrapper, TestClient): 
    def __init__(self): 
     TestWrapper.__init__(self) 
     TestClient.__init__(self, wrapper=self) 

    def position(self, account: str, contract: Contract, position: float, 
       avgCost: float): 
     """This event returns real-time positions for all accounts in 
     response to the reqPositions() method.""" 

     super().position(account, contract, position, avgCost) 
     print("Position.", account, "Symbol:", contract.symbol, "SecType:", 
       contract.secType, "Currency:", contract.currency, 
       "Position:", position, "Avg cost:", avgCost) 


def main(): 
    app = TestApp() 
    usr_in = '' 

    app.connect("127.0.0.1", 7497, clientId=0) 
    print("serverVersion:%s connectionTime:%s" % (app.serverVersion(), 
               app.twsConnectionTime())) 

    while(usr_in != 'exit'): 
     usr_in = input('What to do next?') 
     if usr_in == 'p': 
      app.reqPositions() 

    app.run() 

if __name__ == '__main__': 
    main() 

今何が起こってしまい、プログラムが入力を要求するということですが、私はそれが応答を表示した後にループを終了するまで、サーバの応答を表示しません。私はposition()関数内にいくつかのロジックを含めることができますが、これは非常に制限されており、2つのストリームとやり取りするためのより良い方法が必要です。また、IB APIで使用されているようなストリームのトピックに関するそれ以上の読み取り値へのポインタは、非常に高く評価されます。

答えて

0

私はそれを理解しました! 2つのスレッドを開始するだけです。 1つはEClientのrun()関数を処理し、もう1つはアプリケーションのループ関数を実行します。コードは次のようになります。

from ibapi import wrapper 
from ibapi.client import EClient 
from ibapi.contract import * 

import threading 
import time 


class TestApp(wrapper.EWrapper, EClient): 
    def __init__(self): 
     wrapper.EWrapper.__init__(self) 
     EClient.__init__(self, wrapper=self) 

     self.connect("127.0.0.1", 7497, clientId=0) 
     print(f"serverVersion:{self.serverVersion()} 
       connectionTime:{self.twsConnectionTime()}") 

    def position(self, account: str, contract: Contract, position: float, 
       avgCost: float): 
     """This event returns real-time positions for all accounts in 
     response to the reqPositions() method.""" 

     super().position(account, contract, position, avgCost) 
     print("Position.", account, "Symbol:", contract.symbol, "SecType:", 
       contract.secType, "Currency:", contract.currency, 
       "Position:", position, "Avg cost:", avgCost) 

    def loop(self): 
     while True: 
      self.reqPositions() 
      time.sleep(15) 


def main(): 
    app = TestApp() 

    reader_thread = threading.Thread(target=app.run) 
    loop_thread = threading.Thread(target=app.loop) 

    reader_thread.start() 
    loop_thread.start() 

if __name__ == '__main__': 
    main() 
関連する問題