使用IB API Python请求快照无输出,需添加print方法吗?
解决Interactive Brokers API快照价格无输出的问题
兄弟,你猜的没错——确实得加对应的处理逻辑,而且不止是随便加个print,得先搞懂IB API的异步回调模式:你发送请求后,API不会直接给你返回结果,而是通过预先定义的回调函数把数据推送给你。你现在的TestApp类只是继承了EWrapper和EClient,但没有重写处理市场数据的回调方法,所以控制台自然啥都看不到。
给你改好代码,我会把关键地方说明白:
from ibapi.client import EClient from ibapi.wrapper import EWrapper from ibapi.contract import Contract import time class TestApp(EWrapper, EClient): def __init__(self): EClient.__init__(self, self) # 初始化EClient,把当前实例作为回调的wrapper # 重写tickPrice回调:API返回价格数据时会触发这个方法 def tickPrice(self, reqId: int, tickType: int, price: float, attrib: TickAttrib): # 这里把数据打印出来,你也可以改成存到变量或者文件里 print(f"请求ID: {reqId}, 报价类型: {tickType}, 价格: {price}") # 重写tickSize回调:API返回成交量、持仓量这类数据时触发 def tickSize(self, reqId: int, tickType: int, size: int): print(f"请求ID: {reqId}, 报价类型: {tickType}, 数量: {size}") # 可选但很有用:重写error方法,打印错误信息,方便排查问题 def error(self, reqId: int, errorCode: int, errorString: str): print(f"错误提示 | ID: {reqId}, 码: {errorCode}, 信息: {errorString}") # 创建连接实例并连接TWS/IB网关 my_connection = TestApp() my_connection.connect("127.0.0.1", 7497, 0) # 修正合约的属性错误:IB要求合约月份是YYYYMM格式,不是JUN18 ym = Contract() ym.symbol = "YM" ym.secType = "FUT" ym.lastTradeDateOrContractMonth = "201806" # 这里改对格式 ym.primaryExchange = "ECBOT" ym.currency = "USD" # 发送快照请求 my_connection.reqMktData(1000, contract=ym, genericTickList="9", snapshot=True, regulatorySnapshot=False, mktDataOptions=[]) # 关键:程序要保持运行等待回调,不然发送请求后直接退出,根本收不到数据 time.sleep(5) # 快照数据很快就能收到,等5秒足够 my_connection.disconnect()
几个必须注意的点:
- 回调方法必须重写:
EWrapper类里的tickPrice、tickSize这些方法都是空的,API返回数据时会调用它们,你得自己实现打印/存储逻辑。 - 合约格式要正确:你之前写的
ContractMonth是错的,正确属性名是lastTradeDateOrContractMonth,而且格式必须是YYYYMM(比如201806),API才能识别到合约。 - 要等待回调:Python程序默认会执行完所有代码就退出,加
time.sleep是最简单的让程序保持运行的方式,等API返回快照数据后再断开连接。
内容的提问来源于stack exchange,提问作者kambino
相关产品推荐
相关产品推荐

