大家好,我在做行情可视化时碰到过这类现象:

  • 回调补数与实时推送交错;
  • 后到的旧 tick 把已经闭合的 bar 又改写;
  • 图表上出现「最后一根突然缩回去再蹦出去」。

想请教社区更稳妥的做法,并分享我用于定位的最小复现框架(与具体券商无关)。

最小复现构造

用本地模拟器按时间戳乱序喂入:

t1 open bar
t3 tick  (先到)
t2 tick  (后到,但时间更早)
t4 close bar

观察:

  1. bar 的 high/low 是否被旧 tick 污染;
  2. 已向 UI 提交的 snapshot 是否被 retrospectively 修改;
  3. 下游策略引擎看到的是「最终一致」还是「中间态」。

我目前的分层

  1. 入队按 exchange_time 排序缓冲(短窗口,比如 50–200ms),超时仍刷出;
  2. 已闭合 bar 只读;迟到数据进 revision 通道,UI 用标记显示「修正」而不是默默改历史;
  3. 图表层与策略层不要共享可变 bar 对象,避免一边在画、一边在改。

想确认的问题

  • 在 vn.py 生态里,大家更常用「排序缓冲」还是「直接覆盖 + 全量重算」?
  • 对高频品种,revision 通道有没有实践中的性能坑?

代码和密钥都不会贴;如果有人愿意,我可以补一个纯内存的 pytest 用例结构(假 gateway)。

谢谢。