期货和期权使用 watch_quote()。字段完整列表见 Quote 数据字典。无需手动轮询请求行情;由 wait_update() 推进订阅。
接口提供最新行情快照,一批更新中同一合约的中间行情可能被合并。不能将更新次数或 is_changing() 次数当作 Tick 数,也不能用两次快照重建完整价格路径。需要保存完整逐笔行情的场景不能依赖这个订阅接口。
订阅与读取#
quote = api.watch_quote(symbol)
while api.wait_update():
if quote.is_changing(["last_price", "volume"]):
q = quote.data()
print(q.symbol, q.last_price, q.volume, q.open_interest)按业务需要选择检测字段:"last_price" 检查价格变化,["bids", "asks"] 检查盘口变化,"timestamp" 检查行情时间变化。价格未变时,时间、成交量或盘口仍可能更新。volume、turnover 是当前交易日累计值,不是单次更新的增量。
初始值与缺失值#
尚未收到行情时,timestamp 为 0、trading_day 为空字符串,价格及数值字段可能是 math.nan,盘口可能为空。不要用 if q.last_price 判断价格有效性,应使用 math.isfinite()。
import math
import time
q = quote.data()
valid = q.timestamp > 0 and math.isfinite(q.last_price)
recent = valid and 0 <= time.time() * 1000 - q.timestamp <= 10_000
if recent:
print("有效且在示例 10 秒时效范围内", q.last_price)这里的 10 秒是示例策略阈值,不是 SDK 承诺。休市期间最新一笔行情本来就可能很旧;阈值应由实际场景决定。
盘口#
bids、asks 是 (价格, 数量) 的列表,档位数由实际行情提供,不保证固定五档。读取第一档前检查长度:
q = quote.data()
if q.bids:
bid_price, bid_volume = q.bids[0]
print("买一", bid_price, bid_volume)
if q.asks:
ask_price, ask_volume = q.asks[0]
print("卖一", ask_price, ask_volume)时间与断线#
行情 timestamp 为 Unix 毫秒,trading_day 为 YYYYMMDD 交易日。交易日可能与自然日不同。不要直接把毫秒当作 Python 时间戳秒。
断线重连保留最后一次快照,重连过程不等于获取到了新的数据。检查字段变化、时间戳及恢复后的可用数据再执行依赖行情的策略逻辑。更新循环内长时间计算或阻塞会延迟行情处理,见 更新模型。