跳转到内容

停牌与复牌 Tick

逐笔数据可能包含停牌与复牌相关事件。它们不是普通成交价格,策略和图表都应单独处理。

官方参考:Tick-by-Tick Data

项目一档行情 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)

不同标的、不同时间段不一定会出现停牌或复牌事件。没有事件不代表接口错误。

没有 AAPL 逐笔行情权限时,不会收到真实停牌/复牌逐笔事件:

ERROR=reqId=97901;type=Last;code=10089;msg=请求的市场数据对于API来说需要额外订阅。

实际项目要观察本页事件,需要选择一个有逐笔行情权限的账户,并最好选择确实发生过停牌或恢复交易的标的和时间段。