Administrator
2026-05-26 fe567e81a50a00beb1a26f70e69e923ecb3d6bb3
fix(grid): 修复网格交易中多空订单查找逻辑错误

- 修正了 findAllLongOrders 和 findAllShortOrders 方法的命名与实际功能不符的问题
- 更新了多仓位处理逻辑,保留最高价格的多仓订单并取消其他订单
- 更新了空仓位处理逻辑,保留最低价格的空仓订单并取消其他订单
- 确保仓位变更时正确取消对应的条件订单
2 files modified
22 ■■■■ changed files
src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java 18 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/gateApi/GridElement.java 4 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
@@ -426,10 +426,15 @@
                    tryGenerateQueues();
                }else {
                    longPositionSize = size;
                    //取消多仓位线以上的开多仓挂单
                    List<GridElement> allShortOrders = GridElement.findAllShortOrders(longEntryPrice);
                    List<GridElement> allShortOrders = GridElement.findAllLongOrders(longEntryPrice);
                    if (CollUtil.isNotEmpty(allShortOrders)){
                        GridElement keep = allShortOrders.stream()
                                .max((a, b) -> a.getGridPrice().compareTo(b.getGridPrice()))
                                .orElse(null);
                        for (GridElement e : allShortOrders) {
                            if (e == keep) {
                                continue;
                            }
                            executor.cancelConditionalOrder(
                                    e.getLongOrderId(),
                                    orderId -> {
@@ -472,10 +477,15 @@
                    tryGenerateQueues();
                }else {
                    shortPositionSize = size.abs();
                    //取消空仓仓位线以下的开空仓挂单
                    List<GridElement> allLongOrders = GridElement.findAllLongOrders(shortEntryPrice);
                    List<GridElement> allLongOrders = GridElement.findAllShortOrders(shortEntryPrice);
                    if (CollUtil.isNotEmpty(allLongOrders)){
                        GridElement keep = allLongOrders.stream()
                                .min((a, b) -> a.getGridPrice().compareTo(b.getGridPrice()))
                                .orElse(null);
                        for (GridElement e : allLongOrders) {
                            if (e == keep) {
                                continue;
                            }
                            executor.cancelConditionalOrder(
                                    e.getShortOrderId(),
                                    orderId -> {
src/main/java/com/xcong/excoin/modules/gateApi/GridElement.java
@@ -245,7 +245,7 @@
     *
     * @return 已挂多仓条件单的 GridElement 列表
     */
    public static List<GridElement> findAllLongOrders(BigDecimal currentPrice) {
    public static List<GridElement> findAllShortOrders(BigDecimal currentPrice) {
        List<GridElement> result = new ArrayList<>();
        for (GridElement e : INDEX.values()) {
            if (e.isHasShortOrder() && e.getGridPrice().compareTo(currentPrice) < 0) {
@@ -261,7 +261,7 @@
     *
     * @return 已挂空仓条件单的 GridElement 列表
     */
    public static List<GridElement> findAllShortOrders(BigDecimal currentPrice) {
    public static List<GridElement> findAllLongOrders(BigDecimal currentPrice) {
        List<GridElement> result = new ArrayList<>();
        for (GridElement e : INDEX.values()) {
            if (e.isHasLongOrder() && e.getGridPrice().compareTo(currentPrice) > 0) {