package com.xcong.excoin.modules.okxNewPrice.gridWs; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.xcong.excoin.modules.okxNewPrice.OkxGridTradeService; import lombok.extern.slf4j.Slf4j; import org.java_websocket.client.WebSocketClient; import java.math.BigDecimal; /** * OKX K线频道处理器 (candle1m)。 * 策略的唯一价格时间驱动源,每收到一根K线触发 onKline()。 * * @author Administrator */ @Slf4j public class OkxKlineChannelHandler implements OkxGridChannelHandler { private static final String CHANNEL_NAME = "candle1m"; private static final String INTERVAL = "1m"; private final String instId; private final OkxGridTradeService gridTradeService; public OkxKlineChannelHandler(String instId, OkxGridTradeService gridTradeService) { this.instId = instId; this.gridTradeService = gridTradeService; } @Override public String getChannelName() { return CHANNEL_NAME; } @Override public void subscribe(WebSocketClient ws) { JSONObject msg = new JSONObject(); JSONObject arg = new JSONObject(); arg.put("channel", CHANNEL_NAME); arg.put("instId", instId); msg.put("op", "subscribe"); JSONArray args = new JSONArray(); args.add(arg); msg.put("args", args); ws.send(msg.toJSONString()); log.info("[OKX-WS] {} 订阅成功, instId:{}", CHANNEL_NAME, instId); } @Override public void unsubscribe(WebSocketClient ws) { JSONObject msg = new JSONObject(); JSONObject arg = new JSONObject(); arg.put("channel", CHANNEL_NAME); arg.put("instId", instId); msg.put("op", "unsubscribe"); JSONArray args = new JSONArray(); args.add(arg); msg.put("args", args); ws.send(msg.toJSONString()); log.info("[OKX-WS] {} 取消订阅成功", CHANNEL_NAME); } @Override public boolean handleMessage(JSONObject response) { JSONObject arg = response.getJSONObject("arg"); if (arg == null || !CHANNEL_NAME.equals(arg.getString("channel"))) { return false; } try { JSONArray data = response.getJSONArray("data"); if (data == null || data.isEmpty()) return true; // OKX K线数据格式: [ts, o, h, l, c, vol, volCcy, volCcyQuote, confirm] JSONArray candle = data.getJSONArray(0); if (candle == null || candle.size() < 5) return true; BigDecimal closePx = candle.getBigDecimal(4); // 收盘价在索引4 if (closePx != null && gridTradeService != null) { gridTradeService.onKline(closePx); } } catch (Exception e) { log.error("[OKX-WS] {} 处理数据失败", CHANNEL_NAME, e); } return true; } }