跨交易所订单簿
热力图如何将 Binance、Bybit 与 OKX 永续合约深度合并为单一时间轴视图:数据源、归一化、时间对齐、边界场景、限制。
查看实时小部件: /perpetuals/order-book.
数据源
三家交易所数据源,仅公开深度流。无需 API 密钥。
- Binance USDT-M 永续合约。diff-stream WebSocket 加上冷启动时的 REST 快照,均位于期货端点。本地按序列校验的 L2 订单簿,每资产发布前 200 档。
- Bybit V5 线性永续合约。公开 WebSocket,
orderbook.<tier>.<SYMBOL>。在交易所支持的资产上使用 tier 200(目前 BTC、ETH、SOL),其余使用 tier 50。订阅时返回快照帧,采用单调递增的u增量,序列出现间隔时重新订阅强制刷新快照。 - OKX V5 SWAP。公开
books频道(400 档,无需鉴权),保留前 200 档。快照加更新帧通过每档的seqId/prevSeqId链接。我们曾考虑过逐笔变体,但它们需要我们未达到的 VIP 费率等级;见限制。 - 跟踪资产。BTC、ETH、SOL、BNB、XRP、DOGE。
归一化:价格与数量
跨交易所聚合只有在所有数据源使用相同单位时才有效。摄取阶段做两项调整,然后才到达聚合器。
数量转换为基础币。Binance 与 Bybit 直接以基础货币返回数量(BTC-USDT 永续以 BTC 计,等等)。OKX 以合约张数返回数量,其中一张合约对应 ctVal 单位的基础币。BTC-USDT-SWAP 的 ctVal = 0.01;DOGE-USDT-SWAP 为 1000。OKX 数据源在启动时从公开 instruments 端点解析 ctVal,并在发布前对每一档应用乘数。若没有此步骤,DOGE 深度在跨交易所视图中会被读成 1000 倍。
价格归入每资产桶。每家交易所的跳动单位略有不同;聚合器把价格向下舍入到最近的桶边界,使跨交易所相邻的跳动合并到同一面墙。每资产主桶大小:
btc: $1.0 eth: $0.10 sol: $0.05 bnb: $0.10 xrp: $0.001 doge: $0.0001
多桶视图
每个周期同一份原始深度都会被并行归入每资产两种桶大小:主跳动(上方)与 5× 更粗的变体。用户选择展示哪一种;热力图无需重新建立连接即可切换到正确的桶。
对于 BTC,这意味着一个 $1 视图(细粒度,在中价附近密集)和一个 $5 视图。在 $1 下每侧 200 个桶意味着热力图从中价覆盖 ±$200;$5 视图可达 ±$1 000,那里正是整数磁吸($79k / $80k / $81k)所在之处。同样逻辑按资产缩放:ETH 发布 $0.10 + $0.50,DOGE 发布 $0.0001 + $0.001。
聚合:求和 + 按交易所拆分
对每个桶,聚合器把三个数据源的数量相加,并保留每交易所的贡献与总量并列。这使 UI 能渲染单行墙,并在悬停时显示堆叠分解,无需第二次往返。
for src in (binance, bybit, okx):
for (price, qty_base) in src.depth.bids:
bucket = floor(price / BUCKET_SIZE) × BUCKET_SIZE
bid_buckets[bucket].total += qty_base
bid_buckets[bucket].by[src] += qty_base
# asks: 相同,然后按价格升序
top_bids = sorted(bid_buckets, by price desc)[:200]
top_asks = sorted(ask_buckets, by price asc)[:200]输出 payload 单独包含数据源列表与每交易所的最佳买价/最佳卖价。我们不暴露单一的合并最佳买卖价;见限制。
节奏与 spoof 解析
聚合器以 10 Hz 发布(每 ~100 ms 一个快照)。生产者数据源写入可达 ~20 Hz,但约束在于交易所推送速率(原生 ~50-100 ms)。
在热力图 100 ms 的单元宽度下,墙与 spoof 的呈现如下:
- spoof ≥ 100 ms → 1 个可见单元(边界检测)。
- spoof ≥ 200 ms → 2 个可见单元(可靠)。
- spoof ≥ 500 ms → 5 个单元,呈现为清晰的垂直斑点。
- 持续数秒的墙 → 跨越多单元的水平涂抹。
100 ms 以下的 spoof 无法检测。这需要三家交易所对我们的访问层级均锁定的逐笔(TBT)频道。
时间对齐
每个生产者从其原生深度流中提取交易所事件时间戳(Binance 的 E 字段、Bybit 的顶级 ts、OKX 的每档 ts),并与生产者自身的发布时间一同传播。
在聚合器,每个快照都暴露按数据源的事件时间戳以及跨交易所偏斜(在 OK 状态数据源之间事件时间的最大减最小)。热力图快照 ts仍是聚合器的轮询时刻,以便时间线均匀间隔;偏斜在 ≥ 100 ms 时显示在工具提示中(≥ 300 ms 为红色),使单元格中的“共识”诚实地有界。
典型观测偏斜:稳态下 < 100 ms;在某一交易所数据源短暂滞后的基差紧张时刻,峰值至 300-500 ms。如果没有这种归因,在 Binance 于 T+0、在 Bybit 于 T+200 ms 出现的墙会被读作单一瞬时共识,而它并不是。
过期处理
每个生产者写入其数据源键,带 60 秒 TTL 与一个时间戳。聚合器在每个周期计算每个数据源的年龄,并把任何超过 60 秒的数据源从合并视图中剔除;被剔除的数据源仍出现在 sources 数组中,带 stale 状态,以便前端渲染降级指示。
在前端:工具栏中的数据源圆点显示颜色与状态,热力图继续以剩余数据源运作。持续的过期状态通常意味着生产者触发了看门狗重置,或 WebSocket 在没有干净重连的情况下断开,页面以可见而非静默的方式降级。
限制与已知坑
- 无合并最佳买价与卖价。跨交易所基差是常态:Binance 的 BTC 永续相比 Bybit 与 OKX 同一合约,经常溢价或折价 $5-15。在这些时段,朴素地合并簿顶会发生倒置(合并最佳买价大于合并最佳卖价)。小部件以单独的合并墙与按交易所最佳报价展示来避免这一陷阱,只有当差距超过中价 0.10 % 时才显示紫色倒置带(可通过 URL 中的
?inv_bps=N配置)。 - 深度覆盖。每桶大小每侧 200 个桶:$1 BTC 视图覆盖 ±$200,$5 BTC 视图覆盖 ±$1 000。距中价 ±2 % 的整数锚位超出三家交易所公开通道返回的范围。该深度对本方法论结构性不可见。
- 100 ms 以下的延迟。聚合器以 10 Hz 轮询;免费公开频道的交易所推送速率上限约 ~50-100 ms。OKX 的逐笔变体(
books-l2-tbt、books50-l2-tbt)需要我们未达到的更高交易费率等级;订阅返回code 64003。Bybit 与 Binance 对期货没有可比的免费逐笔频道。 - 200 档 ≠ 深簿。每个生产者输入 200 档原始档位。在常态行情下,这在 BTC 上以原生报价粒度覆盖大约距中价 $30-50;在更平静的对中可走得更远。簿中更深的墙根本不在数据源中,与桶大小无关。
- 跨交易所偏斜真实存在。热力图以均匀的 100 ms 间隔渲染单元格,但每个单元格背后的三交易所快照在事件时间上可跨越至
cross_exchange_skew_ms,典型 < 100 ms,偶尔 200-500 ms。工具提示在有意义时显示该值;请把它视为时间粒度的下限。
版本
v1.0.0 初始发布于 2026-05-08(4 Hz 聚合,50 档)。v2.0.0 于 2026-05-09:升级至 10 Hz、200 档、多桶视图(每资产 $1 + $5)、按数据源事件时间戳对齐并暴露跨交易所偏斜。计算路径的实质性变更会升级版本并更新发布日期;外观调整不会。