Python reqMktData()-如何在app.run()调用后提交新的快照请求?
调用Python reqMktData()-如何在app.run()调用后提交新的快照请求?,python,interactive-brokers,Python,Interactive Brokers,调用app.run()后,新的reqMktData()请求如何排队,并且消息循环正在旋转 来自TWS API的少量后台快照市场数据请求遵循以下模式: 创建合同对象 调用reqMktData()将请求排队,传入合同对象 调用app.run()启动消息循环 在回调中接收市场数据快照 消息循环旋转。。。但是没有什么新消息,因为请求是为了快照 …对于如何将新请求排队到旋转的消息循环中,是否存在一种公认的习惯用法?如何做到这一点?我的想法是: a。侵入app.run方法(在client.py中),添加过期
app.run()
后,新的reqMktData()
请求如何排队,并且消息循环正在旋转
来自TWS API的少量后台快照市场数据请求遵循以下模式:
reqMktData()
将请求排队,传入合同对象app.run()
启动消息循环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()
c、 ,或d。取决于你的想法。下面是一个使用c的示例。方法用d。(线程)注释掉。c、 ,或d。取决于你的想法。下面是一个使用c的示例。方法用d。(线程)注释掉。