Administrator
2026-06-08 6775730a44ad9a564a0f6038f4d0b5e11e21833e
src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
@@ -793,7 +793,7 @@
                shortEntryQty = 1;
                extendShortStopLoss(filledQty);
                log.info("[Gate] 空单成交 gridId:{}, qty:{}, 追挂止损", shortGridElement.getId(), filledQty);
                checkMaxPositionAndPlaceTakeProfit(false, shortGridElement.getId());
//                checkMaxPositionAndPlaceTakeProfit(false, shortGridElement.getId());
            }
        }
        GridElement longGridElement = GridElement.findByLongOrderId(orderId);
@@ -804,7 +804,7 @@
                longEntryQty = 1;
                extendLongStopLoss(filledQty);
                log.info("[Gate] 多单成交 gridId:{}, qty:{}, 追挂止损", longGridElement.getId(), filledQty);
                checkMaxPositionAndPlaceTakeProfit(true, longGridElement.getId());
//                checkMaxPositionAndPlaceTakeProfit(true, longGridElement.getId());
            }
        }
    }
@@ -928,7 +928,8 @@
            baseGridElement.setShortOrderId(baseShortTraderParam.getEntryOrderId());
            baseGridElement.setHasShortOrder(true);
            for (int id = 2; id <= 11; id++) {
            int shortTime = Integer.parseInt(config.getBaseQuantity()) + 1;
            for (int id = 2; id <= shortTime; id++) {
                GridElement elem = GridElement.findById(id);
                if (elem == null) {
                    continue;
@@ -948,7 +949,9 @@
                );
            }
            for (int id = -2; id >= -11; id--) {
            int longTime = Integer.parseInt(config.getBaseQuantity()) + 1;
            for (int id = -2; id >= -longTime; id--) {
                GridElement elem = GridElement.findById(id);
                if (elem == null) {
                    continue;
@@ -968,7 +971,7 @@
                );
            }
            log.info("[Gate] 止损单已全部挂完, 空仓止损: 2~11, 多仓止损: -2~-11");
            log.info("[Gate] 止损单已全部挂完, 空仓止损: 2~{}, 多仓止损: -2~-{}", shortTime, longTime);
            state = StrategyState.ACTIVE;
        }
    }
@@ -1595,14 +1598,15 @@
            BigDecimal totalEquity = unrealisedPnl.add(available);
            // 估算平仓手续费:(多仓张数+空仓张数) × 合约面值 × 当前价 × taker费率
            BigDecimal closeContractValue = longPositionSize.add(shortPositionSize)
                    .multiply(CT_VAL).multiply(lastKlinePrice != null ? lastKlinePrice : BigDecimal.ZERO);
            BigDecimal totalSize = longPositionSize.abs().add(shortPositionSize.abs());
            BigDecimal closeContractValue =
                    totalSize.multiply(CT_VAL).multiply(lastKlinePrice != null ? lastKlinePrice : BigDecimal.ZERO);
            BigDecimal estimatedFee = closeContractValue.multiply(TAKER_FEE_RATE);
            BigDecimal netEquity = totalEquity.subtract(estimatedFee);
            BigDecimal target = initialPrincipal.add(config.getExpectedProfit());
            log.info("[Gate] 盈亏检查 upl:{}, avail:{}, 合计:{}, 估手续费:{}, 净权益:{}, 目标:{}",
                    unrealisedPnl, available, totalEquity, estimatedFee, netEquity, target);
            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;