From a0e7f5356940ed12e14f413db96ad0738a9d6499 Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Tue, 07 Jul 2026 16:13:01 +0800
Subject: [PATCH] feat(gateApi): 添加首次挂单成交逻辑处理和止盈单管理功能

---
 src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java |   40 ++++++++++++++++++++++++++++++++++++++--
 1 files changed, 38 insertions(+), 2 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..0975e60 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();
@@ -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) {

--
Gitblit v1.9.1