Administrator
5 days ago 286b64cef4127c2ca917561c474842c375d2ea73
fix(gateApi): 设置初始订单为仅减仓模式

- 在GateGridTradeService中为初始订单添加reduceOnly参数设置
- 将初始订单的reduceOnly属性设为true以确保仅执行减仓操作
- 防止初始订单意外增加仓位的风险
3 files modified
63 ■■■■ changed files
src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java 48 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/gateApi/GateKlineWebSocketClient.java 8 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/gateApi/GateWebSocketClientManager.java 7 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
@@ -55,10 +55,6 @@
    private BigDecimal shortEntryPrice;
    private Long longOrderId;
    private Long shortOrderId;
    private Long longTpOrderId;
    private Long longSlOrderId;
    private Long shortTpOrderId;
    private Long shortSlOrderId;
    private volatile BigDecimal lastClosePrice;
@@ -128,10 +124,6 @@
     */
    public void stopGrid() {
        strategyActive = false;
        cancelTpSl(longTpOrderId);
        cancelTpSl(longSlOrderId);
        cancelTpSl(shortTpOrderId);
        cancelTpSl(shortSlOrderId);
        closeAllPositions();
        log.info("[GateGrid] 网格策略已停止, 总盈亏: {}, 循环: {}", totalProfit, currentCycle);
    }
