From 40c1e96090de38634773f681bb858f17f89d498e Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Fri, 12 Dec 2025 13:14:15 +0800
Subject: [PATCH] fix(okx): 调整账户与交易逻辑中的关键字段及判断条件

---
 src/main/java/com/xcong/excoin/modules/okxNewPrice/celue/CaoZuoServiceImpl.java |   12 +++++++++---
 src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/OrderInfoWs.java       |    1 -
 src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/TradeOrderWs.java      |    2 --
 src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/AccountWs.java         |   10 +++++-----
 4 files changed, 14 insertions(+), 11 deletions(-)

diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/celue/CaoZuoServiceImpl.java b/src/main/java/com/xcong/excoin/modules/okxNewPrice/celue/CaoZuoServiceImpl.java
index acc9f15..58e1189 100644
--- a/src/main/java/com/xcong/excoin/modules/okxNewPrice/celue/CaoZuoServiceImpl.java
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/celue/CaoZuoServiceImpl.java
@@ -79,7 +79,7 @@
          * 判断止损抗压
          */
         // 实际亏损金额
-        BigDecimal realKuiSunAmount = cashBal.subtract(availBal);
+        BigDecimal realKuiSunAmount = WsMapBuild.parseBigDecimalSafe(AccountWs.ACCOUNTWSMAP.get("upl"));
         log.info("实际亏损金额: {}", realKuiSunAmount);
         String zhiSunPercent = InstrumentsWs.INSTRUMENTSWSMAP.get(CoinEnums.ZHI_SUN.name());
         BigDecimal zhiSunAmount = cashBal.multiply(new BigDecimal(zhiSunPercent));
@@ -88,11 +88,13 @@
         BigDecimal  kangYaAmount = cashBal.multiply(new BigDecimal(kangYaPercent));
         log.info("预期抗仓金额: {}", kangYaAmount);
 
-        if (realKuiSunAmount.compareTo(BigDecimal.ZERO) > 0){
+        if (realKuiSunAmount.compareTo(BigDecimal.ZERO) < 0){
+            realKuiSunAmount = realKuiSunAmount.multiply(new BigDecimal("-1"));
             // 账户预期亏损金额比这个还小时,立即止损
             if (realKuiSunAmount.compareTo(zhiSunAmount) > 0){
                 log.error("账户冷静止损......");
                 WsMapBuild.saveStringToMap(InstrumentsWs.INSTRUMENTSWSMAP, CoinEnums.OUT.name(),  OrderParamEnums.OUT_YES.getValue());
+                WsMapBuild.saveStringToMap(InstrumentsWs.INSTRUMENTSWSMAP, CoinEnums.STATE.name(), OrderParamEnums.STATE_4.getValue());
                 return OrderParamEnums.OUT.getValue();
             }
             // 判断抗压
@@ -102,9 +104,10 @@
             }
         }
 
-        BigDecimal ordFrozImr = WsMapBuild.parseBigDecimalSafe(AccountWs.ACCOUNTWSMAP.get("imr"));
+        BigDecimal ordFrozImr = PositionsWs.POSITIONSWSMAP.get("imr");
         if (BigDecimal.ZERO.compareTo( ordFrozImr) >= 0) {
             log.error("占用保证金为零,进行初始化订单");
+            WsMapBuild.saveStringToMap(InstrumentsWs.INSTRUMENTSWSMAP, CoinEnums.STATE.name(), OrderParamEnums.STATE_4.getValue());
             return OrderParamEnums.INIT.getValue();
         }
         // 判断是否保证金超标
