reqMktData()如何在app.run()调用后提交新的快照请求?

2024-06-29 01:12:04 发布

您现在位置:Python中文网/ 问答频道 /正文

在调用了app.run()并且消息循环正在旋转之后,新的reqMktData()请求如何排队

来自TWS API的少量后台快照市场数据请求遵循以下模式:

  1. 创建合同对象
  2. 调用reqMktData()来排队请求,传入合同对象
  3. 调用app.run()以启动消息循环
  4. 在回调中接收市场数据快照
  5. 消息循环旋转。。。但是没有什么新消息,因为请求是为了快照

…对于如何将新请求排队到旋转的消息循环中,是否存在一种公认的习惯用法?如何做到这一点?我的想法是:

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

Tags: runselftrueapp消息市场maindef