Skip to content

[Bug] 币安 U 本位合约 WebSocket URL 重构:banexg 仍用旧版 /ws/ 路径,静默丢失所有事件 #7

@axlnur

Description

@axlnur

[Bug] 币安 U 本位合约 WebSocket URL 重构:banexg 仍用旧版 /ws/ 路径,静默丢失所有事件

概述

币安已将 fstream.binance.com 拆分为 /public/market/private 三条路由路径。旧版未路由的 URL(wss://fstream.binance.com/ws/<stream>)仍能完成握手,但凡是属于 /market 或 /private 类别的流都不会再下发任何事件。banexg 目前仍在按旧版格式拼接 URL,因此所有跑在币安 U 本位合约上的 banbot 实例都处于静默故障状态:收不到 ORDER_TRADE_UPDATE、收不到 ACCOUNT_CONFIG_UPDATE,也收不到 @aggTrade / @markPrice / @kline 等市场流。

这相当于把 banbot#138 Bug 2 从偶发的竞态升级成了长期问题——订单在交易所已经成交,banbot 始终不知情,SL/TP 永远挂不上去,持仓裸奔。

依据币安官方变更说明2026-03-06 公告,旧版 URL 已于 2026-04-23 永久下线

新版 URL 结构(仅适用于 U 本位合约)

路由 适用流 示例
/public @bookTicker@depth*、Partial Book Depth wss://fstream.binance.com/public/ws/btcusdt@depth
/market @aggTrade@markPrice@kline_*@ticker@miniTicker@forceOrder wss://fstream.binance.com/market/ws/btcusdt@aggTrade
/private 基于 listenKey 的用户数据流 wss://fstream.binance.com/private/ws?listenKey=<lk>&events=ORDER_TRADE_UPDATE/ACCOUNT_UPDATE

/private 路径下 events= 是必填参数,以 / 分隔。完整事件集合:ORDER_TRADE_UPDATEACCOUNT_UPDATEACCOUNT_CONFIG_UPDATEMARGIN_CALLlistenKeyExpired

适用范围: 仅 U 本位合约。币本位(dstream)、现货、期权 不受影响,沿用原有 URL 即可。

banexg 需要做的改动

所有改动均限定在 fstream.binance.com(U 本位合约)范围内,具体如下:

  • 用户数据 WS URL 需要从 /ws/<listenKey> 改为 /private/ws?listenKey=<lk>&events=<events>events 是必填项,建议以可选参数的形式暴露给调用方,默认值取上面列出的全集,避免现有调用方意外漏掉某类事件。
  • 市场流 URL(@aggTrade@markPrice@kline_*@ticker@miniTicker@forceOrder 等)需要切换到 /market/ 路由。
  • 公开流 URL(@bookTicker@depth*)建议切换到 /public/ 路由。这两个流目前在旧版 URL 下还能继续工作,但出于前向兼容考虑,显式路由仍是必要的。
  • listenKey 的 REST 续期接口 不涉及,无需改动。

另外建议在 banbot 侧增加一项对 banexg 的最低版本断言:旧版 URL 握手是成功的,所以使用过期版本 banexg 的用户在运行时不会看到任何报错,只会发现事件全没了。

兜底方案(与 #138 关联)

即便 URL 修好了,WS 用户数据流也并非万无一失——listenKey 轮换、网络抖动、未来 API 变更等等,都会偶发性丢消息。当前 banbot 内部 WS 事件 → 记录成交 → 挂 SL/TP 是一条单链路,任意一环漏掉一个事件,这笔仓位就处于无人管理的状态。建议补一条独立于 WS 的 REST 兜底路径,把这个缺口堵上:

  • banexg 侧: 提供一个账户快照接口,在一次调用内返回当前账户的权威状态(持仓、未成交订单、近期成交)。
  • banbot 侧: 增加一个健康监控,在(a)活跃交易期间 WS 长时间静默 或(b)按固定周期 时拉取快照对账。如果交易所侧的持仓能匹配上本地某笔仍标记为「未成交」的入场单,就直接把它标记为已成交,这样原有的 SL/TP 挂单流程会自然触发。

这样 SL/TP 的挂单链路就从一条脆弱的单通路变成两条相互独立的路径(WS 快路径 + 快照兜底路径),任意一条能工作,SL/TP 都能挂上。

参考

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions