Skip to content

[Bug] Binance 条件 algo 单触发后的成交无法关联回原始委托 #10

@axlnur

Description

@axlnur

[Bug] Binance 条件 algo 单触发后的成交无法关联回原始委托

在 Binance U 本位永续合约上交易时,banbot 会把止损和止盈作为条件 algo 单挂在交易所上。当触发条件在交易所端命中、随后的市价成交通过 WebSocket 回报时,banbot 没有把这笔成交识别成它自己挂过的那笔止损或止盈。这笔成交就被悄悄丢掉了,本地状态里那个仓位仍然显示为持仓中;几秒之后会有一次单独的对账(reconciliation)流程被触发,按那个时刻的市场价合成一笔假的离场。

用户可见的表现:

  • 订单的离场原因最终是 no_match,而不是 stop_loss / take_profit
  • 记录下来的离场价是错的——是对账那一刻的市价,而不是触发单实际的成交价。
  • 记录的盈亏跟交易所端对不上,差额是 数量 × (对账价 − 触发价),在行情剧烈波动时会非常大(我在生产里见过单笔订单跟实际亏损差出 ~30% 的情况)。
  • 下游所有的统计、胜率、回撤计算都会被每一笔出问题的订单系统性地带偏。

只要 Binance U 本位上的止损或止盈触发了,每一次都会出现这个问题,不是偶发的。Bug 的位置应该是在:触发单的 WebSocket trade 事件被匹配回原始 algo 单时的那段逻辑。

已在 Binance 实盘环境(U 本位永续)复现确认。

OKX 和 Bybit 上没有亲自验证过,但匹配逻辑在各交易所之间是共用的,所以同样采用"触发后产生新 orderId"模式的交易所很可能也会受影响。

这是我在 banbot 里发现的影响最大的一个 bug——它会在每一笔带杠杆的止损离场上悄悄产出错误的盈亏数据。

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