问题描述
/
解决方案
在 ptrade 量化交易平台中,策略获取行情快照(get_snapshot)的时间与快照本身的时间戳存在几秒钟的差异(如9:30:12的快照在9:30:17才获取到),通常是由以下几个机制综合作用导致的:
1. 策略运行周期的错位
get_snapshot 是一个主动查询接口,它返回的是调用瞬间 ptrade 引擎缓存的最新快照。策略能否及时获取到,取决于策略的触发频率:
run_interval定时触发:如果策略使用run_interval(context, func, seconds=5)每5秒执行一次,假设策略在 9:30:12.000 触发,而交易所 9:30:12 的快照在 9:30:12.500 才到达 ptrade 引擎,那么这次触发获取到的将是上一个快照(如 9:30:09)。直到下一次触发(9:30:17),策略才会拿到时间戳为 9:30:12 的快照。tick_data触发:tick_data最小频率为3秒一次。如果 tick 触发的时间点刚好与快照到达的时间点错开,也会出现类似的延迟现象。
2. 行情链路的传输与处理延迟
交易所的快照数据(Level 1 通常为3秒一笔)生成后,需要经过以下链路才能到达您的策略:
交易所 -> 券商行情网关 -> ptrade 行情接收端 -> ptrade 策略引擎 -> 策略代码
- 开盘高峰期拥堵:9:30:00 - 9:30:15 是全天数据量最大、订单最密集的时段。网络传输、柜台处理以及 ptrade 引擎的内部队列在此时可能会出现短暂的微秒到毫秒级排队,导致快照到达引擎的时间晚于其生成的时间戳。
3. 缓存更新机制
ptrade 引擎在后台不断接收行情并更新缓存。当您调用 get_snapshot 时,引擎直接返回当前缓存中的数据。如果 9:30:12 的快照因为网络原因在 9:30:14 才更新到缓存,而您的策略在 9:30:17 才发起查询,您看到的就是带有 9:30:12 时间戳的数据。
优化建议
如果您对行情的实时性要求极高(如高频或打板策略),建议采取以下优化措施:
- 使用
tick_data替代主动轮询:tick_data是基于事件驱动的,当有新的 tick 数据到达时会触发(最小间隔3秒),其参数data[security]['tick']中包含了最新的 tick 信息,通常比定时调用get_snapshot更及时。 - 结合主推事件:利用
on_order_response和on_trade_response来处理订单状态,不要依赖轮询快照来判断成交。 - 检查时间戳:在策略中获取快照后,务必检查快照字典中的
hsTimeStamp字段,判断该快照的时效性,避免使用过期数据做出错误的交易决策。