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()
    启动消息循环
  • 在回调中接收市场数据快照
  • 消息循环旋转。。。但是没有什么新消息,因为请求是为了快照
  • …对于如何将新请求排队到旋转的消息循环中,是否存在一种公认的习惯用法?如何做到这一点?我的想法是:

    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()
    

    c、 ,或d。取决于你的想法。下面是一个使用c的示例。方法用d。(线程)注释掉。c、 ,或d。取决于你的想法。下面是一个使用c的示例。方法用d。(线程)注释掉。