Administrator
2026-08-13 9b950b7875bfec96a08983a6db31d2ac9d53e723
src/main/java/com/xcong/excoin/modules/gateApi/GateWebSocketClientManager.java
@@ -66,6 +66,9 @@
    @Autowired
    private GateLogBuffer logBuffer;
    @Autowired
    private StatsEventProducer statsEventProducer;
    /** WebSocket 连接管理器 */
    private GateKlineWebSocketClient wsClient;
    /** 网格交易策略服务 */
@@ -84,20 +87,7 @@
                config = persistenceService.buildFromDTO(saved, DEFAULT_API_KEY);
                logBuffer.info("[管理器] 已加载持久化配置, apiKey=" + mask(DEFAULT_API_KEY));
            } else {
                // 构建默认配置 DTO(只有 7 项可调参数)
                GateConfigDTO defaults = GateConfigDTO.builder()
                        .apiKey(DEFAULT_API_KEY)
                        .gridRate(new BigDecimal("0.005"))
                        .expectedProfit(new BigDecimal("0.15"))
                        .maxLoss(new BigDecimal("1.5"))
                        .baseQuantity("2")
                        .quantity("2")
                        .maxPositionSize(4)
                        .stopLossCount(0)
                        .priceDriveEnabled(true)
                        .rounds(0)
                        .build();
                // 确保配置文件存在
                GateConfigDTO defaults = GateConfigDTO.defaultsFor(DEFAULT_API_KEY);
                persistenceService.ensureExists(DEFAULT_API_KEY, defaults);
                config = persistenceService.buildFromDTO(defaults, DEFAULT_API_KEY);
                logBuffer.info("[管理器] 已创建默认配置文件");
@@ -138,6 +128,36 @@
    public GateConfig getConfig() { return config; }
    /**
     * 远程更新策略参数 — 仅持久化到 JSON 文件,不自动重启。
     * 下次「启动」指令会从文件读取最新配置后重建策略。
     *
     * @param dto 从 Station 下发的可调参数(不含 apiSecret)
     */
    public void updateConfig(GateConfigDTO dto) {
        logBuffer.info("[管理器] 收到远程参数更新指令(仅持久化)");
        persistenceService.save(config.getApiKey(), dto);
        logBuffer.info("[管理器] 参数已保存,待下次启动生效");
    }
    /**
     * 从持久化文件重载配置并重启策略。
     * 用于远程「启动」指令:先读最新配置 → 重建服务 → 启动。
     */
    public void reloadAndStart() {
        logBuffer.info("[管理器] 从文件重载配置并启动...");
        GateConfigDTO saved = persistenceService.load(config.getApiKey());
        if (saved == null) {
            logBuffer.info("[管理器] 无持久化配置,使用当前内存配置启动");
            if (gridTradeService != null) {
                gridTradeService.startGrid();
            }
            return;
        }
        GateConfig newConfig = persistenceService.buildFromDTO(saved, config.getApiKey());
        restartWithConfig(newConfig);
    }
    /**
     * 使用新配置重启策略:停止旧策略 → 重建 WS → 重新 init + startGrid。
     */
    public void restartWithConfig(GateConfig newConfig) {
@@ -151,7 +171,7 @@
        }
        // 2. 使用新配置重建
        this.config = newConfig;
        this.gridTradeService = new GateGridTradeService(config);
        this.gridTradeService = new GateGridTradeService(config, statsEventProducer);
        gridTradeService.init();
        // 3. 重建 WS 客户端并重新注册 Handler
        this.wsClient = new GateKlineWebSocketClient(config.getWsUrl());