Administrator
2025-12-10 4143a4a7be962a580eae94e530293c9eb19b4de1
src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/AccountWs.java
@@ -52,7 +52,10 @@
            JSONArray argsArray = new JSONArray();
            JSONObject args = new JSONObject();
            args.put("channel", ACCOUNTWS_CHANNEL);
            args.put(CCY_KEY, CoinEnums.USDT.getCode());
//            args.put(CCY_KEY, CoinEnums.USDT.getCode());
            JSONObject updateInterval = new JSONObject();
            updateInterval.put("updateInterval",CoinEnums.UPDATEINTERVAL.getCode());
            args.put("extraParams", updateInterval);
            argsArray.add(args);
            String connId = MallUtils.getOrderNum(ACCOUNTWS_CHANNEL);
@@ -71,6 +74,9 @@
     * @param redisUtils Redis 工具类实例,用于存储账户相关信息
     */
    public static void handleEvent(JSONObject response, RedisUtils redisUtils) {
        log.info("开始执行AccountWs......");
        try {
            JSONArray dataArray = response.getJSONArray(DATA_KEY);
            if (dataArray == null || dataArray.isEmpty()) {
@@ -83,6 +89,7 @@
                    JSONObject accountData = dataArray.getJSONObject(i);
                    JSONArray detailsArray = accountData.getJSONArray(DETAILS_KEY);
                    if (detailsArray == null || detailsArray.isEmpty()) {
                        log.warn("账户频道{}数据为空",CoinEnums.USDT.getCode());
                        continue;
                    }
@@ -90,12 +97,17 @@
                        JSONObject detail = detailsArray.getJSONObject(j);
                        String ccy = detail.getString(CCY_KEY);
                        if (!CoinEnums.USDT.getCode().equals(ccy)) {
                            log.warn("账户频道币种不匹配,跳过处理");
                            continue;
                        }
                        String availBalStr = detail.getString(AVAIL_BAL_KEY);
                        String cashBalStr = detail.getString(CASH_BAL_KEY);
                        String eq = detail.getString(EQ_KEY);
                        if (StrUtil.isBlank(ccy) || StrUtil.isBlank(availBalStr) || StrUtil.isBlank(cashBalStr)) {
                            log.warn("账户详情缺失必要字段,跳过处理");
                            log.warn("账户频道缺失必要字段,跳过处理");
                            continue;
                        }
@@ -103,23 +115,32 @@
                        BigDecimal cashBal = parseBigDecimalSafe(cashBalStr);
                        if (availBal == null || cashBal == null || cashBal.compareTo(BigDecimal.ZERO) == 0) {
                            log.warn("无效的账户余额数据,跳过处理");
                            log.warn("账户频道无效的账户余额数据,跳过处理");
                            continue;
                        }
                        // 可用余额 / 现金余额 比例判断是否允许开仓
                        BigDecimal divide = availBal.divide(cashBal, 4, RoundingMode.DOWN);
                        String state;
                        if (divide.compareTo(KANG_CANG_THRESHOLD) > 0) {
                            log.info(OrderParamEnums.STATE_1.getName());
                            state = OrderParamEnums.STATE_1.getValue();
                        } else if (divide.compareTo(ZHI_SUN_THRESHOLD) > 0) {
                            log.warn(OrderParamEnums.STATE_2.getName());
                            state = OrderParamEnums.STATE_2.getValue();
                        } else {
                            log.error(OrderParamEnums.STATE_3.getName());
                        String state = (String) redisUtils.get(InstrumentsWs.INSTRUMENTSWS_CHANNEL + ":" + CoinEnums.HE_YUE.getCode() + ":state");
                        String out = (String) redisUtils.get(InstrumentsWs.INSTRUMENTSWS_CHANNEL + ":" + CoinEnums.HE_YUE.getCode() + ":out");
                        if (OrderParamEnums.STATE_4.getValue().equals(state)){
                            log.info(OrderParamEnums.STATE_4.getName());
                            state = OrderParamEnums.STATE_4.getValue();
                        }else if(OrderParamEnums.STATE_3.getValue().equals(state) && OrderParamEnums.OUT_YES.getValue().equals(out)){
                            log.info(OrderParamEnums.STATE_3.getName());
                            state = OrderParamEnums.STATE_3.getValue();
                        }else{
                            if (divide.compareTo(KANG_CANG_THRESHOLD) > 0) {
                                log.info(OrderParamEnums.STATE_1.getName());
                                state = OrderParamEnums.STATE_1.getValue();
                            } else if (divide.compareTo(ZHI_SUN_THRESHOLD) > 0) {
                                log.warn(OrderParamEnums.STATE_2.getName());
                                state = OrderParamEnums.STATE_2.getValue();
                            } else {
                                log.error(OrderParamEnums.STATE_0.getName());
                                state = OrderParamEnums.STATE_0.getValue();
                            }
                        }
                        // 根据可用余额计算下单总保证金与每次下单金额