3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 ptrade 量化交易平台中,调用 get_snapshot 获取实时行情快照时,如果发现返回的 hsTimeStamp(时间戳)与本地时间相差十几秒,通常是由以下几个原因造成的。以下是详细的原因分析与排查建议:
原因分析:hsTimeStamp 是交易所下发并由柜台记录的行情时间,代表的是交易所的标准时间。如果您运行策略的本地服务器(或个人电脑)系统时间没有与互联网标准时间(NTP)同步,就会导致本地时间与行情时间出现巨大的差值。十几秒的误差绝大多数情况下是因为本地时钟走时不准。
解决办法:
ntpdate 或 chrony 服务同步标准时间服务器(如 ntp.aliyun.com)。原因分析:普通的 A 股 Level-1 行情本身就是切片快照,交易所大约每 3 秒下发一次。这意味着即使网络毫无延迟,您获取到的数据也可能是几秒钟前的状态。如果遇到极端行情或网络波动,切片下发可能会有轻微积压,但通常不会高达十几秒。
原因分析:请检查您调用 get_snapshot 的时间点。如果在盘前(如 9:15-9:25)、午休(11:30-13:00)或盘后(15:00之后)调用,交易所的行情是不更新的。此时 hsTimeStamp 会停留在该阶段的最后一笔快照时间,从而与您不断流逝的本地时间产生越来越大的差值。
解决办法:确保在 09:30:00 - 11:30:00 和 13:00:00 - 15:00:00 的连续竞价时段内评估时间延迟。
原因分析:行情数据从交易所 -> 券商机房 -> ptrade 行情服务器 -> 您的策略进程,需要经过多层链路。如果券商的 ptrade 服务器当前负载极高,或者您在策略中使用了阻塞式的同步代码(如长时间的 time.sleep 或复杂的死循环计算),可能导致策略未能及时处理最新的行情推送,拿到的依然是缓存中的旧数据。
解决办法:
handle_data 或 run_interval 中执行耗时过长的同步操作。tick_data 函数获取毫秒级的逐笔数据,或者使用 on_order_response / on_trade_response 接收主推回报。hsTimeStamp 和 datetime.datetime.now(),确认测试时间是否在盘中连续竞价阶段。