Administrator
2026-09-30 58db9c48e6f726dca46c37823d3deb3b3e5fb877
refactor(gateApi): 将基础仓位止盈张数字段类型从整型改为大十进制

- 将 GateConfig 中 baseTakeProfitPerGrid 字段从 int 类型改为 BigDecimal 类型
- 更新 GateConfigDTO 中 baseTakeProfitPerGrid 字段为 BigDecimal 类型并添加小数支持说明
- 修改 GateConfigPersistenceService 中的数值比较逻辑以适配 BigDecimal 类型
- 更新 GateGridTradeService 中止盈张数计算和分配的相关实现逻辑
- 将相关 getter 和 builder 方法参数类型从 int 改为 BigDecimal
- 使用 BigDecimal.ZERO 替代数字 0 进行初始化和比较操作
4 files modified
32 ■■■■■ changed files
src/main/java/com/xcong/excoin/modules/gateApi/GateConfig.java 10 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/gateApi/GateConfigDTO.java 6 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/gateApi/GateConfigPersistenceService.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java 14 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/gateApi/GateConfig.java
@@ -140,8 +140,8 @@
    private final boolean tpTriggerOppositeAddEnabled;
    /** 对向加仓挂单数量:止盈成交后在对向挂出的开仓张数,0=不启用。默认 0 */
    private final int tpTriggerOppositeAddQuantity;
    /** 单格止盈张数:基础仓位止盈挂单时每个网格挂的止盈张数。默认 0 */
    private final int baseTakeProfitPerGrid;
    /** 单格止盈张数:基础仓位止盈挂单时每个网格挂的止盈张数,支持小数。默认 0 */
    private final BigDecimal baseTakeProfitPerGrid;
    /** 止盈网格数量:基础仓位止盈挂单的网格数量。默认 0 */
    private final int baseTakeProfitGridCount;
    /** 网格绝对步长(shortBaseEntryPrice × gridRate),运行时由队列生成逻辑设置 */
@@ -310,7 +310,7 @@
    /** @return 对向加仓挂单数量:止盈成交后在对向挂出的开仓张数 */
    public int getTpTriggerOppositeAddQuantity() { return tpTriggerOppositeAddQuantity; }
    /** @return 单格止盈张数:基础仓位止盈挂单时每个网格挂的止盈张数 */
    public int getBaseTakeProfitPerGrid() { return baseTakeProfitPerGrid; }
    public BigDecimal getBaseTakeProfitPerGrid() { return baseTakeProfitPerGrid; }
    /** @return 止盈网格数量:基础仓位止盈挂单的网格数量 */
    public int getBaseTakeProfitGridCount() { return baseTakeProfitGridCount; }
@@ -436,7 +436,7 @@
        /** 对向加仓挂单数量:止盈成交后在对向挂出的开仓张数,默认 0 */
        private int tpTriggerOppositeAddQuantity = 0;
        /** 单格止盈张数:基础仓位止盈挂单时每个网格挂的止盈张数,默认 0 */
        private int baseTakeProfitPerGrid = 0;
        private BigDecimal baseTakeProfitPerGrid = BigDecimal.ZERO;
        /** 止盈网格数量:基础仓位止盈挂单的网格数量,默认 0 */
        private int baseTakeProfitGridCount = 0;
@@ -513,7 +513,7 @@
        /** 设置对向加仓挂单数量:止盈成交后在对向挂出的开仓张数 */
        public Builder tpTriggerOppositeAddQuantity(int tpTriggerOppositeAddQuantity) { this.tpTriggerOppositeAddQuantity = tpTriggerOppositeAddQuantity; return this; }
        /** 设置单格止盈张数:基础仓位止盈挂单时每个网格挂的止盈张数 */
        public Builder baseTakeProfitPerGrid(int baseTakeProfitPerGrid) { this.baseTakeProfitPerGrid = baseTakeProfitPerGrid; return this; }
        public Builder baseTakeProfitPerGrid(BigDecimal baseTakeProfitPerGrid) { this.baseTakeProfitPerGrid = baseTakeProfitPerGrid; return this; }
        /** 设置止盈网格数量:基础仓位止盈挂单的网格数量 */
        public Builder baseTakeProfitGridCount(int baseTakeProfitGridCount) { this.baseTakeProfitGridCount = baseTakeProfitGridCount; return this; }
