From fe567e81a50a00beb1a26f70e69e923ecb3d6bb3 Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Tue, 26 May 2026 10:25:16 +0800
Subject: [PATCH] fix(grid): 修复网格交易中多空订单查找逻辑错误
---
src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java | 154 +++++++++++++++++++++++++++-----------------------
1 files changed, 83 insertions(+), 71 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 f953866..71dbafd 100644
--- a/src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
+++ b/src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
@@ -377,8 +377,8 @@
if (state != StrategyState.ACTIVE) {
return;
}
-// processLongGrid(closePrice);
-// processShortGrid(closePrice);
+ processLongGrid(closePrice);
+ processShortGrid(closePrice);
}
// ---- 仓位推送回调 ----
@@ -426,14 +426,19 @@
tryGenerateQueues();
}else {
longPositionSize = size;
- //取消多仓位线以上的开空仓挂单
- List<GridElement> allShortOrders = GridElement.findAllShortOrders(longEntryPrice);
+ List<GridElement> allShortOrders = GridElement.findAllLongOrders(longEntryPrice);
if (CollUtil.isNotEmpty(allShortOrders)){
+ GridElement keep = allShortOrders.stream()
+ .max((a, b) -> a.getGridPrice().compareTo(b.getGridPrice()))
+ .orElse(null);
for (GridElement e : allShortOrders) {
+ if (e == keep) {
+ continue;
+ }
executor.cancelConditionalOrder(
- e.getShortOrderId(),
+ e.getLongOrderId(),
orderId -> {
- shortEntryTraderIdParam(
+ longEntryTraderIdParam(
e,
null,
false
@@ -441,11 +446,11 @@
}
);
- if (e.getShortTakeProfitOrderId() != null){
+ if (e.getLongTakeProfitOrderId() != null){
executor.cancelConditionalOrder(
- e.getShortTakeProfitOrderId(),
+ e.getLongTakeProfitOrderId(),
orderId -> {
- shortTakeProfitTraderIdParam(
+ longTakeProfitTraderIdParam(
e,
null,
false
@@ -472,25 +477,30 @@
tryGenerateQueues();
}else {
shortPositionSize = size.abs();
- //取消空仓仓位线以下的开多仓挂单
- List<GridElement> allLongOrders = GridElement.findAllLongOrders(shortEntryPrice);
+ List<GridElement> allLongOrders = GridElement.findAllShortOrders(shortEntryPrice);
if (CollUtil.isNotEmpty(allLongOrders)){
+ GridElement keep = allLongOrders.stream()
+ .min((a, b) -> a.getGridPrice().compareTo(b.getGridPrice()))
+ .orElse(null);
for (GridElement e : allLongOrders) {
+ if (e == keep) {
+ continue;
+ }
executor.cancelConditionalOrder(
- e.getLongOrderId(),
+ e.getShortOrderId(),
orderId -> {
- longEntryTraderIdParam(
+ shortEntryTraderIdParam(
e,
null,
false
);
}
);
- if (e.getLongTakeProfitOrderId() != null){
+ if (e.getShortTakeProfitOrderId() != null){
executor.cancelConditionalOrder(
- e.getLongTakeProfitOrderId(),
+ e.getShortTakeProfitOrderId(),
orderId -> {
- longTakeProfitTraderIdParam(
+ shortTakeProfitTraderIdParam(
e,
null,
false
@@ -526,6 +536,7 @@
return;
}
cumulativePnl = cumulativePnl.add(pnl);
+ updateUnrealizedPnl();
BigDecimal totalPnl = cumulativePnl.add(unrealizedPnl);
log.info("[Gate] 已实现:{}, 未实现:{}, 合计:{}",
cumulativePnl, unrealizedPnl, totalPnl);
@@ -704,7 +715,7 @@
null,
false
);
- TPonUserTradeShortEntry(byShortTakeProfitOrderId);
+// TPonUserTradeShortEntry(byShortTakeProfitOrderId);
}
GridElement byLongTakeProfitOrderId = GridElement.findByLongTakeProfitOrderId(orderId);
if (byLongTakeProfitOrderId != null){
@@ -718,7 +729,7 @@
null,
false
);
- TPonUserTradeLongEntry(byLongTakeProfitOrderId);
+// TPonUserTradeLongEntry(byLongTakeProfitOrderId);
}
/**
@@ -829,18 +840,18 @@
// 判断网格是否能开多空仓,如果不能则跳过
if (gridElement != null) {
- TraderParam downLongTraderParam = gridElement.getLongTraderParam();
- if (
- !gridElement.isHasLongOrder() &&
- newLongFirst.compareTo(shortEntryPrice) >= 0 &&
- newLongFirst.compareTo(longEntryPrice) <= 0
- ){
- placeEntryOrderWithPreFlag(gridElement, true,
- downLongTraderParam.getEntryPrice(),
- FuturesPriceTrigger.RuleEnum.NUMBER_2,
- config.getQuantity());
-
- }
+// TraderParam downLongTraderParam = gridElement.getLongTraderParam();
+// if (
+// !gridElement.isHasLongOrder() &&
+// newLongFirst.compareTo(shortEntryPrice) >= 0 &&
+// newLongFirst.compareTo(longEntryPrice) <= 0
+// ){
+// placeEntryOrderWithPreFlag(gridElement, true,
+// downLongTraderParam.getEntryPrice(),
+// FuturesPriceTrigger.RuleEnum.NUMBER_2,
+// config.getQuantity());
+//
+// }
TraderParam shortTraderParam = gridElement.getShortTraderParam();
if (
@@ -1096,8 +1107,9 @@
int longSize = longPriceQueue.size();
//根据精度转换成小数
int prec = config.getPriceScale();
- BigDecimal minTick = BigDecimal.ONE.scaleByPowerOfTen(-prec);
- BigDecimal step = config.getStep().subtract(minTick);
+// BigDecimal minTick = BigDecimal.ONE.scaleByPowerOfTen(-prec);
+// BigDecimal step = config.getStep().subtract(minTick);
+ BigDecimal step = config.getStep();
String qty = config.getQuantity();
// 空仓队列:id 从 -1 自减, shortPriceQueue[i] → id=-(i+1)
@@ -1244,32 +1256,32 @@
// 判断网格是否能开空仓,如果不能则跳过
if (UpGridElement != null) {
- if (!UpGridElement.isHasShortOrder() && shortEntryPrice.compareTo(newLongFirst) > 0) {
-
- TraderParam upShortTraderParam = UpGridElement.getShortTraderParam();
- placeEntryOrderWithPreFlag(UpGridElement, false,
- upShortTraderParam.getEntryPrice(),
- FuturesPriceTrigger.RuleEnum.NUMBER_2,
- negate(upShortTraderParam.getQuantity()));
- }
+// if (!UpGridElement.isHasShortOrder() && shortEntryPrice.compareTo(newLongFirst) > 0) {
+//
+// TraderParam upShortTraderParam = UpGridElement.getShortTraderParam();
+// placeEntryOrderWithPreFlag(UpGridElement, false,
+// upShortTraderParam.getEntryPrice(),
+// FuturesPriceTrigger.RuleEnum.NUMBER_2,
+// negate(upShortTraderParam.getQuantity()));
+// }
int i = UpGridElement.getId() + 2;
GridElement downGridElement = GridElement.findById(i);
if (downGridElement != null){
BigDecimal downGridPrice = downGridElement.getGridPrice();
- TraderParam downShortTraderParam = downGridElement.getShortTraderParam();
- if (
- !downGridElement.isHasShortOrder() &&
- downGridPrice.compareTo(longEntryPrice) <= 0 &&
- downGridPrice.compareTo(shortEntryPrice) >= 0
- ){
- placeEntryOrderWithPreFlag(downGridElement, false,
- downShortTraderParam.getEntryPrice(),
- FuturesPriceTrigger.RuleEnum.NUMBER_1,
- negate(downShortTraderParam.getQuantity()));
-
- }
+// TraderParam downShortTraderParam = downGridElement.getShortTraderParam();
+// if (
+// !downGridElement.isHasShortOrder() &&
+// downGridPrice.compareTo(longEntryPrice) <= 0 &&
+// downGridPrice.compareTo(shortEntryPrice) >= 0
+// ){
+// placeEntryOrderWithPreFlag(downGridElement, false,
+// downShortTraderParam.getEntryPrice(),
+// FuturesPriceTrigger.RuleEnum.NUMBER_1,
+// negate(downShortTraderParam.getQuantity()));
+//
+// }
TraderParam downLongTraderParam = downGridElement.getLongTraderParam();
if (
@@ -1350,13 +1362,13 @@
// 判断网格是否能开多仓,如果不能则跳过
if (UpGridElement != null) {
- if (!UpGridElement.isHasLongOrder() && longEntryPrice.compareTo(newLongFirst) < 0) {
- TraderParam upLongTraderParam = UpGridElement.getLongTraderParam();
- placeEntryOrderWithPreFlag(UpGridElement, true,
- upLongTraderParam.getEntryPrice(),
- FuturesPriceTrigger.RuleEnum.NUMBER_1,
- config.getQuantity());
- }
+// if (!UpGridElement.isHasLongOrder() && longEntryPrice.compareTo(newLongFirst) < 0) {
+// TraderParam upLongTraderParam = UpGridElement.getLongTraderParam();
+// placeEntryOrderWithPreFlag(UpGridElement, true,
+// upLongTraderParam.getEntryPrice(),
+// FuturesPriceTrigger.RuleEnum.NUMBER_1,
+// config.getQuantity());
+// }
int i = UpGridElement.getId() - 2;
GridElement downGridElement = GridElement.findById(i);
@@ -1364,18 +1376,18 @@
BigDecimal downGridPrice = downGridElement.getGridPrice();
- TraderParam downLongTraderParam = downGridElement.getLongTraderParam();
- if (
- !downGridElement.isHasLongOrder() &&
- downGridPrice.compareTo(shortEntryPrice) >= 0 &&
- downGridPrice.compareTo(longEntryPrice) <= 0
- ){
- placeEntryOrderWithPreFlag(downGridElement, true,
- downLongTraderParam.getEntryPrice(),
- FuturesPriceTrigger.RuleEnum.NUMBER_2,
- config.getQuantity());
-
- }
+// TraderParam downLongTraderParam = downGridElement.getLongTraderParam();
+// if (
+// !downGridElement.isHasLongOrder() &&
+// downGridPrice.compareTo(shortEntryPrice) >= 0 &&
+// downGridPrice.compareTo(longEntryPrice) <= 0
+// ){
+// placeEntryOrderWithPreFlag(downGridElement, true,
+// downLongTraderParam.getEntryPrice(),
+// FuturesPriceTrigger.RuleEnum.NUMBER_2,
+// config.getQuantity());
+//
+// }
TraderParam shortTraderParam = downGridElement.getShortTraderParam();
if (
--
Gitblit v1.9.1