Administrator
2025-12-09 01d04ce9e26f29dcd03b7d6acb29dcd0c9f52334
fix(okxNewPrice): 修复强制平仓逻辑判断条件

- 从Redis获取交易状态,避免重复计算
- 在总订单金额小于持仓亏损时增加状态判断
- 防止在特定状态下继续下单导致风险扩大
2 files modified
25 ■■■■■ changed files
src/main/java/com/xcong/excoin/modules/okxNewPrice/OkxQuantWebSocketClient.java 3 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/AccountWs.java 22 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/okxNewPrice/OkxQuantWebSocketClient.java
@@ -276,6 +276,7 @@
                return;
            }
            String state = (String) redisUtils.get(InstrumentsWs.INSTRUMENTSWS_CHANNEL + ":" + CoinEnums.HE_YUE.getCode() + ":state");
            String uplKey = PositionsWs.POSITIONSWS_CHANNEL + ":" + CoinEnums.HE_YUE.getCode() + ":upl";
            String totalOrderUsdtKey = AccountWs.ACCOUNTWS_CHANNEL + ":" + CoinEnums.USDT.getCode() + ":totalOrderUsdt";
@@ -283,7 +284,7 @@
            String totalOrderUsdt = (String) redisUtils.get(totalOrderUsdtKey);
            BigDecimal multiply = new BigDecimal(upl).multiply(new BigDecimal("-1"));
            if (new BigDecimal(totalOrderUsdt).compareTo(multiply) < 0) {
            if (new BigDecimal(totalOrderUsdt).compareTo(multiply) < 0 || OrderParamEnums.STATE_3.getValue().equals(state)) {
                log.error("持仓盈亏超过下单总保证金,止损冷静一天......");
                TradeOrderWs.orderEvent(webSocketClient, redisUtils, OrderParamEnums.OUT.getValue());
                return;
src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/AccountWs.java
@@ -110,16 +110,18 @@
                        // 可用余额 / 现金余额 比例判断是否允许开仓
                        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());
                            state = OrderParamEnums.STATE_3.getValue();
                        String state = (String) redisUtils.get(InstrumentsWs.INSTRUMENTSWS_CHANNEL + ":" + CoinEnums.HE_YUE.getCode() + ":state");
                        if (!OrderParamEnums.STATE_3.getValue().equals(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());
                                state = OrderParamEnums.STATE_3.getValue();
                            }
                        }
                        // 根据可用余额计算下单总保证金与每次下单金额