From f99dee2edbbc0cc1c8003b7a32e5a52759dec098 Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Sat, 11 Jul 2026 14:46:30 +0800
Subject: [PATCH] 初始化开仓撤销挂止盈单

---
 src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java |  132 ++++++++++++++++++++++++++++----------------
 1 files changed, 84 insertions(+), 48 deletions(-)

diff --git a/src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java b/src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
index ccacbc0..4ae1acd 100644
--- a/src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
+++ b/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();
@@ -394,18 +397,18 @@
 
         checkProfitAndReset();
 
-//        if (state == StrategyState.ACTIVE &&
-//                longActive == false &&
-//                    longPositionSize.compareTo(BigDecimal.ZERO) == 0){
-//            processShortGrid(closePrice);
-//        }
-//
-//
-//        if (state == StrategyState.ACTIVE &&
-//                shortActive == false &&
-//                        shortPositionSize.compareTo(BigDecimal.ZERO) == 0){
-//            processLongGrid(closePrice);
-//        }
+        if (state == StrategyState.ACTIVE &&
+                longActive == false &&
+                    longPositionSize.compareTo(BigDecimal.ZERO) == 0){
+            processShortGrid(closePrice);
+        }
+
+
+        if (state == StrategyState.ACTIVE &&
+                shortActive == false &&
+                        shortPositionSize.compareTo(BigDecimal.ZERO) == 0){
+            processLongGrid(closePrice);
+        }
     }
 
     /** Gate 永续合约 taker 费率 0.05% */
@@ -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 本地缓存取最大值兜底
@@ -864,42 +877,42 @@
             baseGridElement.setShortOrderId(baseShortTraderParam.getEntryOrderId());
             baseGridElement.setHasShortOrder(true);
 
-            // 空仓止损对应的多仓止盈:多仓止盈挂在ID=3
-            int tpGridIdLong = 3;
-            GridElement tpElemLong = GridElement.findById(tpGridIdLong);
-            BigDecimal triggerPriceLong = tpElemLong.getGridPrice();
-            String sizeLong = config.getQuantity();
-            executor.placeTakeProfit(
-                    triggerPriceLong,
-                    FuturesPriceTrigger.RuleEnum.NUMBER_1,
-                    ORDER_TYPE_CLOSE_LONG,
-                    negate(sizeLong),
-                    profitId -> {
-                        tpElemLong.setLongTakeProfitOrderId(profitId);
-                        GridElement.refreshIndices();
-                        log.info("[Gate] 多仓止盈已挂(gridId:{}多止盈), 触发价:{}, takeProfitId:{}",
-                                tpGridIdLong, triggerPriceLong, profitId);
-                    }
-            );
-
-
-            // 多仓止损对应的空仓止盈:空仓止盈挂在ID=-3
-            int tpGridIdShort = -3;
-            GridElement tpElemShort = GridElement.findById(tpGridIdShort);
-            BigDecimal triggerPriceShort = tpElemShort.getGridPrice();
-            String sizeShort = config.getQuantity();
-            executor.placeTakeProfit(
-                    triggerPriceShort,
-                    FuturesPriceTrigger.RuleEnum.NUMBER_2,
-                    ORDER_TYPE_CLOSE_SHORT,
-                    sizeShort,
-                    profitId -> {
-                        tpElemShort.setShortTakeProfitOrderId(profitId);
-                        GridElement.refreshIndices();
-                        log.info("[Gate] 空仓止盈已挂(gridId:{}空止盈), 触发价:{}, takeProfitId:{}",
-                                tpGridIdShort, triggerPriceShort, profitId);
-                    }
-            );
+//            // 空仓止损对应的多仓止盈:多仓止盈挂在ID=3
+//            int tpGridIdLong = 3;
+//            GridElement tpElemLong = GridElement.findById(tpGridIdLong);
+//            BigDecimal triggerPriceLong = tpElemLong.getGridPrice();
+//            String sizeLong = config.getBaseQuantity();
+//            executor.placeTakeProfit(
+//                    triggerPriceLong,
+//                    FuturesPriceTrigger.RuleEnum.NUMBER_1,
+//                    ORDER_TYPE_CLOSE_LONG,
+//                    negate(sizeLong),
+//                    profitId -> {
+//                        tpElemLong.setLongTakeProfitOrderId(profitId);
+//                        GridElement.refreshIndices();
+//                        log.info("[Gate] 多仓止盈已挂(gridId:{}多止盈), 触发价:{}, takeProfitId:{}",
+//                                tpGridIdLong, triggerPriceLong, profitId);
+//                    }
+//            );
+//
+//
+//            // 多仓止损对应的空仓止盈:空仓止盈挂在ID=-3
+//            int tpGridIdShort = -3;
+//            GridElement tpElemShort = GridElement.findById(tpGridIdShort);
+//            BigDecimal triggerPriceShort = tpElemShort.getGridPrice();
+//            String sizeShort = config.getBaseQuantity();
+//            executor.placeTakeProfit(
+//                    triggerPriceShort,
+//                    FuturesPriceTrigger.RuleEnum.NUMBER_2,
+//                    ORDER_TYPE_CLOSE_SHORT,
+//                    sizeShort,
+//                    profitId -> {
+//                        tpElemShort.setShortTakeProfitOrderId(profitId);
+//                        GridElement.refreshIndices();
+//                        log.info("[Gate] 空仓止盈已挂(gridId:{}空止盈), 触发价:{}, takeProfitId:{}",
+//                                tpGridIdShort, triggerPriceShort, profitId);
+//                    }
+//            );
 
 //            int shortTime = 2;
 //            GridElement elemShort = GridElement.findById(shortTime);
@@ -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) {

--
Gitblit v1.9.1