在调用了app.run()
并且消息循环正在旋转之后,新的reqMktData()
请求如何排队
来自TWS API的少量后台快照市场数据请求遵循以下模式:
reqMktData()
来排队请求,传入合同对象app.run()
以启动消息循环…对于如何将新请求排队到旋转的消息循环中,是否存在一种公认的习惯用法?如何做到这一点?我的想法是:
a。侵入app.run
方法(在client.py
),添加过期计时器,并为每个新请求重新调用app.run()
。Meh.
B生成一个单独的线程,以便对新请求进行排队
C在回调函数中对新请求进行排队(此处,tickprice
)
D在单独的线程中调用app.run()
,在主线程中调用reqMktData()
新请求
Tyvm,基思:^)
最小、可验证且完整的示例
import ...
class Goose(EWrapper, EClient):
def __init__(self):
EClient.__init__(self, self)
def error(self, reqId, errorCode, errorString):
print("Error: ", reqId, " ", errorCode, " ", errorString)
@iswrapper
# ! [tickprice]
def tickPrice(self, reqId: TickerId, tickType: TickType, price: float,
attrib: TickAttrib):
super().tickPrice(reqId, tickType, price, attrib)
print(f"~~> {reqId}, {tickType}, {price}")
def main():
app = Goose()
app.connect("127.0.0.1", 7496, 0)
print("serverVersion:%s connectionTime:%s" % (app.serverVersion(), app.twsConnectionTime()))
a = Contract()
a.symbol = "AAPL"
a.secType = "STK"
a.exchange = "SMART"
a.currency = "USD"
a.primaryExchange = "NASDAQ"
# Queue request. Note "True" setting for MD snapshot (not streaming)
app.reqMktData(1000, a, "", True, False, [])
# Enter event loop
app.run()
# Sleep 3 seconds, then make a request for MSFT data.
# NEVER EXECUTES - Main thread with app.run() event loop spinning.
time.sleep(3)
m = Contract()
m.symbol = "AAPL"
m.secType = "STK"
m.exchange = "SMART"
m.currency = "USD"
m.primaryExchange = "NASDAQ"
app.reqMktData(1001, m, "", True, False, [])
if __name__ == "__main__":
main()
目前没有回答
相关问题 更多 >
编程相关推荐