Administrator
2026-08-13 a0460af5da48133ae1fd7741c2ddf9e8c639323d
src/main/java/com/xcong/excoin/modules/gateApi/GateWebSocketClientManager.java
@@ -46,8 +46,8 @@
public class GateWebSocketClientManager {
    // ==================== 修改配置只需改这里 ===================
    static final String DEFAULT_API_KEY = "dbf5cc322a0f3d6f308e143c494fb0b4";
    static final String DEFAULT_API_SECRET = "83cb291e21e62148ec99bc9adef493ee9f7fc195f2b9dc929466d70350ec58c3";
    static final String DEFAULT_API_KEY = "c29ae131fad0da74e7d4de5b55ad1f84";
    static final String DEFAULT_API_SECRET = "39cdcf19ab613497b1a01afb7dc9dbd97f2d15d350e2af4ab5a4ff1bbe041fa1";
    // 不可调参数
    static final String DEFAULT_CONTRACT = "ETH_USDT";
    static final String DEFAULT_LEVERAGE = "100";
@@ -65,6 +65,9 @@
    @Autowired
    private GateLogBuffer logBuffer;
    @Autowired
    private StatsEventProducer statsEventProducer;
    /** WebSocket 连接管理器 */
    private GateKlineWebSocketClient wsClient;
@@ -84,19 +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)
                        .build();
                // 确保配置文件存在
                GateConfigDTO defaults = GateConfigDTO.defaultsFor(DEFAULT_API_KEY);
                persistenceService.ensureExists(DEFAULT_API_KEY, defaults);
                config = persistenceService.buildFromDTO(defaults, DEFAULT_API_KEY);
                logBuffer.info("[管理器] 已创建默认配置文件");
@@ -137,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) {
@@ -150,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());