From 62583dd0423d5586dd4f720b52a34fb4cce6bca5 Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Tue, 02 Jun 2026 10:14:28 +0800
Subject: [PATCH] fix(gate): 修复网格交易数量计算和配置参数
---
src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java | 39 ++++++++++++++++++++++++++-------------
1 files changed, 26 insertions(+), 13 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 1f1dd41..2408486 100644
--- a/src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
+++ b/src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
@@ -305,7 +305,23 @@
longPriceQueue.clear();
currentLongOrderIds.clear();
currentShortOrderIds.clear();
- log.info("[Gate] 网格策略已启动");
+
+ // 每次重启重新获取当前本金
+ refreshInitialPrincipal();
+
+ log.info("[Gate] 网格策略已启动, 当前本金: {} USDT", initialPrincipal);
+ }
+
+ /**
+ * 重新获取当前账户权益作为初始本金。
+ */
+ private void refreshInitialPrincipal() {
+ try {
+ FuturesAccount account = futuresApi.listFuturesAccounts(SETTLE);
+ this.initialPrincipal = new BigDecimal(account.getTotal());
+ } catch (Exception e) {
+ log.warn("[Gate] 获取初始化本金失败,使用旧值: {}", initialPrincipal);
+ }
}
/**
@@ -353,6 +369,8 @@
BigDecimal totalPnl = cumulativePnl.add(unrealizedPnl);
log.info("[Gate] 已实现:{}, 未实现:{}, 合计:{}",
cumulativePnl, unrealizedPnl, totalPnl);
+
+ startGrid();
return;
}
@@ -559,19 +577,12 @@
BigDecimal totalPnl = cumulativePnl.add(unrealizedPnl);
log.info("[Gate] 已实现:{}, 未实现:{}, 合计:{}",
cumulativePnl, unrealizedPnl, totalPnl);
-
- if (totalPnl.compareTo(config.getOverallTp()) >= 0) {
- log.info("[Gate] 已达止盈目标(合计{})→已停止, 已实现:{}, 未实现:{}",
- totalPnl, cumulativePnl, unrealizedPnl);
- state = StrategyState.STOPPED;
- } else if (totalPnl.compareTo(config.getMaxLoss().negate()) <= 0) {
+ if(totalPnl.compareTo(config.getMaxLoss().negate()) <= 0) {
String logMessage = StrUtil.format("[Gate] 已达亏损风险值(合计{}), 已实现:{}, 未实现:{}",
totalPnl, cumulativePnl, unrealizedPnl);
log.info(logMessage);
-
DingTalkUtils.getDefault().sendActionCard("风险提醒", logMessage, config.getApiKey(), "");
-// state = StrategyState.STOPPED;
}
}
@@ -1380,7 +1391,7 @@
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);
+ String size = new BigDecimal(String.valueOf(entryQty)).multiply(new BigDecimal(config.getQuantity())).toString();
log.info("[Gate] 多仓止损触发 gridId:{}, 在gridId:{}挂{}张多单, 均价:{}, 价差:{}, 步长:{}",
gridId, newEntryGridId, entryQty, longEntryPrice, priceDiff, config.getStep());
newEntryGrid.getLongTraderParam().setQuantity(size);
@@ -1420,7 +1431,7 @@
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);
+ String size = new BigDecimal(String.valueOf(entryQty)).multiply(new BigDecimal(config.getQuantity())).toString();
log.info("[Gate] 空仓止损触发 gridId:{}, 在gridId:{}挂{}张空单, 均价:{}, 价差:{}, 步长:{}",
gridId, newEntryGridId, entryQty, shortEntryPrice, priceDiff, config.getStep());
newEntryGrid.getShortTraderParam().setQuantity(size);
@@ -1451,7 +1462,7 @@
triggerPrice,
FuturesPriceTrigger.RuleEnum.NUMBER_2,
ORDER_TYPE_CLOSE_LONG,
- "-1",
+ negate(config.getQuantity()),
profitId -> {
elem.setLongStopLossOrderId(profitId);
GridElement.refreshIndices();
@@ -1484,7 +1495,7 @@
triggerPrice,
FuturesPriceTrigger.RuleEnum.NUMBER_1,
ORDER_TYPE_CLOSE_SHORT,
- "1",
+ config.getQuantity(),
profitId -> {
elem.setShortStopLossOrderId(profitId);
GridElement.refreshIndices();
@@ -1505,6 +1516,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();
@@ -1515,6 +1527,7 @@
}
private void handlePositionZeroAndReset(String direction) {
+ state = StrategyState.STOPPED;
try {
futuresApi.cancelPriceTriggeredOrderList(SETTLE, config.getContract());
} catch (Exception e) {
--
Gitblit v1.9.1