Administrator
2026-08-13 c1d984b2a937f8d3bfe94a9ec724f438994fe6bd
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 = "4de44d064e84e57f045a8c77ba855fbe";
    static final String DEFAULT_API_SECRET = "afe7bb16f2a8896e1eceb4ca12e9b410e8d6698ddb3320119a04a21c7c543866";
    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,20 +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)
                        .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 +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) {
@@ -151,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());