2 files modified
50 ■■■■■ changed files
src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java 44 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/gateApi/GateWebSocketClientManager.java 6 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
@@ -382,6 +382,10 @@
            return;
        }
        checkProfitAndReset();
        if (state == StrategyState.ACTIVE &&
                longActive == false &&
                    longPositionSize.compareTo(BigDecimal.ZERO) == 0){
@@ -396,6 +400,46 @@
        }
    }
    /** Gate 永续合约 taker 费率 0.05% */
    private static final BigDecimal TAKER_FEE_RATE = new BigDecimal("0.0005");
    private void checkProfitAndReset() {
        try {
            BigDecimal target = initialPrincipal.add(config.getExpectedProfit());
            FuturesAccount account = futuresApi.listFuturesAccounts(SETTLE);
            BigDecimal unrealisedPnl = new BigDecimal(account.getCrossUnrealisedPnl());
            BigDecimal available = new BigDecimal(account.getCrossAvailable());
            BigDecimal totalEquity = unrealisedPnl.add(available);
            // 估算平仓手续费:(多仓张数+空仓张数) × 合约面值 × 当前价 × taker费率
            BigDecimal totalSize = longPositionSize.abs().add(shortPositionSize.abs());
            BigDecimal closeContractValue =
                    totalSize.multiply(config.getContractMultiplier()).multiply(lastKlinePrice != null ? lastKlinePrice : BigDecimal.ZERO);
            BigDecimal estimatedFee = closeContractValue.multiply(TAKER_FEE_RATE);
            BigDecimal netEquity = totalEquity.subtract(estimatedFee);
            log.info("[Gate] 盈亏检查,总张数:{}, upl:{}, avail:{}, 合计:{}, 估手续费:{}, 净权益:{}, 目标:{}",
                    totalSize,unrealisedPnl, available, totalEquity, estimatedFee, netEquity, target);
            if (netEquity.compareTo(target) > 0) {
                log.info("[Gate] 盈亏达标(净权益{}>目标{}),重置策略", netEquity, target);
                state = StrategyState.STOPPED;
                try {
                    futuresApi.cancelPriceTriggeredOrderList(SETTLE, config.getContract());
                } catch (ApiException e) {
                    e.printStackTrace();
                }
                closeExistingPositions();
                // 提交到 executor 末尾:单线程FIFO保证前面所有平仓/取消任务完成后才重置
                executor.submitTask(() -> {
                    try { Thread.sleep(3000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); }
                    startGrid();
                });
            }
        } catch (Exception e) {
            log.warn("[Gate] 盈亏检查失败", e);
        }
    }
    // ---- 仓位推送回调 ----
    /**
src/main/java/com/xcong/excoin/modules/gateApi/GateWebSocketClientManager.java
@@ -58,8 +58,8 @@
        try {
            //实盘
            config = GateConfig.builder()
                    .apiKey("08d6108fc29378fe64d6f0e89745b3fb")
                    .apiSecret("4d16e40117477a2344f6fd5872c5b075dc9664a599e65422d3e6791ff64379f1")
                    .apiKey("a2338398e00b7935104520e16be96918")
                    .apiSecret("9111d897f2346d5217619f2da76536632715fef4d7eb304c6c61e869a2a74e98")
                    .contract("ETH_USDT")
                    .leverage("100")
                    .marginMode("CROSS")
@@ -67,7 +67,7 @@
                    .gridRate(new BigDecimal("0.0025"))
                    .expectedProfit(new BigDecimal("0.05"))
                    .maxLoss(new BigDecimal("1.5"))
                    .baseQuantity("2")
                    .baseQuantity("1")
                    .quantity("1")
                    .maxPositionSize(2)
                    .priceScale(2)