| | |
| | | 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"; |
| | |
| | | |
| | | @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()); |