From e0400d73d35bf27dedddc46de2f145212f819e8a Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Sat, 11 Jul 2026 14:46:52 +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