Administrator
12 hours ago a0e7f5356940ed12e14f413db96ad0738a9d6499
src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
@@ -138,6 +138,8 @@
    private volatile int accumulatedLongLossCount = 0;
    /** 空头累计止损张数(加仓订单成交后归零) */
    private volatile int accumulatedShortLossCount = 0;
    /** 是否首次挂单成交(初始化后重置为 true,首次成交后置 false) */
    private volatile boolean firstFillAfterInit = true;
    private volatile BigDecimal lastKlinePrice;
    private volatile BigDecimal markPrice = BigDecimal.ZERO;
@@ -307,6 +309,7 @@
        shortActive = false;
        accumulatedLongLossCount = 0;
        accumulatedShortLossCount = 0;
        firstFillAfterInit = true;
        shortPriceQueue.clear();
        longPriceQueue.clear();
        totalShortPriceQueue.clear();
@@ -628,6 +631,11 @@
            if (shortGridElement.isHasShortOrder() && StrUtil.isNotEmpty(tradeId) && !tradeId.equals("0") ){
                int filledQty = Integer.parseInt(shortGridElement.getShortTraderParam().getQuantity());
                shortEntryTraderIdParam(shortGridElement, null, false);
                // 首次挂单成交,取消初始化阶段挂的所有止盈单
                if (firstFillAfterInit) {
                    cancelAllInitialTakeProfits();
                    firstFillAfterInit = false;
                }
                // [Gate-需求2] 加仓后先撤空仓所有止盈+止损,再查交易所持仓后重挂
                cancelAllShortTakeProfitsAndStopLosses();
                // REST 查询可能因交易所延迟返回旧值,与 WS 本地缓存取最大值兜底
@@ -710,6 +718,11 @@
                int filledQty = Integer.parseInt(longGridElement.getLongTraderParam().getQuantity());
                longEntryTraderIdParam(longGridElement, null, false);
                // 首次挂单成交,取消初始化阶段挂的所有止盈单
                if (firstFillAfterInit) {
                    cancelAllInitialTakeProfits();
                    firstFillAfterInit = false;
                }
                // [Gate-需求2] 加仓后先撤多仓所有止盈+止损,再查交易所持仓后重挂
                cancelAllLongTakeProfitsAndStopLosses();
                // REST 查询可能因交易所延迟返回旧值,与 WS 本地缓存取最大值兜底
@@ -868,7 +881,7 @@
            int tpGridIdLong = 3;
            GridElement tpElemLong = GridElement.findById(tpGridIdLong);
            BigDecimal triggerPriceLong = tpElemLong.getGridPrice();
            String sizeLong = config.getQuantity();
            String sizeLong = config.getBaseQuantity();
            executor.placeTakeProfit(
                    triggerPriceLong,
                    FuturesPriceTrigger.RuleEnum.NUMBER_1,
@@ -887,7 +900,7 @@
            int tpGridIdShort = -3;
            GridElement tpElemShort = GridElement.findById(tpGridIdShort);
            BigDecimal triggerPriceShort = tpElemShort.getGridPrice();
            String sizeShort = config.getQuantity();
            String sizeShort = config.getBaseQuantity();
            executor.placeTakeProfit(
                    triggerPriceShort,
                    FuturesPriceTrigger.RuleEnum.NUMBER_2,
@@ -1648,6 +1661,29 @@
        log.info("[Gate] 已提交取消所有空仓止盈+止损");
    }
    /**
     * 首次挂单成交时,取消初始化阶段挂的所有止盈单(多+空),止损单保留不动。
     */
    private void cancelAllInitialTakeProfits() {
        GridElement tpElemLong = GridElement.findById(3);
        String longTpId = tpElemLong.getLongTakeProfitOrderId();
        if (longTpId != null) {
            longTakeProfitTraderIdParam(tpElemLong, null, false);
            executor.cancelConditionalOrder(longTpId, oid -> {});
        }
        GridElement tpElemShort = GridElement.findById(-3);
        String shortTpId = tpElemShort.getShortTakeProfitOrderId();
        if (shortTpId != null) {
            shortTakeProfitTraderIdParam(tpElemShort, null, false);
            executor.cancelConditionalOrder(shortTpId, oid -> {});
        }
        GridElement.refreshIndices();
        log.info("[Gate] 首次成交,取消所有初始化止盈单");
    }
    // ========== 止损追单 ==========
    private void extendLongStopLoss(int filledQty,int gridId) {