私は、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で使用されているようなストリームのトピックに関するそれ以上の読み取り値へのポインタは、非常に高く評価されます。