停牌与复牌 Tick
逐笔数据可能包含停牌与复牌相关事件。它们不是普通成交价格,策略和图表都应单独处理。
官方参考:Tick-by-Tick Data
和一档行情 Halted 的区别
Section titled “和一档行情 Halted 的区别”| 项目 | 一档行情 Halted | 逐笔停牌/复牌 Tick |
|---|---|---|
| 接口 | reqMktData() | reqTickByTickData() |
| 用途 | 查看是否处于停牌状态 | 记录停牌、复牌事件流 |
| 典型回调 | tickGeneric() | 逐笔相关回调或属性 |
| 适合场景 | 风控状态判断 | 事件记录、图表标记 |
TWS API 10.15 以后,逐笔数据和历史逐笔数据都可能返回停牌 / 复牌相关属性。官方判定规则可以这样理解:
| 事件 | 典型特征 | 程序处理 |
|---|---|---|
| 停牌 | 价格为 0、数量为 0,并且 pastLimit 属性为真。 | 记录为停牌事件,不写入普通成交价。 |
| 复牌 | 价格为 0、数量为 0,并且紧跟在停牌事件之后。 | 记录为复牌事件,随后重新确认行情状态。 |
遇到停牌或复牌事件时,程序不要把它当作普通成交:
- 不要用停牌事件价格更新最新成交价。
- 不要用停牌事件触发普通成交策略。
- 应在日志中保留事件时间和原始字段。
- 恢复交易后重新确认行情和订单状态。
def tickByTickAllLast(self, reqId, tickType, time, price, size, tickAttribLast, exchange, specialConditions): """接收成交类逐笔数据,并保留特殊条件。""" row = { "reqId": reqId, "tickType": tickType, "time": time, "price": price, "size": size, "pastLimit": getattr(tickAttribLast, "pastLimit", None), "exchange": exchange, "specialConditions": specialConditions, } print(row)不同标的、不同时间段不一定会出现停牌或复牌事件。没有事件不代表接口错误。
参考边界样例
Section titled “参考边界样例”没有 AAPL 逐笔行情权限时,不会收到真实停牌/复牌逐笔事件:
ERROR=reqId=97901;type=Last;code=10089;msg=请求的市场数据对于API来说需要额外订阅。实际项目要观察本页事件,需要选择一个有逐笔行情权限的账户,并最好选择确实发生过停牌或恢复交易的标的和时间段。