From 8beede41ea527872eee2572f2271110ac7a14d9a Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Tue, 19 May 2026 10:11:37 +0800
Subject: [PATCH] 第二个版本
---
src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java | 76 +++++++++++++++++++++++++------------
1 files changed, 51 insertions(+), 25 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 6ffb218..5150891 100644
--- a/src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
+++ b/src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
@@ -1,5 +1,6 @@
package com.xcong.excoin.modules.gateApi;
+import cn.hutool.core.collection.CollUtil;
import io.gate.gateapi.ApiClient;
import io.gate.gateapi.ApiException;
import io.gate.gateapi.GateApiException;
@@ -432,6 +433,13 @@
tryGenerateQueues();
}else {
longPositionSize = size;
+ //取消多仓位线以上的开空仓挂单
+ List<GridElement> allShortOrders = GridElement.findAllShortOrders(longEntryPrice);
+ if (CollUtil.isNotEmpty(allShortOrders)){
+ for (GridElement e : allShortOrders) {
+ executor.cancelOrder(e.getShortOrderId());
+ }
+ }
}
} else {
longActive = false;
@@ -449,6 +457,13 @@
tryGenerateQueues();
}else {
shortPositionSize = size.abs();
+ //取消多仓位线以上的开空仓挂单
+ List<GridElement> allLongOrders = GridElement.findAllLongOrders(shortEntryPrice);
+ if (CollUtil.isNotEmpty(allLongOrders)){
+ for (GridElement e : allLongOrders) {
+ executor.cancelOrder(e.getShortOrderId());
+ }
+ }
}
} else {
shortActive = false;
@@ -524,12 +539,12 @@
GridElement byShortTakeProfitOrderId = GridElement.findByShortTakeProfitOrderId(orderId);
if (byShortTakeProfitOrderId != null){
shortTakeProfitTraderIdParam(
- byLongTakeProfitOrderId,
+ byShortTakeProfitOrderId,
null,
false
);
shortEntryTraderIdParam(
- byLongTakeProfitOrderId,
+ byShortTakeProfitOrderId,
null,
false
);
@@ -616,6 +631,7 @@
GridElement baseGridElement = GridElement.findById(0);
TraderParam baseLongTraderParam = config.getBaseLongTraderParam();
baseGridElement.setLongOrderId(baseLongTraderParam.getEntryOrderId());
+ baseGridElement.setHasLongOrder(true);
//0位置的网格的多单止盈
BigDecimal upTakeProfitPrice = baseGridElement.getLongTraderParam().getTakeProfitPrice();
executor.placeTakeProfit(
@@ -634,6 +650,7 @@
//0位置的网格的空单止盈
TraderParam baseShortTraderParam = config.getBaseShortTraderParam();
baseGridElement.setShortOrderId(baseShortTraderParam.getEntryOrderId());
+ baseGridElement.setHasShortOrder(true);
BigDecimal downTakeProfitPrice = baseGridElement.getShortTraderParam().getTakeProfitPrice();
executor.placeTakeProfit(
downTakeProfitPrice,
@@ -740,12 +757,13 @@
*/
private void generateShortQueue() {
shortPriceQueue.clear();
- BigDecimal step = shortBaseEntryPrice.multiply(config.getGridRate()).setScale(1, RoundingMode.HALF_UP);
+ int prec = config.getPriceScale();
+ BigDecimal step = shortBaseEntryPrice.multiply(config.getGridRate()).setScale(prec, RoundingMode.HALF_UP);
config.setStep(step);
- BigDecimal elem = shortBaseEntryPrice.subtract(step).setScale(1, RoundingMode.HALF_UP);
+ BigDecimal elem = shortBaseEntryPrice.subtract(step).setScale(prec, RoundingMode.HALF_UP);
for (int i = 0; i < config.getGridQueueSize(); i++) {
shortPriceQueue.add(elem);
- elem = elem.subtract(step).setScale(1, RoundingMode.HALF_UP);
+ elem = elem.subtract(step).setScale(prec, RoundingMode.HALF_UP);
if (elem.compareTo(BigDecimal.ZERO) <= 0) {
break;
}
@@ -761,11 +779,12 @@
*/
private void generateLongQueue() {
longPriceQueue.clear();
+ int prec = config.getPriceScale();
BigDecimal step = config.getStep();
- BigDecimal elem = shortBaseEntryPrice.add(step).setScale(1, RoundingMode.HALF_UP);
+ BigDecimal elem = shortBaseEntryPrice.add(step).setScale(prec, RoundingMode.HALF_UP);
for (int i = 0; i < config.getGridQueueSize(); i++) {
longPriceQueue.add(elem);
- elem = elem.add(step).setScale(1, RoundingMode.HALF_UP);
+ elem = elem.add(step).setScale(prec, RoundingMode.HALF_UP);
}
longPriceQueue.sort(BigDecimal::compareTo);
log.info("[Gate] 多队列:{}", longPriceQueue);
@@ -789,7 +808,10 @@
List<GridElement> elements = new ArrayList<>();
int shortSize = shortPriceQueue.size();
int longSize = longPriceQueue.size();
- BigDecimal step = config.getStep().subtract(config.getContractMultiplier());
+ //根据精度转换成小数
+ int prec = config.getPriceScale();
+ BigDecimal minTick = BigDecimal.ONE.scaleByPowerOfTen(-prec);
+ BigDecimal step = config.getStep().subtract(minTick);
String qty = config.getQuantity();
// 空仓队列:id 从 -1 自减, shortPriceQueue[i] → id=-(i+1)
@@ -801,13 +823,13 @@
TraderParam longParam = TraderParam.builder()
.direction(TraderParam.Direction.LONG)
.entryPrice(price)
- .takeProfitPrice(price.add(step).setScale(1, RoundingMode.HALF_UP))
+ .takeProfitPrice(price.add(step).setScale(prec, RoundingMode.HALF_UP))
.quantity(qty)
.build();
TraderParam shortParam = TraderParam.builder()
.direction(TraderParam.Direction.SHORT)
.entryPrice(price)
- .takeProfitPrice(price.subtract(step).setScale(1, RoundingMode.HALF_UP))
+ .takeProfitPrice(price.subtract(step).setScale(prec, RoundingMode.HALF_UP))
.quantity(qty)
.build();
elements.add(GridElement.builder()
@@ -826,20 +848,20 @@
TraderParam longParam = TraderParam.builder()
.direction(TraderParam.Direction.LONG)
.entryPrice(price)
- .takeProfitPrice(price.add(step).setScale(1, RoundingMode.HALF_UP))
+ .takeProfitPrice(price.add(step).setScale(prec, RoundingMode.HALF_UP))
.quantity(qty)
.build();
TraderParam shortParam = TraderParam.builder()
.direction(TraderParam.Direction.SHORT)
.entryPrice(price)
- .takeProfitPrice(price.subtract(step).setScale(1, RoundingMode.HALF_UP))
+ .takeProfitPrice(price.subtract(step).setScale(prec, RoundingMode.HALF_UP))
.quantity(qty)
.build();
elements.add(GridElement.builder()
.id(0)
.gridPrice(price)
- .upId(shortSize > 0 ? -1 : null)
- .downId(longSize > 0 ? 1 : null)
+ .upId(shortSize > 0 ? 1 : null)
+ .downId(longSize > 0 ? -1 : null)
.longTraderParam(longParam)
.shortTraderParam(shortParam)
.build());
@@ -848,19 +870,19 @@
// 多仓队列:id 从 1 自增, longPriceQueue[i] → id=i+1
for (int i = 0; i < longSize; i++) {
int id = i + 1;
- Integer upId = (i == 0) ? 0 : id - 1;
- Integer downId = (i == longSize - 1) ? null : id + 1;
+ Integer downId = (i == 0) ? 0 : id - 1;
+ Integer upId = (i == longSize - 1) ? null : id + 1;
BigDecimal price = longPriceQueue.get(i);
TraderParam longParam = TraderParam.builder()
.direction(TraderParam.Direction.LONG)
.entryPrice(price)
- .takeProfitPrice(price.add(step).setScale(1, RoundingMode.HALF_UP))
+ .takeProfitPrice(price.add(step).setScale(prec, RoundingMode.HALF_UP))
.quantity(qty)
.build();
TraderParam shortParam = TraderParam.builder()
.direction(TraderParam.Direction.SHORT)
.entryPrice(price)
- .takeProfitPrice(price.subtract(step).setScale(1, RoundingMode.HALF_UP))
+ .takeProfitPrice(price.subtract(step).setScale(prec, RoundingMode.HALF_UP))
.quantity(qty)
.build();
elements.add(GridElement.builder()
@@ -902,10 +924,11 @@
* @param currentPrice 当前 K 线收盘价(最新成交价)
*/
private void processShortGrid(BigDecimal currentPrice) {
+ int prec = config.getPriceScale();
List<BigDecimal> matched = new ArrayList<>();
synchronized (shortPriceQueue) {
for (BigDecimal p : shortPriceQueue) {
- if (p.compareTo(currentPrice) > 0) {
+ if (p.compareTo(currentPrice) >= 0) {
matched.add(p);
} else {
break;
@@ -922,7 +945,7 @@
BigDecimal min = shortPriceQueue.isEmpty() ? matched.get(matched.size() - 1) : shortPriceQueue.get(shortPriceQueue.size() - 1);
BigDecimal gridStep = config.getStep();
for (int i = 0; i < matched.size(); i++) {
- min = min.subtract(gridStep).setScale(1, RoundingMode.HALF_UP);
+ min = min.subtract(gridStep).setScale(prec, RoundingMode.HALF_UP);
shortPriceQueue.add(min);
}
shortPriceQueue.sort((a, b) -> b.compareTo(a));
@@ -932,7 +955,7 @@
BigDecimal first = longPriceQueue.isEmpty() ? matched.get(matched.size() - 1) : longPriceQueue.get(0);
BigDecimal gridStep = config.getStep();
for (int i = 1; i <= matched.size(); i++) {
- BigDecimal elem = first.subtract(gridStep.multiply(BigDecimal.valueOf(i))).setScale(1, RoundingMode.HALF_UP);
+ BigDecimal elem = first.subtract(gridStep.multiply(BigDecimal.valueOf(i))).setScale(prec, RoundingMode.HALF_UP);
longPriceQueue.add(elem);
}
longPriceQueue.sort(BigDecimal::compareTo);
@@ -987,7 +1010,7 @@
if (downGridElement != null){
TraderParam downLongTraderParam = downGridElement.getLongTraderParam();
- if (!downGridElement.isHasShortOrder()){
+ if (!downGridElement.isHasLongOrder()){
executor.placeConditionalEntryOrder(
downLongTraderParam.getEntryPrice(),
FuturesPriceTrigger.RuleEnum.NUMBER_1,
@@ -1008,6 +1031,7 @@
BigDecimal downGridPrice = downGridElement.getGridPrice();
if (
!downGridElement.isHasShortOrder() &&
+ downGridPrice.compareTo(currentPrice) < 0 &&
downGridPrice.compareTo(longEntryPrice) <= 0 &&
downGridPrice.compareTo(shortEntryPrice) >= 0
){
@@ -1058,10 +1082,11 @@
* @param currentPrice 当前 K 线收盘价(最新成交价)
*/
private void processLongGrid(BigDecimal currentPrice) {
+ int prec = config.getPriceScale();
List<BigDecimal> matched = new ArrayList<>();
synchronized (longPriceQueue) {
for (BigDecimal p : longPriceQueue) {
- if (p.compareTo(currentPrice) < 0) {
+ if (p.compareTo(currentPrice) <= 0) {
matched.add(p);
} else {
break;
@@ -1084,7 +1109,7 @@
BigDecimal max = longPriceQueue.isEmpty() ? matched.get(matched.size() - 1) : longPriceQueue.get(longPriceQueue.size() - 1);
BigDecimal gridStep = config.getStep();
for (int i = 0; i < matched.size(); i++) {
- max = max.add(gridStep).setScale(1, RoundingMode.HALF_UP);
+ max = max.add(gridStep).setScale(prec, RoundingMode.HALF_UP);
longPriceQueue.add(max);
}
longPriceQueue.sort(BigDecimal::compareTo);
@@ -1093,7 +1118,7 @@
BigDecimal first = shortPriceQueue.isEmpty() ? matched.get(0) : shortPriceQueue.get(0);
BigDecimal gridStep = config.getStep();
for (int i = 1; i <= matched.size(); i++) {
- BigDecimal elem = first.add(gridStep.multiply(BigDecimal.valueOf(i))).setScale(1, RoundingMode.HALF_UP);
+ BigDecimal elem = first.add(gridStep.multiply(BigDecimal.valueOf(i))).setScale(prec, RoundingMode.HALF_UP);
shortPriceQueue.add(elem);
}
shortPriceQueue.sort((a, b) -> b.compareTo(a));
@@ -1168,6 +1193,7 @@
BigDecimal downGridPrice = downGridElement.getGridPrice();
if (
!downGridElement.isHasLongOrder() &&
+ downGridPrice.compareTo(currentPrice) > 0 &&
downGridPrice.compareTo(longEntryPrice) <= 0 &&
downGridPrice.compareTo(shortEntryPrice) >= 0
){
--
Gitblit v1.9.1