| | |
| | | /** 空仓止损订单 ID */ |
| | | private String shortStopLossOrderId; |
| | | |
| | | /** 索引重建锁,保证 refreshIndices() 与计数读取之间互斥,避免 clear→rebuild 窗口期读到 0 */ |
| | | private static final Object INDEX_LOCK = new Object(); |
| | | |
| | | /** 全局 ID 索引,由 {@link GateConfig#setGridElements(List)} 触发重建,O(1) 查找 */ |
| | | private static final Map<Integer, GridElement> INDEX = new ConcurrentHashMap<>(); |
| | | /** 全局价格索引,由 {@link GateConfig#setGridElements(List)} 触发重建,O(1) 查找 */ |
| | |
| | | return SHORT_TP_ORDER_ID_INDEX.get(orderId); |
| | | } |
| | | |
| | | /** @return 当前多仓止盈单数量(与 refreshIndices 互斥,避免清空窗口读到 0) */ |
| | | public static int getLongTakeProfitCount() { |
| | | synchronized (INDEX_LOCK) { return LONG_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))。 |
| | | */ |
| | |
| | | * 使快速查找方法获取到最新数据。 |
| | | */ |
| | | 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(); |
| | | } |
| | | |