🚀 AI 一键生成 ptrade 策略代码

ptrade 平台 get_snapshot 行情快照获取延迟原因解析

ptrade | 发布时间: 2026/5/28
以下内容由 EasyQuant 生成。

问题描述

客户反馈某代码9.30.12的快照在9.30.12策略没有获取到,在9.30.17才获取到?

/

解决方案

在 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 时间戳的数据。

优化建议

如果您对行情的实时性要求极高(如高频或打板策略),建议采取以下优化措施:

  1. 使用 tick_data 替代主动轮询tick_data 是基于事件驱动的,当有新的 tick 数据到达时会触发(最小间隔3秒),其参数 data[security]['tick'] 中包含了最新的 tick 信息,通常比定时调用 get_snapshot 更及时。
  2. 结合主推事件:利用 on_order_responseon_trade_response 来处理订单状态,不要依赖轮询快照来判断成交。
  3. 检查时间戳:在策略中获取快照后,务必检查快照字典中的 hsTimeStamp 字段,判断该快照的时效性,避免使用过期数据做出错误的交易决策。