From 1dda7c781aad3cc6dae85693acccb909f62471cd Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Mon, 25 May 2026 11:23:36 +0800
Subject: [PATCH] refactor(gateApi): 激活网格交易功能并优化订单处理逻辑
---
src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java | 306 ++++++++++++++++++++++++++------------------------
1 files changed, 157 insertions(+), 149 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 9ac5617..04a4108 100644
--- a/src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
+++ b/src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
@@ -526,6 +526,7 @@
return;
}
cumulativePnl = cumulativePnl.add(pnl);
+ updateUnrealizedPnl();
BigDecimal totalPnl = cumulativePnl.add(unrealizedPnl);
log.info("[Gate] 已实现:{}, 未实现:{}, 合计:{}",
cumulativePnl, unrealizedPnl, totalPnl);
@@ -692,19 +693,6 @@
/**
* 匹配止盈单止盈
*/
- GridElement byLongTakeProfitOrderId = GridElement.findByLongTakeProfitOrderId(orderId);
- if (byLongTakeProfitOrderId != null){
- longTakeProfitTraderIdParam(
- byLongTakeProfitOrderId,
- null,
- false
- );
- longEntryTraderIdParam(
- byLongTakeProfitOrderId,
- null,
- false
- );
- }
GridElement byShortTakeProfitOrderId = GridElement.findByShortTakeProfitOrderId(orderId);
if (byShortTakeProfitOrderId != null){
shortTakeProfitTraderIdParam(
@@ -717,36 +705,27 @@
null,
false
);
+// TPonUserTradeShortEntry(byShortTakeProfitOrderId);
+ }
+ GridElement byLongTakeProfitOrderId = GridElement.findByLongTakeProfitOrderId(orderId);
+ if (byLongTakeProfitOrderId != null){
+ longTakeProfitTraderIdParam(
+ byLongTakeProfitOrderId,
+ null,
+ false
+ );
+ longEntryTraderIdParam(
+ byLongTakeProfitOrderId,
+ null,
+ false
+ );
+// TPonUserTradeLongEntry(byLongTakeProfitOrderId);
}
/**
* 匹配挂单
*/
- GridElement longGridElement = GridElement.findByLongOrderId(orderId);
- if (longGridElement != null) {
- if (longGridElement.isHasLongOrder() && !tradeId.equals("0")){
- onUserTradeLongEntry(longGridElement);
- if (longGridElement.getLongTakeProfitOrderId() == null){
- BigDecimal longTp = longGridElement.getLongTraderParam().getTakeProfitPrice();
- if (longTp != null) {
- executor.placeTakeProfit(longTp,
- FuturesPriceTrigger.RuleEnum.NUMBER_1,
- ORDER_TYPE_CLOSE_LONG,
- negate(config.getQuantity()),
- (profitId) -> {
- longTakeProfitTraderIdParam(
- longGridElement,
- profitId,
- true
- );
- });
- log.info("[Gate] 多单成交匹配止盈, orderId:{}, 止盈价:{}, size:{}", orderId, longTp, negate(config.getQuantity()));
- return;
- }
- }
- }
- }
GridElement shortGridElement = GridElement.findByShortOrderId(orderId);
if (shortGridElement != null) {
if (shortGridElement.isHasShortOrder() && !tradeId.equals("0")){
@@ -771,9 +750,33 @@
}
}
}
+ GridElement longGridElement = GridElement.findByLongOrderId(orderId);
+ if (longGridElement != null) {
+ if (longGridElement.isHasLongOrder() && !tradeId.equals("0")){
+
+ onUserTradeLongEntry(longGridElement);
+ if (longGridElement.getLongTakeProfitOrderId() == null){
+ BigDecimal longTp = longGridElement.getLongTraderParam().getTakeProfitPrice();
+ if (longTp != null) {
+ executor.placeTakeProfit(longTp,
+ FuturesPriceTrigger.RuleEnum.NUMBER_1,
+ ORDER_TYPE_CLOSE_LONG,
+ negate(config.getQuantity()),
+ (profitId) -> {
+ longTakeProfitTraderIdParam(
+ longGridElement,
+ profitId,
+ true
+ );
+ });
+ log.info("[Gate] 多单成交匹配止盈, orderId:{}, 止盈价:{}, size:{}", orderId, longTp, negate(config.getQuantity()));
+ }
+ }
+ }
+ }
}
- private void onUserTradeShortEntry(GridElement gridElement) {
+ private void TPonUserTradeShortEntry(GridElement gridElement) {
if (!isMarginSafe()) {
log.warn("[Gate] 保证金超限,跳过挂条件单");
} else {
@@ -785,6 +788,80 @@
* 前进方向挂空仓条件单
* 后置方向挂多空条件单
*/
+ //下一个开仓位置
+ BigDecimal gridPrice = gridElement.getGridPrice();
+
+ // 判断网格是否能开空仓,如果不能则跳过
+ if (gridElement != null) {
+ TraderParam downShortTraderParam = gridElement.getShortTraderParam();
+ if (
+ !gridElement.isHasShortOrder() &&
+ gridPrice.compareTo(longEntryPrice) <= 0 &&
+ gridPrice.compareTo(shortEntryPrice) >= 0
+ ){
+ placeEntryOrderWithPreFlag(gridElement, false,
+ downShortTraderParam.getEntryPrice(),
+ FuturesPriceTrigger.RuleEnum.NUMBER_1,
+ negate(downShortTraderParam.getQuantity()));
+
+ }
+
+ TraderParam downLongTraderParam = gridElement.getLongTraderParam();
+ if (
+ !gridElement.isHasLongOrder() &&
+ gridPrice.compareTo(longEntryPrice) <= 0
+ ){
+ placeEntryOrderWithPreFlag(gridElement, true,
+ downLongTraderParam.getEntryPrice(),
+ FuturesPriceTrigger.RuleEnum.NUMBER_1,
+ downLongTraderParam.getQuantity());
+ }
+
+ }
+ }
+ }
+
+ private void TPonUserTradeLongEntry(GridElement gridElement) {
+ if (!isMarginSafe()) {
+ log.warn("[Gate] 保证金超限,跳过挂条件单");
+ } else {
+ BigDecimal newLongFirst = gridElement.getGridPrice() ;
+
+ // 判断网格是否能开多空仓,如果不能则跳过
+ 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 shortTraderParam = gridElement.getShortTraderParam();
+ if (
+ !gridElement.isHasShortOrder() &&
+ newLongFirst.compareTo(shortEntryPrice) >= 0
+ ){
+
+ placeEntryOrderWithPreFlag(gridElement, false,
+ shortTraderParam.getEntryPrice(),
+ FuturesPriceTrigger.RuleEnum.NUMBER_2,
+ negate(config.getQuantity()));
+ }
+ }
+ }
+ }
+
+ private void onUserTradeShortEntry(GridElement gridElement) {
+ if (!isMarginSafe()) {
+ log.warn("[Gate] 保证金超限,跳过挂条件单");
+ } else {
//下一个开仓位置
GridElement UpGridElement = GridElement.findById(gridElement.getDownId());
BigDecimal newLongFirst = UpGridElement.getGridPrice();
@@ -800,36 +877,6 @@
FuturesPriceTrigger.RuleEnum.NUMBER_2,
negate(upShortTraderParam.getQuantity()));
}
- int i = gridElement.getUpId();
- 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 downLongTraderParam = downGridElement.getLongTraderParam();
- if (
- !downGridElement.isHasLongOrder() &&
- downGridPrice.compareTo(longEntryPrice) <= 0
- ){
- placeEntryOrderWithPreFlag(downGridElement, true,
- downLongTraderParam.getEntryPrice(),
- FuturesPriceTrigger.RuleEnum.NUMBER_1,
- downLongTraderParam.getQuantity());
- }
- }
}
}
}
@@ -838,14 +885,6 @@
if (!isMarginSafe()) {
log.warn("[Gate] 保证金超限,跳过挂条件单");
} else {
-
- /**
- * 下一个开仓位置
- * 获取队列第一个元素的价格对应的网格
- * 判断网格是否能开多仓,如果不能则跳过
- * 前进方向挂多仓条件单
- * 后置方向挂多空条件单
- */
//下一个开仓位置
GridElement UpGridElement = GridElement.findById(gridElement.getUpId());
BigDecimal newLongFirst = UpGridElement.getGridPrice() ;
@@ -859,38 +898,6 @@
upLongTraderParam.getEntryPrice(),
FuturesPriceTrigger.RuleEnum.NUMBER_1,
config.getQuantity());
- }
-
- int i = gridElement.getDownId();
- GridElement downGridElement = GridElement.findById(i);
- if (downGridElement != null){
-
- 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 shortTraderParam = downGridElement.getShortTraderParam();
- if (
- !downGridElement.isHasShortOrder() &&
- downGridPrice.compareTo(shortEntryPrice) >= 0
- ){
-
- placeEntryOrderWithPreFlag(downGridElement, false,
- shortTraderParam.getEntryPrice(),
- FuturesPriceTrigger.RuleEnum.NUMBER_2,
- negate(config.getQuantity()));
- }
}
}
}
@@ -1090,8 +1097,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)
@@ -1238,32 +1246,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 (
@@ -1344,13 +1352,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);
@@ -1358,18 +1366,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