From 25a51fdc5649aad0c9f1ab7f6db9b0fa4cdeb1eb Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Mon, 22 Jun 2026 13:25:09 +0800
Subject: [PATCH] refactor(gateApi): 优化网格交易持仓查询逻辑
---
src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java | 45 +++++++++++++++++++++++++++++++++++----------
1 files changed, 35 insertions(+), 10 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 064b7a6..f787a58 100644
--- a/src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
+++ b/src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
@@ -636,17 +636,18 @@
if (shortGridElement.isHasShortOrder() && StrUtil.isNotEmpty(tradeId) && !tradeId.equals("0") ){
int filledQty = Integer.parseInt(shortGridElement.getShortTraderParam().getQuantity());
shortEntryTraderIdParam(shortGridElement, null, false);
- // [Gate-需求2] 加仓后先撤空仓所有止盈+止损,再重挂
+ // [Gate-需求2] 加仓后先撤空仓所有止盈+止损,再查交易所持仓后重挂
cancelAllShortTakeProfitsAndStopLosses();
- extendShortStopLoss(filledQty,shortGridElement.getId());
+ int posSize = queryPositionSize(Position.ModeEnum.DUAL_SHORT);
+ extendShortStopLoss(posSize, shortGridElement.getId());
accumulatedShortLossCount = 0; // 加仓订单成交,重置止损累计
- log.info("[Gate] 空单成交 gridId:{}", filledQty);
+ log.info("[Gate] 空单成交 gridId:{}, 当前持仓:{}张", filledQty, posSize);
// 空仓持仓超过baseQuantity时,从gridId-2开始向外追挂止盈
BigDecimal shortBaseQty = new BigDecimal(config.getBaseQuantity());
BigDecimal shortGridQty = new BigDecimal(config.getQuantity());
- if (shortPositionSize.compareTo(shortBaseQty) > 0) {
- BigDecimal shortExcess = shortPositionSize.subtract(shortBaseQty);
+ if (BigDecimal.valueOf(posSize).compareTo(shortBaseQty) > 0) {
+ BigDecimal shortExcess = BigDecimal.valueOf(posSize).subtract(shortBaseQty);
int shortExcessCount = shortExcess.divide(shortGridQty, 0, RoundingMode.DOWN).intValue();
for (int i = 0; i < shortExcessCount; i++) {
int tpGridId = shortGridElement.getId() - 2 - i;
@@ -677,17 +678,18 @@
int filledQty = Integer.parseInt(longGridElement.getLongTraderParam().getQuantity());
longEntryTraderIdParam(longGridElement, null, false);
- // [Gate-需求2] 加仓后先撤多仓所有止盈+止损,再重挂
+ // [Gate-需求2] 加仓后先撤多仓所有止盈+止损,再查交易所持仓后重挂
cancelAllLongTakeProfitsAndStopLosses();
- extendLongStopLoss(filledQty,longGridElement.getId());
+ int posSize = queryPositionSize(Position.ModeEnum.DUAL_LONG);
+ extendLongStopLoss(posSize, longGridElement.getId());
accumulatedLongLossCount = 0; // 加仓订单成交,重置止损累计
- log.info("[Gate] 多单成交 gridId:{}", filledQty);
+ log.info("[Gate] 多单成交 gridId:{}, 当前持仓:{}张", filledQty, posSize);
// 多仓持仓超过baseQuantity时,从gridId+2开始向外追挂止盈
BigDecimal longBaseQty = new BigDecimal(config.getBaseQuantity());
BigDecimal longGridQty = new BigDecimal(config.getQuantity());
- if (longPositionSize.compareTo(longBaseQty) > 0) {
- BigDecimal longExcess = longPositionSize.subtract(longBaseQty);
+ if (BigDecimal.valueOf(posSize).compareTo(longBaseQty) > 0) {
+ BigDecimal longExcess = BigDecimal.valueOf(posSize).subtract(longBaseQty);
int longExcessCount = longExcess.divide(longGridQty, 0, RoundingMode.DOWN).intValue();
for (int i = 0; i < longExcessCount; i++) {
int tpGridId = longGridElement.getId() + 2 + i;
@@ -715,6 +717,29 @@
}
+ /**
+ * 查询交易所当前持仓张数(绝对值)。加仓/开仓后重挂止盈止损时调用,
+ * 绕过本地 WS 推送缓存避免时序竞态,直接拿到交易所权威数据。
+ *
+ * @param mode 持仓模式(DUAL_LONG / DUAL_SHORT)
+ * @return 持仓张数(绝对值),查询失败返回 0
+ */
+ private int queryPositionSize(Position.ModeEnum mode) {
+ try {
+ List<Position> positions = futuresApi.listPositions(SETTLE).execute();
+ if (positions != null) {
+ for (Position p : positions) {
+ if (mode == p.getMode() && config.getContract().equals(p.getContract())) {
+ return new BigDecimal(p.getSize()).abs().intValue();
+ }
+ }
+ }
+ } catch (Exception e) {
+ log.warn("[Gate] 查询{}持仓失败", mode, e);
+ }
+ return 0;
+ }
+
// ---- 网格队列处理 ----
/**
--
Gitblit v1.9.1