Administrator
2026-09-23 faeecfc63c04c155973fcdf91ac61e38c88c2e06
src/main/java/com/xcong/excoin/modules/gateApi/GateConfigPersistenceService.java
@@ -93,7 +93,7 @@
                .priceScale(GateWebSocketClientManager.DEFAULT_PRICE_SCALE)
                .contractMultiplier(new BigDecimal(GateWebSocketClientManager.DEFAULT_CONTRACT_MULTIPLIER))
                .unrealizedPnlPriceMode(GateConfig.PnLPriceMode.valueOf(GateWebSocketClientManager.DEFAULT_PNL_MODE))
                .isProduction(true)
                .isProduction(false)
                .reopenMaxRetries(GateWebSocketClientManager.DEFAULT_REOPEN_MAX_RETRIES)
                // 可调参数 — 从 DTO 读取
                .gridRate(nvl(dto.getGridRate(), new BigDecimal("0.005")))
@@ -111,6 +111,12 @@
                .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)
                .build();
    }
@@ -140,4 +146,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;
        }
    }
}