e8c7e18c54e2e325df67993bf14726105ef7e259..3feff76c1be5cb2b27472976fd987669aff7559e
5 days ago Administrator
config(gateApi): 更新Gate API配置参数
3feff7 diff | tree
5 days ago Administrator
fix(grid): 修复网格元素索引并发访问问题
3fbbf1 diff | tree
2 files modified
48 ■■■■■ changed files
src/main/java/com/xcong/excoin/modules/gateApi/GateWebSocketClientManager.java 12 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/gateApi/GridElement.java 36 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/gateApi/GateWebSocketClientManager.java
@@ -58,18 +58,18 @@
        try {
            //实盘
            config = GateConfig.builder()
                    .apiKey("a2338398e00b7935104520e16be96918")
                    .apiSecret("9111d897f2346d5217619f2da76536632715fef4d7eb304c6c61e869a2a74e98")
                    .apiKey("b698ffb0cabdb575d04f42539b4b5acf")
                    .apiSecret("6bd6d436abd5c05ebf382bf4494cf6f9444ec1b074eadbba4ee239aaffb0fa09")
                    .contract("ETH_USDT")
                    .leverage("100")
                    .marginMode("CROSS")
                    .positionMode("dual")
                    .gridRate(new BigDecimal("0.0035"))
                    .gridRate(new BigDecimal("0.0025"))
                    .expectedProfit(new BigDecimal("2.5"))
                    .maxLoss(new BigDecimal("1.5"))
                    .baseQuantity("9")
                    .quantity("3")
                    .restartGridSpan(2)
                    .baseQuantity("30")
                    .quantity("30")
                    .restartGridSpan(10)
                    .maxPositionSize(2)
                    .priceScale(2)
                    .contractMultiplier(new BigDecimal("0.01"))
src/main/java/com/xcong/excoin/modules/gateApi/GridElement.java
@@ -92,6 +92,9 @@
    /** 空仓止损订单 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) 查找 */
@@ -169,11 +172,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))。
@@ -216,16 +223,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();
    }