Administrator
5 days ago e3ce01f4de275faa6d2b05727cf21f70fc5cf73b
src/main/java/com/xcong/excoin/modules/gateApi/GateKlineWebSocketClient.java
@@ -58,7 +58,9 @@
    private static final String FUTURES_PING = "futures.ping";
    private static final String FUTURES_PONG = "futures.pong";
    private static final String GATE_INTERVAL = "1m";
    private static final String GATE_CONTRACT = "BTC_USDT";
    private static final String GATE_CONTRACT = "XAU_USDT";
    private GateGridTradeService gridTradeService;
    // 心跳超时时间(秒),小于30秒
    private static final int HEARTBEAT_TIMEOUT = 10;
@@ -77,6 +79,10 @@
        this.caoZuoService = caoZuoService;
        this.clientManager = clientManager;
        this.wangGeListService = wangGeListService;
    }
    public void setGridTradeService(GateGridTradeService gridTradeService) {
        this.gridTradeService = gridTradeService;
    }
    /**
@@ -366,85 +372,13 @@
            System.out.println("成交额(a): " + baseVol);
            System.out.println("K线完结(w): " + windowClosed);
            System.out.println("==================================");
            if (gridTradeService != null) {
                gridTradeService.onKline(closePx, windowClosed);
            }
        } catch (Exception e) {
            log.error("处理 K线频道推送数据失败", e);
        }
    }
    private void doOpen(WebSocketClient webSocketClient, String accountName, MacdEmaStrategy.TradingOrder tradingOrderOpenOpen, BigDecimal closePx) {
        // 根据信号执行交易操作
        TradeRequestParam tradeRequestParam = new TradeRequestParam();
        String posSide = tradingOrderOpenOpen.getPosSide();
        tradeRequestParam.setPosSide(posSide);
        String currentPrice = String.valueOf(closePx);
        tradeRequestParam = caoZuoService.caoZuoStrategy(accountName, currentPrice, posSide);
        String side = tradingOrderOpenOpen.getSide();
        tradeRequestParam.setSide(side);
        String clOrdId = WsParamBuild.getOrderNum(side);
        tradeRequestParam.setClOrdId(clOrdId);
        String sz = InstrumentsWs.getAccountMap(accountName).get(CoinEnums.BUY_CNT_INIT.name());
        tradeRequestParam.setSz(sz);
        TradeOrderWs.orderEvent(webSocketClient, tradeRequestParam);
    }
    private List<Kline> getKlineDataByInstIdAndBar(String instId, String bar) {
        List<Kline> klineList = new ArrayList<>();
        try {
            LinkedHashMap<String, Object> requestParam = new LinkedHashMap<>();
            requestParam.put("instId", instId);
            requestParam.put("bar", bar);
            requestParam.put("limit", "200");
            String result = ExchangeLoginService.getInstance(ExchangeInfoEnum.OKX_UAT.name()).lineHistory(requestParam);
            JSONObject json = JSON.parseObject(result);
            String data = json.getString("data");
            if (data != null) {
                List<String[]> klinesList = JSON.parseArray(data, String[].class);
                if (!CollUtil.isEmpty(klinesList)) {
                    for (String[] s : klinesList) {
                        // 确保数组有足够的元素
                        if (s != null && s.length >= 9) {
                            String s1 = s[8];
                            try {
                                if ("1".equals(s1)){
                                    Kline kline = new Kline();
                                    kline.setTs(s[0]);
                                    kline.setO(new BigDecimal(s[1]));
                                    kline.setH(new BigDecimal(s[2]));
                                    kline.setL(new BigDecimal(s[3]));
                                    kline.setC(new BigDecimal(s[4]));
                                    kline.setVol(new BigDecimal(s[5]));
                                    kline.setConfirm(s[8]);
                                    klineList.add(kline);
                                }
                            } catch (NumberFormatException e) {
                                log.error("K线数据转换为BigDecimal失败: {}", Arrays.toString(s), e);
                            }
                        } else {
                            log.warn("K线数据数组长度不足: {}", Arrays.toString(s));
                        }
                    }
                }
            } else {
                log.warn("K线数据为空");
            }
        } catch (JSONException e) {
            log.error("K线数据解析失败", e);
        } catch (Exception e) {
            log.error("获取K线数据异常", e);
        }
        return klineList;
    }
    /**
     * 构建 Redis Key
     */
    private String buildRedisKey(String instId) {
        return "PRICE_" + instId.replace("-", "");
    }
    /**