From 63e419c742d57745a89de70e4e28200cde72334a Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Mon, 21 Sep 2026 09:58:31 +0800
Subject: [PATCH] ``` fix(gateApi): 修复网格交易队列生成的并发安全问题
---
src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java | 22 ++++++++++++++++++----
1 files changed, 18 insertions(+), 4 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 3331bee..a62052e 100644
--- a/src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
+++ b/src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
@@ -354,6 +354,8 @@
shortPositionSize = BigDecimal.ZERO;
baseLongOpened = false;
baseShortOpened = false;
+ config.setBaseLongTraderParam(null);
+ config.setBaseShortTraderParam(null);
longActive = false;
shortActive = false;
accumulatedLongLossCount = 0;
@@ -453,12 +455,14 @@
.entryOrderId(orderId)
.build();
config.setBaseLongTraderParam(baseLongTp);
+ tryGenerateQueues();
}, null);
executor.openShort(negate(size), (orderId) -> {
TraderParam baseShortTp = TraderParam.builder()
.entryOrderId(orderId)
.build();
config.setBaseShortTraderParam(baseShortTp);
+ tryGenerateQueues();
}, null);
return;
}
@@ -872,17 +876,27 @@
* <li>状态切换为 ACTIVE</li>
* </ol>
*/
- private void tryGenerateQueues() {
- if (baseLongOpened && baseShortOpened) {
+ private synchronized void tryGenerateQueues() {
+ // 幂等保护:生成队列后 state 切换为 ACTIVE,避免多线程重复执行
+ if (state != StrategyState.OPENING) {
+ return;
+ }
+ TraderParam baseLongTraderParam = config.getBaseLongTraderParam();
+ TraderParam baseShortTraderParam = config.getBaseShortTraderParam();
+ // 需同时满足:多空基底均已成交,且两个下单参数(orderId)均已通过下单成功回调拿到。
+ // IOC 市价单成交后 WS 持仓推送可能先于 REST 下单响应返回,必须等参数就绪再生成队列。
+ if (!(baseLongOpened && baseShortOpened)
+ || baseLongTraderParam == null || baseShortTraderParam == null) {
+ return;
+ }
+ {
generateShortQueue();
generateLongQueue();
updateGridElements();
GridElement baseGridElement = GridElement.findById(0);
- TraderParam baseLongTraderParam = config.getBaseLongTraderParam();
baseGridElement.setLongOrderId(baseLongTraderParam.getEntryOrderId());
baseGridElement.setHasLongOrder(true);
- TraderParam baseShortTraderParam = config.getBaseShortTraderParam();
baseGridElement.setShortOrderId(baseShortTraderParam.getEntryOrderId());
baseGridElement.setHasShortOrder(true);
--
Gitblit v1.9.1