From 9c95b584fb82289f199ae554ea92f5494e39a945 Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Wed, 07 Jan 2026 14:50:46 +0800
Subject: [PATCH] fix(okxNewPrice): 修复价格计算逻辑

---
 src/main/java/com/xcong/excoin/modules/okxNewPrice/OkxNewPriceWebSocketClient.java |   62 +++++++++++++++++++++++--------
 1 files changed, 46 insertions(+), 16 deletions(-)

diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/OkxNewPriceWebSocketClient.java b/src/main/java/com/xcong/excoin/modules/okxNewPrice/OkxNewPriceWebSocketClient.java
index 6497857..6d2bf5f 100644
--- a/src/main/java/com/xcong/excoin/modules/okxNewPrice/OkxNewPriceWebSocketClient.java
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/OkxNewPriceWebSocketClient.java
@@ -4,12 +4,16 @@
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.xcong.excoin.modules.okxNewPrice.celue.CaoZuoService;
+import com.xcong.excoin.modules.okxNewPrice.okxWs.AccountWs;
+import com.xcong.excoin.modules.okxNewPrice.okxWs.PositionsWs;
 import com.xcong.excoin.modules.okxNewPrice.okxWs.TradeOrderWs;
 import com.xcong.excoin.modules.okxNewPrice.okxWs.enums.CoinEnums;
+import com.xcong.excoin.modules.okxNewPrice.okxWs.enums.OrderParamEnums;
 import com.xcong.excoin.modules.okxNewPrice.okxWs.param.TradeRequestParam;
 import com.xcong.excoin.modules.okxNewPrice.okxWs.wanggeList.WangGeListEnum;
 import com.xcong.excoin.modules.okxNewPrice.okxWs.wanggeList.WangGeListService;
 import com.xcong.excoin.modules.okxNewPrice.utils.SSLConfig;
+import com.xcong.excoin.modules.okxNewPrice.utils.WsMapBuild;
 import com.xcong.excoin.utils.RedisUtils;
 import java.math.BigDecimal;
 import lombok.extern.slf4j.Slf4j;
@@ -292,6 +296,8 @@
      */
     private void triggerQuantOperations(String markPx) {
         try {
+
+            markPx = String.valueOf(new BigDecimal(markPx).add(new BigDecimal("20")));
             // 1. 判断当前价格属于哪个网格
             WangGeListEnum gridByPriceNew = WangGeListEnum.getGridByPrice(new BigDecimal(markPx));
             if (gridByPriceNew == null) {
@@ -312,24 +318,48 @@
             for (OkxQuantWebSocketClient client : clientManager.getAllClients()) {
                 String accountName = client.getAccountName();
                 if (accountName != null) {
-                    /**
-                     * 处理历史网格的订单
-                     * 根据历史网格的开单方向,是否需要止损处理
-                     *      如果方向一致就不需要处理
-                     *      如果不一致则需要处理
-                     */
+                    log.error("当前价格{}属于网格: {}-{}({}-{})", markPx, gridByPriceNew.getName(),gridByPriceNew.getFang_xiang(), gridByPriceNew.getJiage_xiaxian(), gridByPriceNew.getJiage_shangxian());
+                    //处理历史网格信息
                     String fangXiang = gridByPriceNew.getFang_xiang();
-                    String fangXiangOld = CoinEnums.POSSIDE_LONG.equals(fangXiang) ? CoinEnums.POSSIDE_SHORT.getCode() : CoinEnums.POSSIDE_LONG.getCode();
-                    log.info("历史网格方向为:{}", fangXiangOld);
-                    if (!fangXiang.equals(fangXiangOld)){
-                        TradeRequestParam tradeRequestParamOld = caoZuoService.caoZuoZhiSunEvent(accountName, markPx, fangXiangOld);
-                        TradeOrderWs.orderEvent(client.getWebSocketClient(), tradeRequestParamOld);
+                    String posSideOld = null;
+                    if (CoinEnums.POSSIDE_LONG.getCode().equals(fangXiang)) {
+                        posSideOld = CoinEnums.POSSIDE_SHORT.getCode();
+                    }
+                    if (CoinEnums.POSSIDE_SHORT.getCode().equals(fangXiang)) {
+                        posSideOld = CoinEnums.POSSIDE_LONG.getCode();
                     }
 
-                    /**
-                     * 处理当前网格的订单,触发量化操作
-                     */
-                    log.info("当前价格{}属于网格: {}-{}({}-{})", markPx, gridByPriceNew.getName(),gridByPriceNew.getFang_xiang(), gridByPriceNew.getJiage_xiaxian(), gridByPriceNew.getJiage_shangxian());
+                    String positionAccountName = PositionsWs.initAccountName(accountName, posSideOld);
+                    // 判断是否保证金超标
+                    if (
+                            PositionsWs.getAccountMap(positionAccountName).get("pos") != null
+                            && PositionsWs.getAccountMap(positionAccountName).get("pos").compareTo(BigDecimal.ZERO) > 0
+                        ){
+                        BigDecimal avgPx = PositionsWs.getAccountMap(positionAccountName).get("avgPx");
+                        WangGeListEnum gridByPriceOld = WangGeListEnum.getGridByPrice(avgPx);
+                        if (gridByPriceOld != null){
+                            String zhiSunDian = gridByPriceOld.getZhi_sun_dian();
+                            if (CoinEnums.POSSIDE_SHORT.getCode().equals(posSideOld)) {
+                                boolean flag = new BigDecimal(markPx).compareTo(new BigDecimal(zhiSunDian)) > 0;
+                                log.error("{}历史网格方向{},当前价格大于止损点{}",gridByPriceOld.name(),posSideOld,flag);
+                                if (flag){
+                                    TradeRequestParam tradeRequestParam = caoZuoService.caoZuoZhiSunEvent(accountName, markPx, posSideOld);
+                                    TradeOrderWs.orderEvent(client.getWebSocketClient(), tradeRequestParam);
+
+                                }
+                            }
+                            if (CoinEnums.POSSIDE_LONG.getCode().equals(posSideOld)) {
+                                boolean flag = new BigDecimal(markPx).compareTo(new BigDecimal(zhiSunDian)) < 0;
+                                log.error("{}历史网格方向{},当前价格小于止损点{}",gridByPriceOld.name(),posSideOld,flag);
+                                if (flag){
+                                    TradeRequestParam tradeRequestParam = caoZuoService.caoZuoZhiSunEvent(accountName, markPx, posSideOld);
+                                    TradeOrderWs.orderEvent(client.getWebSocketClient(), tradeRequestParam);
+                                }
+                            }
+                        }
+                    }
+
+                    //当前下单
                     wangGeListService.initWangGe(markPx);
                     TradeRequestParam tradeRequestParam = caoZuoService.caoZuoHandler(accountName, markPx, gridByPriceNew.getFang_xiang());
                     TradeOrderWs.orderEvent(client.getWebSocketClient(), tradeRequestParam);
@@ -430,7 +460,7 @@
      */
     private void reconnectWithBackoff() throws InterruptedException {
         int attempt = 0;
-        int maxAttempts = 5;
+        int maxAttempts = 3;
         long delayMs = 5000;
 
         while (attempt < maxAttempts) {

--
Gitblit v1.9.1