From c1d984b2a937f8d3bfe94a9ec724f438994fe6bd Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Thu, 13 Aug 2026 15:41:14 +0800
Subject: [PATCH] feat(gate): 添加策略端组件开关配置

---
 src/main/java/com/xcong/excoin/modules/gateApi/GateWebSocketClientManager.java |   54 +++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 39 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 f7e807a..8232dda 100644
--- a/src/main/java/com/xcong/excoin/modules/gateApi/GateWebSocketClientManager.java
+++ b/src/main/java/com/xcong/excoin/modules/gateApi/GateWebSocketClientManager.java
@@ -5,6 +5,7 @@
 import com.xcong.excoin.modules.gateApi.wsHandler.handler.PositionClosesChannelHandler;
 import com.xcong.excoin.modules.gateApi.wsHandler.handler.PositionsChannelHandler;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -42,12 +43,13 @@
  * @author Administrator
  */
 @Slf4j
+@ConditionalOnProperty(name = "app.gate.enabled", havingValue = "true", matchIfMissing = true)
 @Component
 public class GateWebSocketClientManager {
 
     // ==================== 修改配置只需改这里 ===================
-    static final String DEFAULT_API_KEY = "967fe9e50d589621a25d75618a85ba41";
-    static final String DEFAULT_API_SECRET = "9d7a004a5d6b88b38fd6e21e323b0214c4f4e25db071ff45d479c76f0325aabe";
+    static final String DEFAULT_API_KEY = "305a15adef2a7772d38745f48847f82d";
+    static final String DEFAULT_API_SECRET = "f0d758cf19751de6eeace8a795ab788357810d662e0ea313be94e745ab9e8637";
     // 不可调参数
     static final String DEFAULT_CONTRACT = "ETH_USDT";
     static final String DEFAULT_LEVERAGE = "100";
@@ -65,6 +67,9 @@
 
     @Autowired
     private GateLogBuffer logBuffer;
+
+    @Autowired
+    private StatsEventProducer statsEventProducer;
 
     /** WebSocket 连接管理器 */
     private GateKlineWebSocketClient wsClient;
@@ -84,18 +89,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)
-                        .build();
-                // 确保配置文件存在
+                GateConfigDTO defaults = GateConfigDTO.defaultsFor(DEFAULT_API_KEY);
                 persistenceService.ensureExists(DEFAULT_API_KEY, defaults);
                 config = persistenceService.buildFromDTO(defaults, DEFAULT_API_KEY);
                 logBuffer.info("[管理器] 已创建默认配置文件");
@@ -136,6 +130,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) {
@@ -149,7 +173,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