From 0db8a974cc56dfe7fd10b648d12021c9e4daaebf Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Wed, 30 Sep 2026 22:08:36 +0800
Subject: [PATCH] fix(gateApi): 修复网格交易中持仓大小计算问题

---
 src/main/java/com/xcong/excoin/modules/gateApi/GateConfigPersistenceService.java |   31 ++++++++++++++++++++++++++++++-
 1 files changed, 30 insertions(+), 1 deletions(-)

diff --git a/src/main/java/com/xcong/excoin/modules/gateApi/GateConfigPersistenceService.java b/src/main/java/com/xcong/excoin/modules/gateApi/GateConfigPersistenceService.java
index abc0bc7..78e402e 100644
--- a/src/main/java/com/xcong/excoin/modules/gateApi/GateConfigPersistenceService.java
+++ b/src/main/java/com/xcong/excoin/modules/gateApi/GateConfigPersistenceService.java
@@ -107,9 +107,18 @@
                 .priceDriveEnabled(nvl(dto.getPriceDriveEnabled(), true))
                 .rounds(dto.getRounds())
                 .stopLossCountMode(nvl(dto.getStopLossCountMode(), "dual"))
-                .addPositionInterval(dto.getAddPositionInterval() > 0 ? dto.getAddPositionInterval() : 3)
+                .addPositionInterval(dto.getAddPositionInterval() >= 0 ? dto.getAddPositionInterval() : 3)
                 .addPositionQuantity(dto.getAddPositionQuantity() > 0 ? dto.getAddPositionQuantity() : 1)
                 .maxPositionPerSide(dto.getMaxPositionPerSide())
+                .addPositionStartThreshold(dto.getAddPositionStartThreshold() >= 0 ? dto.getAddPositionStartThreshold() : 1)
+                .placeExcessTakeProfit(normalizeTakeProfitMode(dto.getPlaceExcessTakeProfit()))
+                .dualStopLossEnabled(nvl(dto.getDualStopLossEnabled(), false))
+                .longStopLossPrice(dto.getLongStopLossPrice())
+                .shortStopLossPrice(dto.getShortStopLossPrice())
+                .tpTriggerOppositeAddEnabled(nvl(dto.getTpTriggerOppositeAddEnabled(), false))
+                .tpTriggerOppositeAddQuantity(dto.getTpTriggerOppositeAddQuantity() != null && dto.getTpTriggerOppositeAddQuantity() > 0 ? dto.getTpTriggerOppositeAddQuantity() : 0)
+                .baseTakeProfitPerGrid(dto.getBaseTakeProfitPerGrid() != null && dto.getBaseTakeProfitPerGrid().compareTo(BigDecimal.ZERO) > 0 ? dto.getBaseTakeProfitPerGrid() : BigDecimal.ZERO)
+                .baseTakeProfitGridCount(dto.getBaseTakeProfitGridCount() != null && dto.getBaseTakeProfitGridCount() > 0 ? dto.getBaseTakeProfitGridCount() : 0)
                 .build();
     }
 
@@ -139,4 +148,24 @@
     private static <T> T nvl(T value, T fallback) {
         return value != null ? value : fallback;
     }
+
+    /**
+     * 归一化止盈挂单模式,兼容旧版 boolean 配置(旧 JSON 的 true/false 会被 Jackson 反序列化为字符串)。
+     */
+    private static String normalizeTakeProfitMode(String raw) {
+        if (raw == null || raw.trim().isEmpty()) {
+            return GateConfig.EXCESS_TP_OFF;
+        }
+        switch (raw.trim()) {
+            case "off":
+                return GateConfig.EXCESS_TP_OFF;
+            case "true":
+            case "concentrated":
+                return GateConfig.EXCESS_TP_CONCENTRATED;
+            case "dispersed":
+                return GateConfig.EXCESS_TP_DISPERSED;
+            default:
+                return GateConfig.EXCESS_TP_OFF;
+        }
+    }
 }

--
Gitblit v1.9.1