src/main/java/com/xcong/excoin/modules/gateApi/GateConfigDTO.java
@@ -81,8 +81,8 @@
    private Boolean tpTriggerOppositeAddEnabled;
    /** 对向加仓挂单数量:止盈成交后在对向挂出的开仓张数,0=不启用 */
    private Integer tpTriggerOppositeAddQuantity;
    /** 单格止盈张数:基础仓位止盈挂单时每个网格挂的止盈张数,0=不启用 */
    private Integer baseTakeProfitPerGrid;
    /** 单格止盈张数:基础仓位止盈挂单时每个网格挂的止盈张数,支持小数,0=不启用 */
    private BigDecimal baseTakeProfitPerGrid;
    /** 止盈网格数量:基础仓位止盈挂单的网格数量,0=不启用 */
    private Integer baseTakeProfitGridCount;
@@ -198,7 +198,7 @@
                .shortStopLossPrice(null)
                .tpTriggerOppositeAddEnabled(false)
                .tpTriggerOppositeAddQuantity(0)
                .baseTakeProfitPerGrid(0)
                .baseTakeProfitPerGrid(BigDecimal.ZERO)
                .baseTakeProfitGridCount(0)
                .build();
    }
src/main/java/com/xcong/excoin/modules/gateApi/GateConfigPersistenceService.java
@@ -117,7 +117,7 @@
                .shortStopLossPrice(dto.getShortStopLossPrice())
                .tpTriggerOppositeAddEnabled(nvl(dto.getTpTriggerOppositeAddEnabled(), false))
                .tpTriggerOppositeAddQuantity(dto.getTpTriggerOppositeAddQuantity() != null && dto.getTpTriggerOppositeAddQuantity() > 0 ? dto.getTpTriggerOppositeAddQuantity() : 0)
                .baseTakeProfitPerGrid(dto.getBaseTakeProfitPerGrid() != null && dto.getBaseTakeProfitPerGrid() > 0 ? dto.getBaseTakeProfitPerGrid() : 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();
    }
src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
@@ -3053,9 +3053,9 @@
     * @param entryGridId 入场网格 ID
     */
    private void placeBaseTakeProfit(int posSize, boolean isLong, int entryGridId) {
        int perGrid = config.getBaseTakeProfitPerGrid();
        BigDecimal perGrid = config.getBaseTakeProfitPerGrid();
        int gridCount = config.getBaseTakeProfitGridCount();
        if (perGrid <= 0 || gridCount <= 0) {
        if (perGrid == null || perGrid.compareTo(BigDecimal.ZERO) <= 0 || gridCount <= 0) {
            return;
        }
        int baseQty = Integer.parseInt(config.getBaseQuantity());
@@ -3078,10 +3078,10 @@
        // 分配范围到止损位的前一格截止(与分散止盈一致)
        int endId = endElem.getId() - dir;
        int remaining = maxQty;
        BigDecimal remaining = BigDecimal.valueOf(maxQty);
        int placed = 0;
        int id = startId;
        while (placed < gridCount && remaining > 0) {
        while (placed < gridCount && remaining.compareTo(BigDecimal.ZERO) > 0) {
            if (isLong ? id > endId : id < endId) {
                break;
            }
@@ -3089,11 +3089,11 @@
            if (elem == null) {
                break;
            }
            int qty = Math.min(perGrid, remaining);
            BigDecimal qty = perGrid.min(remaining);
            final GridElement fe = elem;
            final int gid = id;
            final BigDecimal triggerPrice = elem.getGridPrice();
            final String size = isLong ? negate(String.valueOf(qty)) : String.valueOf(qty);
            final String size = isLong ? negate(qty.toPlainString()) : qty.toPlainString();
            final String orderType = isLong ? ORDER_TYPE_CLOSE_LONG : ORDER_TYPE_CLOSE_SHORT;
            final FuturesPriceTrigger.RuleEnum rule = isLong ? FuturesPriceTrigger.RuleEnum.NUMBER_1
                    : FuturesPriceTrigger.RuleEnum.NUMBER_2;
@@ -3108,7 +3108,7 @@
                                isLong ? "多仓" : "空仓", gid, triggerPrice, size, profitId);
                    }
            );
            remaining -= qty;
            remaining = remaining.subtract(qty);
            placed++;
            id += dir;
        }