Administrator
2026-07-15 a6a2a828465d72874a32562cb84cd12a53b0a013
refactor(gateApi): 优化网格交易服务中的止损逻辑

- 移除多头和空头的网格重复触发计数器变量
- 简化止损触发时的网格ID比较逻辑
- 更新止损次数统计方式,移除重复计数相关代码
- 修改目标数量计算逻辑,统一处理同网格情况
- 优化日志输出格式,添加同网格标识信息
- 清理初始化方法中的多余变量重置操作
1 files modified
34 ■■■■ changed files
src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java 34 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
@@ -138,10 +138,6 @@
    private volatile int accumulatedLongLossCount = 0;
    /** 空头累计止损次数(始终递增,加仓订单成交后归零) */
    private volatile int accumulatedShortLossCount = 0;
    /** 多头当前网格重复触发次数(换网格时归零),用于 targetAmount 扣除 */
    private volatile int longSameGridRepeatCount = 0;
    /** 空头当前网格重复触发次数(换网格时归零),用于 targetAmount 扣除 */
    private volatile int shortSameGridRepeatCount = 0;
    /** 最近触发止损的多头网格ID */
    private volatile int lastLongStopLossGridId = Integer.MAX_VALUE;
    /** 最近触发止损的空头网格ID */
@@ -315,8 +311,6 @@
        shortActive = false;
        accumulatedLongLossCount = 0;
        accumulatedShortLossCount = 0;
        longSameGridRepeatCount = 0;
        shortSameGridRepeatCount = 0;
        lastLongStopLossGridId = Integer.MAX_VALUE;
        lastShortStopLossGridId = Integer.MAX_VALUE;
        shortPriceQueue.clear();
@@ -640,7 +634,6 @@
                int filledQty = Integer.parseInt(shortGridElement.getShortTraderParam().getQuantity());
                shortEntryTraderIdParam(shortGridElement, orderId, false);
                accumulatedShortLossCount = 0;
                shortSameGridRepeatCount = 0;
                lastShortStopLossGridId = Integer.MAX_VALUE;
                // [Gate-需求2] 加仓后先撤空仓所有止盈+止损,再查交易所持仓后重挂
                cancelAllShortTakeProfitsAndStopLosses();
@@ -706,7 +699,6 @@
                int filledQty = Integer.parseInt(longGridElement.getLongTraderParam().getQuantity());
                longEntryTraderIdParam(longGridElement, orderId, false);
                accumulatedLongLossCount = 0;
                longSameGridRepeatCount = 0;
                lastLongStopLossGridId = Integer.MAX_VALUE;
                // [Gate-需求2] 加仓后先撤多仓所有止盈+止损,再查交易所持仓后重挂
                cancelAllLongTakeProfitsAndStopLosses();
@@ -1297,14 +1289,11 @@
        gridElement.removeLongStopLossOrderId(orderId);
        int gridId = gridElement.getId();
        boolean sameGrid = (gridId == lastLongStopLossGridId);
        accumulatedLongLossCount++;
        if (gridId == lastLongStopLossGridId) {
            longSameGridRepeatCount++;
        } else {
            longSameGridRepeatCount = 0;
            lastLongStopLossGridId = gridId;
        }
        log.info("[Gate] 多仓止损触发 gridId:{}, 止损次数:{}, 开始追单", gridId, accumulatedLongLossCount);
        lastLongStopLossGridId = gridId;
        log.info("[Gate] 多仓止损触发 gridId:{}, 止损次数:{}{}, 开始追单",
                gridId, accumulatedLongLossCount, sameGrid ? "(同网格)" : "");
        int newEntryGridId = gridId + 1;
        GridElement newEntryGrid = GridElement.findById(newEntryGridId);
@@ -1318,7 +1307,7 @@
        BigDecimal triggerPrice = newEntryGrid.getGridPrice();
        int posSize = Math.min(queryPositionSize(Position.ModeEnum.DUAL_LONG), longPositionSize.intValue());
        int maxPos = config.getMaxPositionSize();
        int targetAmount = accumulatedLongLossCount - longSameGridRepeatCount + 1;
        int targetAmount = sameGrid ? Integer.parseInt(config.getQuantity()) : accumulatedLongLossCount + 1;
        int addSize;
        if (maxPos > 0) {
            int remainingRoom = maxPos - posSize;
@@ -1376,14 +1365,11 @@
        gridElement.removeShortStopLossOrderId(orderId);
        int gridId = gridElement.getId();
        boolean sameGrid = (gridId == lastShortStopLossGridId);
        accumulatedShortLossCount++;
        if (gridId == lastShortStopLossGridId) {
            shortSameGridRepeatCount++;
        } else {
            shortSameGridRepeatCount = 0;
            lastShortStopLossGridId = gridId;
        }
        log.info("[Gate] 空仓止损触发 gridId:{}, 止损次数:{}, 开始追单", gridId, accumulatedShortLossCount);
        lastShortStopLossGridId = gridId;
        log.info("[Gate] 空仓止损触发 gridId:{}, 止损次数:{}{}, 开始追单",
                gridId, accumulatedShortLossCount, sameGrid ? "(同网格)" : "");
        int newEntryGridId = gridId - 1;
        GridElement newEntryGrid = GridElement.findById(newEntryGridId);
@@ -1397,7 +1383,7 @@
        BigDecimal triggerPrice = newEntryGrid.getGridPrice();
        int posSize = Math.min(queryPositionSize(Position.ModeEnum.DUAL_SHORT), shortPositionSize.intValue());
        int maxPos = config.getMaxPositionSize();
        int targetAmount = accumulatedShortLossCount - shortSameGridRepeatCount + 1;
        int targetAmount = sameGrid ? Integer.parseInt(config.getQuantity()) : accumulatedShortLossCount + 1;
        int addSize;
        if (maxPos > 0) {
            int remainingRoom = maxPos - posSize;