在Ib Insync中取消Ticker行情流:无法获取有效tickId的问题
解决Insync中取消行情数据流的错误问题
你遇到的错误根源是把合约ID(conId)和行情请求ID(reqId)搞混了:
- 原生IB API需要手动指定reqId,但Insync会自动生成并管理这个请求ID,它和合约的conId完全是两码事。
- 你代码里用
ticker.contract.conId获取的是合约本身的ID,不是行情请求的标识,所以调用cancelMktData时会提示找不到对应reqId。
正确的两种解决方式:
方式1:直接用返回的Ticker对象取消
Insync的cancelMktData方法可以直接接收Ticker对象作为参数,不需要手动提取reqId:
from ib_insync import * ib = IB() ib.connect('127.0.0.1', 7496, clientId=5) instr = Stock(symbol='SPY', exchange='SMART', currency='USD') # 请求行情,得到ticker对象 ticker = ib.reqMktData(instr, snapshot=False, regulatorySnapshot=False) ib.sleep(1) # 打印行情数据 print(f"Last price: {ticker.last}") print(f"Bid: {ticker.bid}") print(f"Ask: {ticker.ask}") # 直接用ticker对象取消数据流 ib.cancelMktData(ticker) ib.disconnect()
方式2:手动指定并使用reqId
如果你想自己控制reqId,Insync的reqMktData支持传入reqId参数,取消时用同一个reqId即可:
from ib_insync import * ib = IB() ib.connect('127.0.0.1', 7496, clientId=5) instr = Stock(symbol='SPY', exchange='SMART', currency='USD') # 手动指定reqId custom_req_id = 1001 ticker = ib.reqMktData(instr, reqId=custom_req_id, snapshot=False, regulatorySnapshot=False) ib.sleep(1) print(f"Last price: {ticker.last}") print(f"Bid: {ticker.bid}") print(f"Ask: {ticker.ask}") # 用指定的reqId取消数据流 ib.cancelMktData(custom_req_id) ib.disconnect()
补充说明
如果还是想从Ticker对象里获取自动生成的reqId,可以直接用ticker.reqId,而不是ticker.contract.conId,这个才是Insync为该行情请求分配的标识ID。
内容的提问来源于stack exchange,提问作者Dan S
相关产品推荐
相关产品推荐

