package com.xcong.excoin.modules.okxApi.wsHandler.handler; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.xcong.excoin.modules.okxApi.OkxGridTradeService; import com.xcong.excoin.modules.okxApi.OkxWsUtil; import com.xcong.excoin.modules.okxApi.enums.OkxEnums; import com.xcong.excoin.modules.okxApi.wsHandler.OkxChannelHandler; import lombok.extern.slf4j.Slf4j; import org.java_websocket.client.WebSocketClient; import java.math.BigDecimal; @Slf4j public class OkxCandlestickChannelHandler implements OkxChannelHandler { private final String instId; private final OkxGridTradeService gridTradeService; public OkxCandlestickChannelHandler(String instId, OkxGridTradeService gridTradeService) { this.instId = instId; this.gridTradeService = gridTradeService; } @Override public String getChannelName() { return OkxEnums.CHANNEL_CANDLE; } @Override public void subscribe(WebSocketClient ws) { JSONObject msg = new JSONObject(); msg.put("op", "subscribe"); JSONArray args = new JSONArray(); JSONObject arg = new JSONObject(); arg.put("channel", OkxEnums.CHANNEL_CANDLE); arg.put("instId", instId); args.add(arg); msg.put("args", args); ws.send(msg.toJSONString()); log.info("[{}] 订阅成功, 合约:{}, 周期:1m", OkxEnums.CHANNEL_CANDLE, instId); } @Override public void unsubscribe(WebSocketClient ws) { JSONObject msg = new JSONObject(); msg.put("op", "unsubscribe"); JSONArray args = new JSONArray(); JSONObject arg = new JSONObject(); arg.put("channel", OkxEnums.CHANNEL_CANDLE); arg.put("instId", instId); args.add(arg); msg.put("args", args); ws.send(msg.toJSONString()); log.info("[{}] 取消订阅成功", OkxEnums.CHANNEL_CANDLE); } @Override public boolean handleMessage(JSONObject response) { JSONObject argObj = response.getJSONObject("arg"); if (argObj == null) { return false; } String channel = argObj.getString("channel"); if (!OkxEnums.CHANNEL_CANDLE.equals(channel)) { return false; } String msgInstId = argObj.getString("instId"); if (!instId.equals(msgInstId)) { return false; } try { JSONArray dataArray = response.getJSONArray("data"); if (dataArray == null || dataArray.isEmpty()) { log.warn("[{}] 数据为空", OkxEnums.CHANNEL_CANDLE); return true; } JSONArray data = dataArray.getJSONArray(0); BigDecimal closePx = new BigDecimal(data.getString(4)); String time = OkxWsUtil.timestampToDateTime(Long.parseLong(data.getString(0))); String confirm = data.getString(8); log.info("[{}] 收盘:{}, 时间:{}, 完结:{}", OkxEnums.CHANNEL_CANDLE, closePx, time, "1".equals(confirm)); if (gridTradeService != null) { gridTradeService.onKline(closePx); } } catch (Exception e) { log.error("[{}] 处理数据失败", OkxEnums.CHANNEL_CANDLE, e); } return true; } }