跳转到内容

接收实时数据

一档行情不是在 reqMktData() 调用处直接返回。请求发出后,TWS 会把字段拆成多个回调推送给程序。

官方参考:Receiving Watchlist Data

回调中文说明
tickPrice()价格字段,例如买价、卖价、最新价。
tickSize()数量字段,例如买量、卖量、成交量。
tickString()字符串字段,例如部分 generic tick。
tickGeneric()通用数值字段。
marketDataType()返回行情类型:实时、冻结、延迟或延迟冻结。
tickReqParams()最小价格变动、BBO 交易所映射和快照权限。
tickSnapshotEnd()快照请求结束。
def tickPrice(self, reqId, tickType, price, attrib):
"""接收价格类行情。"""
print("价格更新", reqId, tickType, price)
def tickSize(self, reqId, tickType, size):
"""接收数量类行情。"""
print("数量更新", reqId, tickType, size)
def tickString(self, reqId, tickType, value):
"""接收字符串行情。"""
print("字符串更新", reqId, tickType, value)
def tickGeneric(self, reqId, tickType, value):
"""接收通用数值行情。"""
print("通用 tick 更新", reqId, tickType, value)

tickType 是字段编号。程序应根据编号判断这是买价、卖价、最新价、成交量还是其他字段。不同字段会走不同回调,不要假设所有行情都在 tickPrice()

更稳妥的方式是把原始 tickType 保存下来,之后再映射成中文字段名:

latest_ticks = {}
def tickPrice(self, reqId, tickType, price, attrib):
latest_ticks[(reqId, tickType)] = price

AAPL 一档行情请求返回了 tickReqParams(),但因为缺少行情权限,没有价格、数量、字符串或通用 tick 回调:

TICK_REQ_PARAMS=tickerId=97701;name=streaming;minTick=0.01;bboExchange=EMPTY;snapshotPermissions=0
PRICE_ROWS=0
SIZE_ROWS=0
STRING_ROWS=0
GENERIC_ROWS=0
ERROR=reqId=97701;name=streaming;code=10089;msg=请求的市场数据对于API来说需要额外订阅...:延迟市场数据可用。:AAPL NASDAQ.NMS/TOP/ALL
ERROR=reqId=97701;name=streaming;code=300;msg=无法使用tickerId找到EId::97701

这类结果说明消息线程能工作,但行情数据被权限拦住。

回调里只做轻量处理,例如更新缓存、写入队列或记录日志。不要在回调里做耗时计算、网络请求或阻塞等待,否则可能影响后续消息处理。