From e45e705c22df5bc979e72db6014dd1ff9637be42 Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Wed, 24 Jun 2026 22:21:58 +0800
Subject: [PATCH] fix(okx): 修复网格交易成交日志记录问题
---
src/main/java/com/xcong/excoin/modules/okxApi/GridElement.java | 53 +++++++++++++++++++++++++++++++----------------------
1 files changed, 31 insertions(+), 22 deletions(-)
diff --git a/src/main/java/com/xcong/excoin/modules/gateApi/GridElement.java b/src/main/java/com/xcong/excoin/modules/okxApi/GridElement.java
similarity index 91%
rename from src/main/java/com/xcong/excoin/modules/gateApi/GridElement.java
rename to src/main/java/com/xcong/excoin/modules/okxApi/GridElement.java
index dbcfe19..0e3dc15 100644
--- a/src/main/java/com/xcong/excoin/modules/gateApi/GridElement.java
+++ b/src/main/java/com/xcong/excoin/modules/okxApi/GridElement.java
@@ -1,4 +1,4 @@
-package com.xcong.excoin.modules.gateApi;
+package com.xcong.excoin.modules.okxApi;
import java.math.BigDecimal;
import java.util.ArrayList;
@@ -48,7 +48,6 @@
* <h3>何时填充 TraderParam</h3>
* 初始化时 {@code updateGridElements()} 为每个元素预填充 longTraderParam 和 shortTraderParam
* (含 direction/entryPrice/takeProfitPrice/quantity),订单ID字段在挂单成功后由
- * {@link GateGridTradeService} 的 4 个辅助方法写入。
*
* <h3>使用示例</h3>
* <pre>
@@ -92,17 +91,20 @@
/** 空仓止损订单 ID */
private String shortStopLossOrderId;
- /** 全局 ID 索引,由 {@link GateConfig#setGridElements(List)} 触发重建,O(1) 查找 */
+ /** 索引重建锁,保证 refreshIndices() 与计数读取之间互斥,避免 clear→rebuild 窗口期读到 0 */
+ private static final Object INDEX_LOCK = new Object();
+
+ /** 全局 ID 索引,由 { GateConfig#setGridElements(List)} 触发重建,O(1) 查找 */
private static final Map<Integer, GridElement> INDEX = new ConcurrentHashMap<>();
- /** 全局价格索引,由 {@link GateConfig#setGridElements(List)} 触发重建,O(1) 查找 */
+ /** 全局价格索引,由 { GateConfig#setGridElements(List)} 触发重建,O(1) 查找 */
private static final Map<BigDecimal, GridElement> PRICE_INDEX = new ConcurrentHashMap<>();
- /** 全局多仓订单 ID 索引,由 {@link GateConfig#setGridElements(List)} 触发重建,O(1) 查找 */
+ /** 全局多仓订单 ID 索引,由 { GateConfig#setGridElements(List)} 触发重建,O(1) 查找 */
private static final Map<String, GridElement> LONG_ORDER_ID_INDEX = new ConcurrentHashMap<>();
- /** 全局空仓订单 ID 索引,由 {@link GateConfig#setGridElements(List)} 触发重建,O(1) 查找 */
+ /** 全局空仓订单 ID 索引,由 { GateConfig#setGridElements(List)} 触发重建,O(1) 查找 */
private static final Map<String, GridElement> SHORT_ORDER_ID_INDEX = new ConcurrentHashMap<>();
- /** 全局多仓止盈订单 ID 索引,由 {@link GateConfig#setGridElements(List)} 触发重建,O(1) 查找 */
+ /** 全局多仓止盈订单 ID 索引,由 { GateConfig#setGridElements(List)} 触发重建,O(1) 查找 */
private static final Map<String, GridElement> LONG_TP_ORDER_ID_INDEX = new ConcurrentHashMap<>();
- /** 全局空仓止盈订单 ID 索引,由 {@link GateConfig#setGridElements(List)} 触发重建,O(1) 查找 */
+ /** 全局空仓止盈订单 ID 索引,由 { GateConfig#setGridElements(List)} 触发重建,O(1) 查找 */
private static final Map<String, GridElement> SHORT_TP_ORDER_ID_INDEX = new ConcurrentHashMap<>();
/** 全局多仓止损订单 ID 索引 */
private static final Map<String, GridElement> LONG_SL_ORDER_ID_INDEX = new ConcurrentHashMap<>();
@@ -169,11 +171,15 @@
return SHORT_TP_ORDER_ID_INDEX.get(orderId);
}
- /** @return 当前多仓止盈单数量 */
- public static int getLongTakeProfitCount() { return LONG_TP_ORDER_ID_INDEX.size(); }
+ /** @return 当前多仓止盈单数量(与 refreshIndices 互斥,避免清空窗口读到 0) */
+ public static int getLongTakeProfitCount() {
+ synchronized (INDEX_LOCK) { return LONG_TP_ORDER_ID_INDEX.size(); }
+ }
- /** @return 当前空仓止盈单数量 */
- public static int getShortTakeProfitCount() { return SHORT_TP_ORDER_ID_INDEX.size(); }
+ /** @return 当前空仓止盈单数量(与 refreshIndices 互斥,避免清空窗口读到 0) */
+ public static int getShortTakeProfitCount() {
+ synchronized (INDEX_LOCK) { return SHORT_TP_ORDER_ID_INDEX.size(); }
+ }
/**
* 根据多仓止损订单 ID 快速查找网格元素(O(1))。
@@ -191,7 +197,7 @@
/**
* 从列表中重建全局 ID 索引和价格索引。
- * 由 {@link GateConfig#setGridElements(List)} 在每次列表变更后调用。
+ * 由 { GateConfig#setGridElements(List)} 在每次列表变更后调用。
*/
public static void rebuildIndex(List<GridElement> elements) {
INDEX.clear();
@@ -216,16 +222,19 @@
* 使快速查找方法获取到最新数据。
*/
public static void refreshIndices() {
- PRICE_INDEX.clear();
- LONG_ORDER_ID_INDEX.clear();
- SHORT_ORDER_ID_INDEX.clear();
- LONG_TP_ORDER_ID_INDEX.clear();
- SHORT_TP_ORDER_ID_INDEX.clear();
- LONG_SL_ORDER_ID_INDEX.clear();
- SHORT_SL_ORDER_ID_INDEX.clear();
- for (GridElement e : INDEX.values()) {
- putDynamicIndices(e);
+ synchronized (INDEX_LOCK) {
+ PRICE_INDEX.clear();
+ LONG_ORDER_ID_INDEX.clear();
+ SHORT_ORDER_ID_INDEX.clear();
+ LONG_TP_ORDER_ID_INDEX.clear();
+ SHORT_TP_ORDER_ID_INDEX.clear();
+ LONG_SL_ORDER_ID_INDEX.clear();
+ SHORT_SL_ORDER_ID_INDEX.clear();
+ for (GridElement e : INDEX.values()) {
+ putDynamicIndices(e);
+ }
}
+ // logAll 在锁外执行,不阻塞计数查询
logAll();
}
--
Gitblit v1.9.1