@@ -141,6 +144,7 @@
                 if (kaiCang != null && markPx.compareTo(kaiCang.getValue()) <= 0 && avgPx.compareTo(kaiCang.getValue()) >= 0) {
                     log.info("开始加仓...开仓队列价格大于当前价格{}>{}", kaiCang.getValue(), markPx);
                     WsMapBuild.saveStringToMap(OrderInfoWs.ORDERINFOWSMAP, "orderPrice",String.valueOf(kaiCang.getValue()));
+                    WsMapBuild.saveStringToMap(InstrumentsWs.INSTRUMENTSWSMAP, CoinEnums.STATE.name(), OrderParamEnums.STATE_4.getValue());
                     return OrderParamEnums.BUY.getValue();
                 } else {
                     log.info("未触发加仓......,等待");
@@ -169,6 +173,7 @@
                         BigDecimal realizedPnlValueZheng = realizedPnlValue.multiply(new BigDecimal("-1"));
                         if (uplValue.compareTo(realizedPnlValue) > 0 && uplValue.compareTo(imrValue.add(realizedPnlValueZheng))  >= 0) {
                             log.info("当前未实现盈亏:{}大于预计收益>{},赚钱咯", uplValue, imrValue);
+                            WsMapBuild.saveStringToMap(InstrumentsWs.INSTRUMENTSWSMAP, CoinEnums.STATE.name(), OrderParamEnums.STATE_4.getValue());
                             return OrderParamEnums.SELL.getValue();
                         }else{
                             log.info("当前未实现盈亏:{}没有大于预计收益>{},钱在路上了", uplValue, imrValue);
@@ -177,6 +182,7 @@
                     }else {
                         if (uplValue.compareTo(imrValue)  >= 0) {
                             log.info("当前未实现盈亏:{}大于预计收益>{},赚钱咯", uplValue, imrValue);
+                            WsMapBuild.saveStringToMap(InstrumentsWs.INSTRUMENTSWSMAP, CoinEnums.STATE.name(), OrderParamEnums.STATE_4.getValue());
                             return OrderParamEnums.SELL.getValue();
                         }else{
                             log.info("当前未实现盈亏:{}没有大于预计收益>{},钱在路上了", uplValue, imrValue);
diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/AccountWs.java b/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/AccountWs.java
index 8ea29ad..5ff8c24 100644
--- a/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/AccountWs.java
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/AccountWs.java
@@ -88,7 +88,7 @@
                         String availBalKey = "availBal";
                         String cashBalKey = "cashBal";
                         String eqKey = "eq";
-                        String imrKey = "imr";
+                        String uplKey = "upl";
 
                         String ccy = WsMapBuild.parseStringSafe( detail.getString(ccyKey));
                         WsMapBuild.saveStringToMap(ACCOUNTWSMAP, ccyKey, ccy);
@@ -102,8 +102,8 @@
                         String eq = WsMapBuild.parseStringSafe(detail.getString(eqKey));
                         WsMapBuild.saveStringToMap(ACCOUNTWSMAP, eqKey, eq);
 
-                        String imr = WsMapBuild.parseStringSafe(detail.getString(imrKey));
-                        WsMapBuild.saveStringToMap(ACCOUNTWSMAP, imrKey, imr);
+                        String upl = WsMapBuild.parseStringSafe(detail.getString(uplKey));
+                        WsMapBuild.saveStringToMap(ACCOUNTWSMAP, uplKey, upl);
 
                         BigDecimal cashBalDecimal = WsMapBuild.parseBigDecimalSafe(cashBal);
                         if (cashBalDecimal.compareTo(BigDecimal.ZERO) == 0) {
@@ -118,8 +118,8 @@
                         WsMapBuild.saveStringToMap(ACCOUNTWSMAP, CoinEnums.TOTAL_ORDER_USDT.name(), String.valueOf(totalOrderUsdt));
 
                         log.info(
-                                "账户详情-币种: {}, 可用余额: {}, 现金余额: {}, 余额: {}, 占用保证金: {}, 下单总保证金: {}",
-                                ccy, availBal, cashBal, eq, imr, totalOrderUsdt
+                                "账户详情-币种: {}, 可用余额: {}, 现金余额: {}, 余额: {}, 全仓未实现盈亏: {}, 下单总保证金: {}",
+                                ccy, availBal, cashBal, eq, upl, totalOrderUsdt
                         );
                     }
                 } catch (Exception innerEx) {
diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/OrderInfoWs.java b/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/OrderInfoWs.java
index eb4b3be..8397056 100644
--- a/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/OrderInfoWs.java
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/OrderInfoWs.java
@@ -93,7 +93,6 @@
                                 && clOrdId.equals(clOrdIdStr)
                                 && StrUtil.isNotBlank(stateStr)
                                 && state.equals(stateStr)
-                                && !CoinEnums.ORDER_LIVE.getCode().equals(state)
                 ){
                     //记录成交均价
                     if (StrUtil.isBlank(ORDERINFOWSMAP.get("orderPrice"))){
diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/TradeOrderWs.java b/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/TradeOrderWs.java
index 4b7d7d8..a5ed3a2 100644
--- a/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/TradeOrderWs.java
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/TradeOrderWs.java
@@ -83,8 +83,6 @@
             WsMapBuild.saveStringToMap(TRADEORDERWSMAP, "clOrdId", connId);
             WsMapBuild.saveStringToMap(TRADEORDERWSMAP, "state", CoinEnums.ORDER_FILLED.getCode());
 
-            WsMapBuild.saveStringToMap(InstrumentsWs.INSTRUMENTSWSMAP, CoinEnums.STATE.name(), OrderParamEnums.STATE_4.getValue());
-
         } catch (Exception e) {
             log.error("下单构建失败", e);
         }

--
Gitblit v1.9.1