From d524259695305ef8e9c8380720957231632781c7 Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Tue, 07 Jul 2026 16:13:40 +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