接收实时数据
一档行情不是在 reqMktData() 调用处直接返回。请求发出后,TWS 会把字段拆成多个回调推送给程序。
| 回调 | 中文说明 |
|---|---|
tickPrice() | 价格字段,例如买价、卖价、最新价。 |
tickSize() | 数量字段,例如买量、卖量、成交量。 |
tickString() | 字符串字段,例如部分 generic tick。 |
tickGeneric() | 通用数值字段。 |
marketDataType() | 返回行情类型:实时、冻结、延迟或延迟冻结。 |
tickReqParams() | 最小价格变动、BBO 交易所映射和快照权限。 |
tickSnapshotEnd() | 快照请求结束。 |
Python 示例
Section titled “Python 示例”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 怎么理解
Section titled “tickType 怎么理解”tickType 是字段编号。程序应根据编号判断这是买价、卖价、最新价、成交量还是其他字段。不同字段会走不同回调,不要假设所有行情都在 tickPrice()。
更稳妥的方式是把原始 tickType 保存下来,之后再映射成中文字段名:
latest_ticks = {}
def tickPrice(self, reqId, tickType, price, attrib): latest_ticks[(reqId, tickType)] = price参考边界样例
Section titled “参考边界样例”AAPL 一档行情请求返回了 tickReqParams(),但因为缺少行情权限,没有价格、数量、字符串或通用 tick 回调:
TICK_REQ_PARAMS=tickerId=97701;name=streaming;minTick=0.01;bboExchange=EMPTY;snapshotPermissions=0PRICE_ROWS=0SIZE_ROWS=0STRING_ROWS=0GENERIC_ROWS=0ERROR=reqId=97701;name=streaming;code=10089;msg=请求的市场数据对于API来说需要额外订阅...:延迟市场数据可用。:AAPL NASDAQ.NMS/TOP/ALLERROR=reqId=97701;name=streaming;code=300;msg=无法使用tickerId找到EId::97701这类结果说明消息线程能工作,但行情数据被权限拦住。
回调里只做轻量处理,例如更新缓存、写入队列或记录日志。不要在回调里做耗时计算、网络请求或阻塞等待,否则可能影响后续消息处理。