From d72997698bfc1a1582e10928e75a4353766c5b3c Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Tue, 07 Jul 2026 21:47:20 +0800
Subject: [PATCH] fix(gateApi): 止盈触发时不撤销止损的逻辑
---
src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java | 44 ++++++++++++++++++++++++++++++++++++++++----
1 files changed, 40 insertions(+), 4 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..b19b33f 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();
@@ -596,7 +599,7 @@
if (longTpElem != null && StrUtil.isNotEmpty(tradeId) && !tradeId.equals("0")) {
longTakeProfitTraderIdParam(longTpElem, null, false);
log.info("[Gate] 多仓止盈触发 gridId:{}, orderId:{}", longTpElem.getId(), orderId);
- cancelFarthestLongStopLoss();
+// cancelFarthestLongStopLoss();
// checkLastTakeProfitAndRestart();
return;
}
@@ -605,7 +608,7 @@
if (shortTpElem != null && StrUtil.isNotEmpty(tradeId) && !tradeId.equals("0")) {
shortTakeProfitTraderIdParam(shortTpElem, null, false);
log.info("[Gate] 空仓止盈触发 gridId:{}, orderId:{}", shortTpElem.getId(), orderId);
- cancelFarthestShortStopLoss();
+// cancelFarthestShortStopLoss();
// checkLastTakeProfitAndRestart();
return;
}
@@ -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