From 9b950b7875bfec96a08983a6db31d2ac9d53e723 Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Mon, 24 Aug 2026 14:14:54 +0800
Subject: [PATCH] fix(gate): 修复心跳调度器中服务器端口获取问题

---
 src/main/java/com/xcong/excoin/modules/gateApi/GateWebSocketClientManager.java |   50 +++++++++++++++++++++++++++++++++++---------------
 1 files changed, 35 insertions(+), 15 deletions(-)

diff --git a/src/main/java/com/xcong/excoin/modules/gateApi/GateWebSocketClientManager.java b/src/main/java/com/xcong/excoin/modules/gateApi/GateWebSocketClientManager.java
index 328e13a..c619a9d 100644
--- a/src/main/java/com/xcong/excoin/modules/gateApi/GateWebSocketClientManager.java
+++ b/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());

--
Gitblit v1.9.1