From c0d51fba7f4fffff503354fd84b246e884d7c685 Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Mon, 01 Jun 2026 13:48:52 +0800
Subject: [PATCH] fix(gateApi): 修复网格交易策略状态管理问题
---
src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java | 90 +++++++++++++++++++++++++--------------------
1 files changed, 50 insertions(+), 40 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 a51fb12..aafeba4 100644
--- a/src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
+++ b/src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
@@ -427,8 +427,8 @@
tryGenerateQueues();
}else {
longPositionSize = size;
- checkShortEntryOrderToCancel();
- checkLongEntryOrderToCancel();
+// checkShortEntryOrderToCancel();
+// checkLongEntryOrderToCancel();
}
} else {
if (longActive && state == StrategyState.ACTIVE) {
@@ -450,8 +450,8 @@
tryGenerateQueues();
}else {
shortPositionSize = size.abs();
- checkShortEntryOrderToCancel();
- checkLongEntryOrderToCancel();
+// checkShortEntryOrderToCancel();
+// checkLongEntryOrderToCancel();
}
} else {
if (shortActive && state == StrategyState.ACTIVE) {
@@ -734,34 +734,34 @@
return;
}
- GridElement byShortTakeProfitOrderId = GridElement.findByShortTakeProfitOrderId(orderId);
- if (byShortTakeProfitOrderId != null){
- shortTakeProfitTraderIdParam(
- byShortTakeProfitOrderId,
- null,
- false
- );
- shortEntryTraderIdParam(
- byShortTakeProfitOrderId,
- null,
- false
- );
- TPonUserTradeShortEntry(byShortTakeProfitOrderId);
- }
- GridElement byLongTakeProfitOrderId = GridElement.findByLongTakeProfitOrderId(orderId);
- if (byLongTakeProfitOrderId != null){
- longTakeProfitTraderIdParam(
- byLongTakeProfitOrderId,
- null,
- false
- );
- longEntryTraderIdParam(
- byLongTakeProfitOrderId,
- null,
- false
- );
- TPonUserTradeLongEntry(byLongTakeProfitOrderId);
- }
+// GridElement byShortTakeProfitOrderId = GridElement.findByShortTakeProfitOrderId(orderId);
+// if (byShortTakeProfitOrderId != null){
+// shortTakeProfitTraderIdParam(
+// byShortTakeProfitOrderId,
+// null,
+// false
+// );
+// shortEntryTraderIdParam(
+// byShortTakeProfitOrderId,
+// null,
+// false
+// );
+// TPonUserTradeShortEntry(byShortTakeProfitOrderId);
+// }
+// GridElement byLongTakeProfitOrderId = GridElement.findByLongTakeProfitOrderId(orderId);
+// if (byLongTakeProfitOrderId != null){
+// longTakeProfitTraderIdParam(
+// byLongTakeProfitOrderId,
+// null,
+// false
+// );
+// longEntryTraderIdParam(
+// byLongTakeProfitOrderId,
+// null,
+// false
+// );
+// TPonUserTradeLongEntry(byLongTakeProfitOrderId);
+// }
GridElement shortGridElement = GridElement.findByShortOrderId(orderId);
if (shortGridElement != null) {
@@ -1357,7 +1357,6 @@
log.info("[Gate] 多仓止损触发 gridId:{}, 开始追单", gridId);
int newEntryGridId = -(N - 1);
- int entryQty = N - 1;
GridElement newEntryGrid = GridElement.findById(newEntryGridId);
if (newEntryGrid == null) {
@@ -1377,12 +1376,16 @@
}
}
- String size = String.valueOf(entryQty);
BigDecimal triggerPrice = newEntryGrid.getGridPrice();
- log.info("[Gate] 多仓止损触发 gridId:{}, 在gridId:{}挂{}张多单", gridId, newEntryGridId, entryQty);
+ BigDecimal priceDiff = longEntryPrice.subtract(triggerPrice).abs();
+ int entryQty = priceDiff.divide(config.getStep(), 0, RoundingMode.DOWN).intValue();
+ entryQty = Math.max(1, entryQty);
+ String size = String.valueOf(entryQty);
+ log.info("[Gate] 多仓止损触发 gridId:{}, 在gridId:{}挂{}张多单, 均价:{}, 价差:{}, 步长:{}",
+ gridId, newEntryGridId, entryQty, longEntryPrice, priceDiff, config.getStep());
newEntryGrid.getLongTraderParam().setQuantity(size);
placeEntryOrderWithPreFlag(newEntryGrid, true, triggerPrice,
- FuturesPriceTrigger.RuleEnum.NUMBER_2, size);
+ FuturesPriceTrigger.RuleEnum.NUMBER_1, size);
}
private void handleShortStopLossTriggered(GridElement gridElement) {
@@ -1392,7 +1395,6 @@
log.info("[Gate] 空仓止损触发 gridId:{}, 开始追单", gridId);
int newEntryGridId = N - 1;
- int entryQty = N - 1;
GridElement newEntryGrid = GridElement.findById(newEntryGridId);
if (newEntryGrid == null) {
@@ -1412,12 +1414,18 @@
}
}
- String size = String.valueOf(entryQty);
+
+
BigDecimal triggerPrice = newEntryGrid.getGridPrice();
- log.info("[Gate] 空仓止损触发 gridId:{}, 在gridId:{}挂{}张空单", gridId, newEntryGridId, entryQty);
+ BigDecimal priceDiff = shortEntryPrice.subtract(triggerPrice).abs();
+ int entryQty = priceDiff.divide(config.getStep(), 0, RoundingMode.DOWN).intValue();
+ entryQty = Math.max(1, entryQty);
+ String size = String.valueOf(entryQty);
+ log.info("[Gate] 空仓止损触发 gridId:{}, 在gridId:{}挂{}张空单, 均价:{}, 价差:{}, 步长:{}",
+ gridId, newEntryGridId, entryQty, shortEntryPrice, priceDiff, config.getStep());
newEntryGrid.getShortTraderParam().setQuantity(size);
placeEntryOrderWithPreFlag(newEntryGrid, false, triggerPrice,
- FuturesPriceTrigger.RuleEnum.NUMBER_1, negate(size));
+ FuturesPriceTrigger.RuleEnum.NUMBER_2, negate(size));
}
private void extendLongStopLoss(int filledQty) {
@@ -1497,6 +1505,7 @@
unrealisedPnl, available, totalEquity, target);
if (totalEquity.compareTo(target) > 0) {
log.info("[Gate] 盈亏达标({}>{}),重置策略", totalEquity, target);
+ state = StrategyState.STOPPED;
closeExistingPositions();
futuresApi.cancelPriceTriggeredOrderList(SETTLE, config.getContract());
startGrid();
@@ -1507,6 +1516,7 @@
}
private void handlePositionZeroAndReset(String direction) {
+ state = StrategyState.STOPPED;
try {
futuresApi.cancelPriceTriggeredOrderList(SETTLE, config.getContract());
} catch (Exception e) {
--
Gitblit v1.9.1