Administrator
14 hours ago a986f3571c7e18ade4665fe5999b445b5762264d
src/main/java/com/xcong/excoin/modules/gateApi/wsHandler/handler/CandlestickChannelHandler.java
@@ -43,9 +43,23 @@
        this.gridTradeService = gridTradeService;
    }
    /** @return 频道名称 "futures.candlesticks" */
    @Override
    public String getChannelName() { return CHANNEL_NAME; }
    /**
     * 发送 K 线频道订阅请求(公开频道,无需签名)。
     *
     * <h3>订阅格式</h3>
     * <pre>
     * {
     *   "time":    &lt;unix时间戳(秒)&gt;,
     *   "channel": "futures.candlesticks",
     *   "event":   "subscribe",
     *   "payload": ["1m", "{contract}"]
     * }
     * </pre>
     */
    @Override
    public void subscribe(WebSocketClient ws) {
        JSONObject msg = new JSONObject();
@@ -60,6 +74,9 @@
        log.info("[{}] 订阅成功, 合约:{}, 周期:{}", CHANNEL_NAME, contract, INTERVAL);
    }
    /**
     * 发送 K 线频道取消订阅请求。
     */
    @Override
    public void unsubscribe(WebSocketClient ws) {
        JSONObject msg = new JSONObject();
@@ -74,6 +91,25 @@
        log.info("[{}] 取消订阅成功", CHANNEL_NAME);
    }
    /**
     * 处理 K 线推送消息。
     *
     * <h3>数据提取</h3>
     * result[0] 中提取:
     * <ul>
     *   <li>c(close):收盘价 → 传给 gridTradeService.onKline()</li>
     *   <li>n(name):烛线名称(如 "1m_ETH_USDT")</li>
     *   <li>t(time):烛线起始时间戳</li>
     *   <li>w(window_close):烛线是否完结(仅日志输出,不做门控)</li>
     * </ul>
     *
     * <h3>注意</h3>
     * 不判断 w(已完结)——策略需要 tick 级实时响应价格变动,
     * 而非等 1 分钟烛线完结后才行动。
     *
     * @param response WebSocket 推送的完整 JSON
     * @return true 表示已处理(匹配成功)
     */
    @Override
    public boolean handleMessage(JSONObject response) {
        if (!CHANNEL_NAME.equals(response.getString("channel"))) {