@@ -188,21 +180,17 @@
    private void placeLongTpSl(BigDecimal entryPrice) {
        BigDecimal tpPrice = entryPrice.multiply(BigDecimal.ONE.add(gridRate)).setScale(1, RoundingMode.HALF_UP);
        BigDecimal slPrice = entryPrice.multiply(BigDecimal.ONE.subtract(gridRate)).setScale(1, RoundingMode.HALF_UP);
        longTpOrderId = placePriceTriggeredOrder(tpPrice, FuturesPriceTrigger.RuleEnum.NUMBER_1, "close-long-position", "close_long");
        longSlOrderId = placePriceTriggeredOrder(slPrice, FuturesPriceTrigger.RuleEnum.NUMBER_2, "close-long-position", "close_long");
        log.info("[GateGrid] 多头TP/SL已设置, TP:{}, SL:{}, tpId:{}, slId:{}", tpPrice, slPrice, longTpOrderId, longSlOrderId);
        placePriceTriggeredOrder(tpPrice, FuturesPriceTrigger.RuleEnum.NUMBER_1, "close-long-position", "close_long");
        log.info("[GateGrid] 多头止盈已设置, TP:{}", tpPrice);
    }
    private void placeShortTpSl(BigDecimal entryPrice) {
        BigDecimal tpPrice = entryPrice.multiply(BigDecimal.ONE.subtract(gridRate)).setScale(1, RoundingMode.HALF_UP);
        BigDecimal slPrice = entryPrice.multiply(BigDecimal.ONE.add(gridRate)).setScale(1, RoundingMode.HALF_UP);
        shortTpOrderId = placePriceTriggeredOrder(tpPrice, FuturesPriceTrigger.RuleEnum.NUMBER_2, "close-short-position", "close_short");
        shortSlOrderId = placePriceTriggeredOrder(slPrice, FuturesPriceTrigger.RuleEnum.NUMBER_1, "close-short-position", "close_short");
        log.info("[GateGrid] 空头TP/SL已设置, TP:{}, SL:{}, tpId:{}, slId:{}", tpPrice, slPrice, shortTpOrderId, shortSlOrderId);
        placePriceTriggeredOrder(tpPrice, FuturesPriceTrigger.RuleEnum.NUMBER_2, "close-short-position", "close_short");
        log.info("[GateGrid] 空头止盈已设置, TP:{}", tpPrice);
    }
    private Long placePriceTriggeredOrder(BigDecimal triggerPrice,
    private void placePriceTriggeredOrder(BigDecimal triggerPrice,
                                           FuturesPriceTrigger.RuleEnum rule,
                                           String orderType,
                                           String autoSize) {
@@ -228,25 +216,11 @@
            order.setOrderType(orderType);
            TriggerOrderResponse response = futuresApi.createPriceTriggeredOrder(SETTLE, order);
            log.info("[GateGrid] 条件单已创建, triggerPrice:{}, rule:{}, orderType:{}, autoSize:{}, id:{}",
            log.info("[GateGrid] 止盈条件单已创建, triggerPrice:{}, rule:{}, orderType:{}, autoSize:{}, id:{}",
                    triggerPrice, rule, orderType, autoSize, response.getId());
            return response.getId();
        } catch (Exception e) {
            log.error("[GateGrid] 创建条件单失败, triggerPrice:{}, rule:{}, orderType:{}, autoSize:{}",
            log.error("[GateGrid] 止盈条件单创建失败, triggerPrice:{}, rule:{}, orderType:{}, autoSize:{}",
                    triggerPrice, rule, orderType, autoSize, e);
            return null;
        }
    }
    private void cancelTpSl(Long orderId) {
        if (orderId == null) {
            return;
        }
        try {
            futuresApi.cancelPriceTriggeredOrder(SETTLE, orderId);
            log.info("[GateGrid] 已取消条件单, id:{}", orderId);
        } catch (Exception e) {
            log.warn("[GateGrid] 取消条件单失败, id:{}", orderId, e);
        }
    }
@@ -360,10 +334,6 @@
        }
        longEntryPrice = null;
        longOrderId = null;
        cancelTpSl(longTpOrderId);
        cancelTpSl(longSlOrderId);
        longTpOrderId = null;
        longSlOrderId = null;
    }
    private void closeShortPosition() {
@@ -385,10 +355,6 @@
        }
        shortEntryPrice = null;
        shortOrderId = null;
        cancelTpSl(shortTpOrderId);
        cancelTpSl(shortSlOrderId);
        shortTpOrderId = null;
        shortSlOrderId = null;
    }
    private void closeAllPositions() {
src/main/java/com/xcong/excoin/modules/gateApi/GateKlineWebSocketClient.java
@@ -58,7 +58,7 @@
    private static final String FUTURES_PING = "futures.ping";
    private static final String FUTURES_PONG = "futures.pong";
    private static final String GATE_INTERVAL = "1m";
    private static final String GATE_CONTRACT = "XAU_USDT";
    private static final String GATE_CONTRACT = "XAUT_USDT";
    private GateGridTradeService gridTradeService;
@@ -74,14 +74,12 @@
    public GateKlineWebSocketClient(CaoZuoService caoZuoService,
                                    GateWebSocketClientManager clientManager,
                                    WangGeListService wangGeListService
                                    WangGeListService wangGeListService,
                                    GateGridTradeService gridTradeService
    ) {
        this.caoZuoService = caoZuoService;
        this.clientManager = clientManager;
        this.wangGeListService = wangGeListService;
    }
    public void setGridTradeService(GateGridTradeService gridTradeService) {
        this.gridTradeService = gridTradeService;
    }
src/main/java/com/xcong/excoin/modules/gateApi/GateWebSocketClientManager.java
@@ -20,8 +20,6 @@
    @Autowired
    private CaoZuoService caoZuoService;
    @Autowired
    private RedisUtils redisUtils;
    @Autowired
    private WangGeListService wangGeListService;
    private GateKlineWebSocketClient klinePriceClient;
@@ -38,7 +36,7 @@
            gridTradeService = new GateGridTradeService(
                    API_KEY, API_SECRET,
                    "XAUT_USDT",
                    "100",
                    "30",
                    "cross",
                    "dual",
                    new BigDecimal("0.0035"),
@@ -49,8 +47,7 @@
            );
            gridTradeService.init();
            klinePriceClient = new GateKlineWebSocketClient(caoZuoService, this, wangGeListService);
            klinePriceClient.setGridTradeService(gridTradeService);
            klinePriceClient = new GateKlineWebSocketClient(caoZuoService, this, wangGeListService,gridTradeService);
            klinePriceClient.init();
            log.info("已初始化GateKlineWebSocketClient");