[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_UPDATE、ACCOUNT_UPDATE、ACCOUNT_CONFIG_UPDATE、MARGIN_CALL、listenKeyExpired。
适用范围: 仅 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 都能挂上。
参考
[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 Depthwss://fstream.binance.com/public/ws/btcusdt@depth/market@aggTrade、@markPrice、@kline_*、@ticker、@miniTicker、@forceOrder等wss://fstream.binance.com/market/ws/btcusdt@aggTrade/privatewss://fstream.binance.com/private/ws?listenKey=<lk>&events=ORDER_TRADE_UPDATE/ACCOUNT_UPDATE/private路径下events=是必填参数,以/分隔。完整事件集合:ORDER_TRADE_UPDATE、ACCOUNT_UPDATE、ACCOUNT_CONFIG_UPDATE、MARGIN_CALL、listenKeyExpired。适用范围: 仅 U 本位合约。币本位(
dstream)、现货、期权 不受影响,沿用原有 URL 即可。banexg 需要做的改动
所有改动均限定在
fstream.binance.com(U 本位合约)范围内,具体如下:/ws/<listenKey>改为/private/ws?listenKey=<lk>&events=<events>。events是必填项,建议以可选参数的形式暴露给调用方,默认值取上面列出的全集,避免现有调用方意外漏掉某类事件。@aggTrade、@markPrice、@kline_*、@ticker、@miniTicker、@forceOrder等)需要切换到/market/路由。@bookTicker、@depth*)建议切换到/public/路由。这两个流目前在旧版 URL 下还能继续工作,但出于前向兼容考虑,显式路由仍是必要的。另外建议在 banbot 侧增加一项对 banexg 的最低版本断言:旧版 URL 握手是成功的,所以使用过期版本 banexg 的用户在运行时不会看到任何报错,只会发现事件全没了。
兜底方案(与 #138 关联)
即便 URL 修好了,WS 用户数据流也并非万无一失——listenKey 轮换、网络抖动、未来 API 变更等等,都会偶发性丢消息。当前 banbot 内部
WS 事件 → 记录成交 → 挂 SL/TP是一条单链路,任意一环漏掉一个事件,这笔仓位就处于无人管理的状态。建议补一条独立于 WS 的 REST 兜底路径,把这个缺口堵上:这样 SL/TP 的挂单链路就从一条脆弱的单通路变成两条相互独立的路径(WS 快路径 + 快照兜底路径),任意一条能工作,SL/TP 都能挂上。
参考