Administrator
2026-06-05 ed57e750b5e2cf14fe5d447ff318228f8df77d23
refactor(okx): 移除算法单频道处理器并优化网格交易重置逻辑

- 删除 OkxAlgoOrdersChannelHandler 类,不再处理算法单状态推送
- 移除策略停止时的重复清理操作,避免不必要的平仓和重启
- 优化持仓归零处理逻辑,统一通过 submitTask 确保执行顺序
- 添加 3 秒延迟保证平仓完成后再重置策略
- 新增通用任务提交方法支持 FIFO 队列执行
- 清理 WebSocket 客户端管理器中的无用导入
1 files deleted
3 files modified
113 ■■■■ changed files
src/main/java/com/xcong/excoin/modules/okxNewPrice/OkxGridTradeService.java 15 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/okxNewPrice/OkxTradeExecutor.java 8 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/okxNewPrice/OkxWebSocketClientManager.java 1 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/okxNewPrice/gridWs/OkxAlgoOrdersChannelHandler.java 89 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/okxNewPrice/OkxGridTradeService.java
@@ -269,11 +269,9 @@
        updateUnrealizedPnl();
        if (state == StrategyState.STOPPED) {
            executor.cancelAllAlgoOrders();
            closeExistingPositions();
            // stopGrid() 已做清理,仅打印日志不重复操作
            BigDecimal totalPnl = cumulativePnl.add(unrealizedPnl);
            log.info("[OKX] 已实现:{}, 未实现:{}, 合计:{}", cumulativePnl, unrealizedPnl, totalPnl);
            startGrid();
            return;
        }
@@ -363,7 +361,6 @@
            }
            } else {
                if (longActive && state == StrategyState.ACTIVE) {
                    log.info("[OKX] 多仓持仓归零,重置策略");
                    handlePositionZeroAndReset("多仓");
                }
                longActive = false;
@@ -385,7 +382,6 @@
            }
            } else {
                if (shortActive && state == StrategyState.ACTIVE) {
                    log.info("[OKX] 空仓持仓归零,重置策略");
                    handlePositionZeroAndReset("空仓");
                }
                shortActive = false;
@@ -555,7 +551,11 @@
                state = StrategyState.STOPPED;
                closeExistingPositions();
                executor.cancelAllAlgoOrders();
                // 提交到 executor 末尾:单线程FIFO保证前面所有平仓/取消任务完成后才重置
                executor.submitTask(() -> {
                    try { Thread.sleep(3000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); }
                startGrid();
                });
            }
        } catch (Exception e) {
            log.warn("[OKX] 盈亏检查失败", e);
@@ -563,10 +563,15 @@
    }
    private void handlePositionZeroAndReset(String direction) {
        log.info("[OKX] {}持仓归零,重置策略", direction);
        state = StrategyState.STOPPED;
        executor.cancelAllAlgoOrders();
        closeExistingPositions();
        // 提交到 executor 末尾:FIFO保证平仓完成后再重置
        executor.submitTask(() -> {
            try { Thread.sleep(3000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); }
        startGrid();
        });
    }
    // ---- getters ----
src/main/java/com/xcong/excoin/modules/okxNewPrice/OkxTradeExecutor.java
@@ -79,6 +79,14 @@
    }
    /**
     * 提交一个通用任务到交易线程池末尾。
     * 利用单线程池的 FIFO 特性确保任务按提交顺序执行。
     */
    public void submitTask(Runnable task) {
        executor.execute(task);
    }
    /**
     * 异步 IOC 市价开多。
     *
     * @param quantity  开仓张数(正数)
src/main/java/com/xcong/excoin/modules/okxNewPrice/OkxWebSocketClientManager.java
@@ -1,6 +1,5 @@
package com.xcong.excoin.modules.okxNewPrice;
import com.xcong.excoin.modules.okxNewPrice.gridWs.OkxAlgoOrdersChannelHandler;
import com.xcong.excoin.modules.okxNewPrice.gridWs.OkxKlineChannelHandler;
import com.xcong.excoin.modules.okxNewPrice.gridWs.OkxOrdersChannelHandler;
import com.xcong.excoin.modules.okxNewPrice.gridWs.OkxPositionsChannelHandler;
src/main/java/com/xcong/excoin/modules/okxNewPrice/gridWs/OkxAlgoOrdersChannelHandler.java
File was deleted