假设用户持有 10 张多仓,同时提交两笔各 10 张的 Reduce Only 卖单。如果两个请求分别检查当前仓位,它们都会认为最多可平 10 张,于是都通过。后续如果两笔都成交,就会卖出 20 张,平掉多仓后反向开空。
解决方案是把未成交 Reduce Only 订单纳入可平数量计算。下单时需要预占可平数量,例如第一笔 10 张通过后,第二笔可平数量应变成 0。成交、撤单、仓位变化后,还要重新裁剪或取消超额 Reduce Only 订单。
最终清算层必须兜底:任何 Reduce Only 成交都不能让仓位越过零点。如果撮合回报和账户状态之间存在延迟,也要通过事件顺序、版本号或账户分区串行处理来保证一致性。