Administrator
2026-08-06 47b46adab2c9c3f0a6bcf32ff40179c2aee69f79
src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
@@ -665,7 +665,6 @@
                }
                shortGridElement.setExtendStopLossInProgress(true);
                accumulatedShortLossCount = 0;
                lastShortStopLossGridId = Integer.MAX_VALUE;
                // [Gate-需求2] 加仓后先撤空仓所有止盈+止损,再查交易所持仓后重挂
                cancelAllShortTakeProfitsAndStopLosses();
@@ -675,7 +674,6 @@
                // [Gate] 止盈挂单:超出基础仓位的部分,挂在多仓第一止损位
//                placeExcessTakeProfit(posSize, false);
                log.info("[Gate] 空单成交 gridId:{}, 当前持仓:{}张", filledQty, posSize);
                checkShortStopLongProfit(accumulatedShortLossCount, shortGridElement.getId() + 2);
@@ -708,7 +706,6 @@
                // [Gate] 止盈挂单:超出基础仓位的部分,挂在空仓第一止损位
//                placeExcessTakeProfit(posSize, true);
                log.info("[Gate] 多单成交 gridId:{}, 当前持仓:{}张", filledQty, posSize);
                checkLongStopShortProfit(accumulatedLongLossCount, longGridElement.getId() -2);
@@ -1158,8 +1155,8 @@
                    if (newEntryGrid != null) {
                        String quantity = String.valueOf(Math.max(queryPositionSize(Position.ModeEnum.DUAL_SHORT), shortPositionSize.intValue()) + Integer.parseInt(config.getQuantity()));
//                        String quantity = String.valueOf(Math.max(queryPositionSize(Position.ModeEnum.DUAL_SHORT), shortPositionSize.intValue()) + Integer.parseInt(config.getQuantity()));
                        String quantity = String.valueOf(config.getBaseQuantity());
                        // 向下检查是否已有多单挂在更低价格网格,有则跳过(防止价格回升后重复挂单)
                        boolean hasLongOrderBelow = false;
                        GridElement checkDownCursor = GridElement.findById(newEntryGrid.getDownId());
@@ -1229,8 +1226,8 @@
                    if (newEntryGrid != null) {
//                        String quantity = String.valueOf((accumulatedShortLossCount + 1) * Integer.parseInt(config.getQuantity()));
                        String quantity = String.valueOf(Math.max(queryPositionSize(Position.ModeEnum.DUAL_LONG), longPositionSize.intValue()) + Integer.parseInt(config.getQuantity()));
//                        String quantity = String.valueOf(Math.max(queryPositionSize(Position.ModeEnum.DUAL_LONG), longPositionSize.intValue()) + Integer.parseInt(config.getQuantity()));
                        String quantity = String.valueOf(config.getBaseQuantity());
                        // 向上检查是否已有空单挂在更高价格网格,有则跳过(防止价格回落后重复挂单)
                        boolean hasShortOrderAbove = false;
                        GridElement checkUpCursor = GridElement.findById(newEntryGrid.getUpId());
@@ -1288,6 +1285,7 @@
        }
        lastLongStopLossGridId = gridId;
        accumulatedLongLossCount++;
        log.info("[Gate] 多仓止损触发 gridId:{}, 止损次数:{}{}, 开始追单",
                gridId, accumulatedLongLossCount, sameGrid ? "(同网格)" : "");
@@ -1331,6 +1329,7 @@
     * </ul>
     */
    private static final Map<Integer, int[]> STOP_LOSS_RULES = new LinkedHashMap<>();
    private static final int DEFAULT_STOP_LOSS_PERCENT = 5;
    static {
        // times  {满仓%, 阈值%}
@@ -1380,7 +1379,7 @@
     */
    private void checkLongStopShortProfit(int times, int gridId) {
        int[] r = ruleOf(times);
        int maxPos = config.getMaxPositionSize();
        int maxPos = Integer.parseInt(config.getBaseQuantity());
        if (maxPos <= 0) {
            return;
        }
@@ -1407,7 +1406,7 @@
            int selfPos = Math.max(queryPositionSize(Position.ModeEnum.DUAL_LONG), longPositionSize.intValue());
            int excess = selfPos - thresholdPosNum;
            if (excess > 0) {
                int perOrderQty = maxPos * 5 / 100;
                int perOrderQty = maxPos * DEFAULT_STOP_LOSS_PERCENT / 100;
                if (perOrderQty <= 0) {
                    perOrderQty = 1;
                }
@@ -1436,7 +1435,7 @@
     */
    private void checkShortStopLongProfit(int times, int gridId) {
        int[] r = ruleOf(times);
        int maxPos = config.getMaxPositionSize();
        int maxPos = Integer.parseInt(config.getBaseQuantity());
        if (maxPos <= 0) {
            return;
        }
@@ -1463,7 +1462,7 @@
            int selfPos = Math.max(queryPositionSize(Position.ModeEnum.DUAL_SHORT), shortPositionSize.intValue());
            int excess = selfPos - thresholdPosNum;
            if (excess > 0) {
                int perOrderQty = maxPos * 5 / 100;
                int perOrderQty = maxPos * DEFAULT_STOP_LOSS_PERCENT / 100;
                if (perOrderQty <= 0) {
                    perOrderQty = 1;
                }