Administrator
4 days ago db4affbd6cca66acea2386c58970aa3ff7ff8f5c
fix(gate-api): 修复网格交易重置策略中的竞态条件问题

- 将取消订单和平仓操作整体移入executor队列末尾执行
- 确保上一轮挂单任务完成后再执行cancel操作
- 防止cancel操作早于挂单任务导致无法取消未挂出的订单
- 添加3秒延时确保订单状态同步完成
- 保持currentRound计数器在重置过程中的正确性
1 files modified
16 ■■■■■ changed files
src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java 16 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
@@ -609,14 +609,16 @@
                log.info("[Gate] 重置策略,开始第{}轮...", currentRound);
                state = StrategyState.STOPPED;
                try {
                    futuresApi.cancelPriceTriggeredOrderList(SETTLE, config.getContract());
                } catch (ApiException e) {
                    e.printStackTrace();
                }
                closeExistingPositions();
                // 提交到 executor 末尾:单线程FIFO保证前面所有平仓/取消任务完成后才重置
                // 关键修复:取消+平仓+延时+重启必须整体放进 executor 队列末尾,让上一轮排队的
                // 挂单任务先执行完(挂到交易所),随后的 cancel 才能取消到它们。若 cancel 仍留在
                // WS 线程同步执行,会早于上一轮挂单任务,取消不到"尚未挂出"的单(竞态)。
                executor.submitTask(() -> {
                    try {
                        futuresApi.cancelPriceTriggeredOrderList(SETTLE, config.getContract());
                    } catch (ApiException e) {
                        e.printStackTrace();
                    }
                    closeExistingPositions();
                    try { Thread.sleep(3000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); }
                    // 注意:startGrid() 会将 currentRound 归零,这里需要保留
                    int savedRound = currentRound;