断线之后你看到的盘口是错的:快照增量、序列号缺口与重连后的自检 图 1
断线之后你看到的盘口是错的:快照增量、序列号缺口与重连后的自检 · 图 1

程序化交易的事故现场里,有一类比宕机更隐蔽:断线恢复了,连接看着正常,价格也在跳,但本地拼出来的订单簿已经和交易所不同步。基于错误深度做的报价和判断,比没有数据更危险。本文讲行情推送为什么会以这种方式出错、交易所协议层面怎么防、以及重连之后下单之前应该走的自检动作。本文撰写于 2026 年 8 月,只讲通用机制,具体字段名以各平台接口文档为准。

先理解一条行情流是怎么组织的。主流交易所的盘口推送普遍采用快照加增量的模型:订阅某个交易对时,服务端先推一份完整的订单簿快照,此后只推变化量——哪一档增减了多少挂单量。客户端在内存里把增量一条条叠在快照上,维护一份本地订单簿。这个设计省带宽,但埋下两个失效面:快照到第一笔增量之间的变化会丢;任何一条增量丢失或乱序,之后的整份本地簿都会跟着偏移,而画面看起来依然「正常跳动」。

针对第二个失效面,协议普遍给推送流加了序列号:每条增量带递增序号,客户端发现序号不连续,就知道中间丢了包。发现缺口的标准动作不是继续叠数据,而是宣布本地簿作废,重新拉一份快照再来一遍订阅握手。OKX 等主流平台的接口文档里都明文描述了这套快照重取机制(各家字段名与触发条件不同,见其 API 文档),自己实现而没有做序号校验的客户端,等于把所有丢包都当成无事发生。

连接层的重连策略是第二道防线,也是最容易做坏的地方。断线后以最快速度疯狂重试订阅,在服务端恢复初期会形成重连风暴,挤占的正是刚恢复的服务;正确姿势是指数退避加重试抖动,把恢复压力摊平。退避的另一层意义在自身:断线期间的行情可能已经走出很远,重连成功的瞬间不要执行任何积压下来的策略信号,先丢弃断线窗口内的行情数据段,从新鲜快照开始重新决策。

行情流之外还有一条容易被忽略的通道:交易所对连接有空闲超时,行情平静的深夜你可能只是没收到推送,而不是断线。多数协议有心跳机制,客户端没收到心跳才判定连接失效并触发重连。自建程序如果连心跳都没实现,「很久没消息」和「连接已死」就永远混在一起,这比断线本身更难排查。

最后是恢复现场之后的三步自检,建议固化进代码而不是靠临场记忆。第一步,快照到手后立刻用 REST 深度接口拉一次当前盘口做交叉核对,两边档位量级对得上才继续——同一平台的推送与 REST 同源不同路,一次比对能抓住大部分同步错误。第二步,检查重连后是否发生了重复订阅:同一频道叠加两个订阅,增量会被应用两遍,订单簿直接失真,这是新手代码里出现频率最高的同步 bug 之一。第三步,核对频道参数,确认重连后订阅的还是原来的交易对、原来的档位深度,参数在重连逻辑里被默认值覆盖是隐蔽故障的经典来源。

对普通用户,这篇的现实意义是:如果某个交易工具在断网恢复后给出「过于精准」的盘口判断,尤其是显示深度异常厚实或异常薄的那一瞬间,更可信的解释是它还没和交易所对齐,而不是市场突变。给行情一个恢复期,是老手和新手的分水岭之一。

风险提示:本文仅解释行情接口的同步机制,不构成投资建议。基于延迟或失真行情数据执行交易可能造成损失,接口字段与机制以交易所官方文档为准。