Administrator
4 hours ago e9a397babbbfa9cff8a5ed026447d585e739c37f
src/main/java/com/xcong/excoin/modules/gateApi/wsHandler/handler/CandlestickChannelHandler.java
@@ -33,19 +33,40 @@
public class CandlestickChannelHandler implements GateChannelHandler {
    private static final String CHANNEL_NAME = "futures.candlesticks";
    /** K 线周期,固定 1 分钟 */
    private static final String INTERVAL = "1m";
    /** 合约名称 */
    private final String contract;
    /** 网格交易服务,接收 K 线回调 */
    private final GateGridTradeService gridTradeService;
    /**
      * @param contract         合约名称(如 ETH_USDT)
      * @param gridTradeService 网格交易策略服务实例
      */
    public CandlestickChannelHandler(String contract, GateGridTradeService gridTradeService) {
        this.contract = contract;
        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 +81,9 @@
        log.info("[{}] 订阅成功, 合约:{}, 周期:{}", CHANNEL_NAME, contract, INTERVAL);
    }
    /**
     * 发送 K 线频道取消订阅请求。
     */
    @Override
    public void unsubscribe(WebSocketClient ws) {
        JSONObject msg = new JSONObject();
@@ -74,6 +98,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"))) {