From 6775730a44ad9a564a0f6038f4d0b5e11e21833e Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Mon, 08 Jun 2026 13:07:44 +0800
Subject: [PATCH] fix(gateApi): 修复网格交易盈亏计算逻辑

---
 src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java |   28 +++++++++++++++++-----------
 1 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java b/src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
index 352f61d..1076394 100644
--- a/src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
+++ b/src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
@@ -793,7 +793,7 @@
                 shortEntryQty = 1;
                 extendShortStopLoss(filledQty);
                 log.info("[Gate] 空单成交 gridId:{}, qty:{}, 追挂止损", shortGridElement.getId(), filledQty);
-                checkMaxPositionAndPlaceTakeProfit(false, shortGridElement.getId());
+//                checkMaxPositionAndPlaceTakeProfit(false, shortGridElement.getId());
             }
         }
         GridElement longGridElement = GridElement.findByLongOrderId(orderId);
@@ -804,7 +804,7 @@
                 longEntryQty = 1;
                 extendLongStopLoss(filledQty);
                 log.info("[Gate] 多单成交 gridId:{}, qty:{}, 追挂止损", longGridElement.getId(), filledQty);
-                checkMaxPositionAndPlaceTakeProfit(true, longGridElement.getId());
+//                checkMaxPositionAndPlaceTakeProfit(true, longGridElement.getId());
             }
         }
     }
@@ -928,7 +928,8 @@
             baseGridElement.setShortOrderId(baseShortTraderParam.getEntryOrderId());
             baseGridElement.setHasShortOrder(true);
 
-            for (int id = 2; id <= 11; id++) {
+            int shortTime = Integer.parseInt(config.getBaseQuantity()) + 1;
+            for (int id = 2; id <= shortTime; id++) {
                 GridElement elem = GridElement.findById(id);
                 if (elem == null) {
                     continue;
@@ -948,7 +949,9 @@
                 );
             }
 
-            for (int id = -2; id >= -11; id--) {
+
+            int longTime = Integer.parseInt(config.getBaseQuantity()) + 1;
+            for (int id = -2; id >= -longTime; id--) {
                 GridElement elem = GridElement.findById(id);
                 if (elem == null) {
                     continue;
@@ -968,7 +971,7 @@
                 );
             }
 
-            log.info("[Gate] 止损单已全部挂完, 空仓止损: 2~11, 多仓止损: -2~-11");
+            log.info("[Gate] 止损单已全部挂完, 空仓止损: 2~{}, 多仓止损: -2~-{}", shortTime, longTime);
             state = StrategyState.ACTIVE;
         }
     }
@@ -1559,20 +1562,22 @@
                 }
 
                 BigDecimal tpPrice = nextGrid.getGridPrice();
+                final long finalPosSize = actualPosSize;
+                final int finalNextGridId = nextGridId;
                 if (isLong) {
                     executor.placeTakeProfit(tpPrice,
                             FuturesPriceTrigger.RuleEnum.NUMBER_1,
                             ORDER_TYPE_CLOSE_LONG,
                             negate(config.getQuantity()),
                             profitId -> log.info("[Gate] 多仓超限止盈已挂(持仓:{})>, gridId:{}, tpPrice:{}, id:{}",
-                                    actualPosSize, nextGridId, tpPrice, profitId));
+                                    finalPosSize, finalNextGridId, tpPrice, profitId));
                 } else {
                     executor.placeTakeProfit(tpPrice,
                             FuturesPriceTrigger.RuleEnum.NUMBER_2,
                             ORDER_TYPE_CLOSE_SHORT,
                             config.getQuantity(),
                             profitId -> log.info("[Gate] 空仓超限止盈已挂(持仓:{})>, gridId:{}, tpPrice:{}, id:{}",
-                                    actualPosSize, nextGridId, tpPrice, profitId));
+                                    finalPosSize, finalNextGridId, tpPrice, profitId));
                 }
             } catch (Exception e) {
                 log.warn("[Gate] 通过API查询持仓超限检查失败", e);
@@ -1593,14 +1598,15 @@
             BigDecimal totalEquity = unrealisedPnl.add(available);
 
             // 估算平仓手续费:(多仓张数+空仓张数) × 合约面值 × 当前价 × taker费率
-            BigDecimal closeContractValue = longPositionSize.add(shortPositionSize)
-                    .multiply(CT_VAL).multiply(lastKlinePrice != null ? lastKlinePrice : BigDecimal.ZERO);
+            BigDecimal totalSize = longPositionSize.abs().add(shortPositionSize.abs());
+            BigDecimal closeContractValue =
+                    totalSize.multiply(CT_VAL).multiply(lastKlinePrice != null ? lastKlinePrice : BigDecimal.ZERO);
             BigDecimal estimatedFee = closeContractValue.multiply(TAKER_FEE_RATE);
             BigDecimal netEquity = totalEquity.subtract(estimatedFee);
 
             BigDecimal target = initialPrincipal.add(config.getExpectedProfit());
-            log.info("[Gate] 盈亏检查 upl:{}, avail:{}, 合计:{}, 估手续费:{}, 净权益:{}, 目标:{}",
-                    unrealisedPnl, available, totalEquity, estimatedFee, netEquity, target);
+            log.info("[Gate] 盈亏检查,总张数:{}, upl:{}, avail:{}, 合计:{}, 估手续费:{}, 净权益:{}, 目标:{}",
+                    totalSize,unrealisedPnl, available, totalEquity, estimatedFee, netEquity, target);
             if (netEquity.compareTo(target) > 0) {
                 log.info("[Gate] 盈亏达标(净权益{}>目标{}),重置策略", netEquity, target);
                 state = StrategyState.STOPPED;

--
Gitblit v1.9.1