| | |
| | | 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"; |
| | |
| | | |
| | | @Autowired |
| | | private GateLogBuffer logBuffer; |
| | | |
| | | @Autowired |
| | | private StatsEventProducer statsEventProducer; |
| | | |
| | | /** WebSocket 连接管理器 */ |
| | | private GateKlineWebSocketClient wsClient; |
| | |
| | | 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("[管理器] 已创建默认配置文件"); |
| | |
| | | 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) { |
| | |
| | | } |
| | | // 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()); |