Administrator
2026-09-23 7ed8803323da91516b0eacb49664e4658745d228
fix(gateApi): 解决止损追单时持仓查询缓存竞态问题

- 修复了止损单刚成交时WS持仓推送延迟导致的持仓查询竞态问题
- 修改逻辑直接使用REST接口实时查询持仓避免WS缓存时序问题
- 添加详细注释说明止损追单计算逻辑和缓存绕过必要性
- 简化持仓大小比较逻辑,移除冗余的Math.max调用
1 files modified
8 ■■■■■ changed files
src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java 8 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
@@ -1652,10 +1652,12 @@
        if (maxPerSide > 0) {
            int upperLimit = maxPerSide;
            if (respectCurrentPosition) {
                // 止损追单:单边总持仓不得超过 maxPerSide,追单量 = maxPerSide - 当前持仓
                // 止损追单:单边总持仓不得超过 maxPerSide,追单量 = maxPerSide - 当前持仓。
                // 止损单刚成交、WS 持仓推送尚未到达,必须用 REST 实时查询绕过 WS 缓存时序竞态,
                // 否则会取到滞后的旧持仓(如止损前仍为 10),把追单量错误扣减。
                int currentPos = isLong
                        ? Math.max(queryPositionSize(Position.ModeEnum.DUAL_LONG), longPositionSize.intValue())
                        : Math.max(queryPositionSize(Position.ModeEnum.DUAL_SHORT), shortPositionSize.intValue());
                        ? queryPositionSize(Position.ModeEnum.DUAL_LONG)
                        : queryPositionSize(Position.ModeEnum.DUAL_SHORT);
                upperLimit = maxPerSide - currentPos;
            }
            if (upperLimit <= 0) {