fix(gateApi): 修复网格交易止损订单逻辑错误
- 添加 aCount < 0 的边界条件检查并提前返回
- 重构止损订单分配逻辑,根据 aCount 值动态计算 A、B、C 位置的订单数量
- 修复多仓和空仓止损订单的数量分配算法
- 更新日志输出格式以匹配新的订单分配逻辑
- 优化订单放置逻辑,只有当订单数量大于 0 时才执行挂单操作
| | |
| | | private void extendLongStopLoss(int filledQty, int gridId) { |
| | | int qty = Integer.parseInt(config.getQuantity()); |
| | | int aCount = Math.max(0, filledQty / qty - 2); |
| | | log.info("[Gate] 多仓追挂止损, 成交{}张, gridId:{}, A({})x{} B({})x1 C({})x1", |
| | | filledQty, gridId, gridId - 2, aCount, gridId - 3, gridId - 4); |
| | | if (aCount < 0) return; |
| | | |
| | | // A 位置:挂 aCount 个独立止损单 |
| | | placeStopLossOrders(gridId - 2, aCount, qty, FuturesPriceTrigger.RuleEnum.NUMBER_2, |
| | | int a, b, c; |
| | | if (aCount == 0) { a = 2; b = 0; c = 0; } |
| | | else if (aCount == 1) { a = 2; b = 1; c = 0; } |
| | | else { a = aCount; b = 1; c = 1; } |
| | | |
| | | log.info("[Gate] 多仓追挂止损, 成交{}张, gridId:{}, A({})x{} B({})x{} C({})x{}", |
| | | filledQty, gridId, gridId - 2, a, gridId - 3, b, gridId - 4, c); |
| | | |
| | | if (a > 0) placeStopLossOrders(gridId - 2, a, qty, FuturesPriceTrigger.RuleEnum.NUMBER_2, |
| | | ORDER_TYPE_CLOSE_LONG, true); |
| | | // B 位置:挂 1 个 |
| | | placeStopLossOrders(gridId - 3, 1, qty, FuturesPriceTrigger.RuleEnum.NUMBER_2, |
| | | if (b > 0) placeStopLossOrders(gridId - 3, b, qty, FuturesPriceTrigger.RuleEnum.NUMBER_2, |
| | | ORDER_TYPE_CLOSE_LONG, true); |
| | | // C 位置:挂 1 个 |
| | | placeStopLossOrders(gridId - 4, 1, qty, FuturesPriceTrigger.RuleEnum.NUMBER_2, |
| | | if (c > 0) placeStopLossOrders(gridId - 4, c, qty, FuturesPriceTrigger.RuleEnum.NUMBER_2, |
| | | ORDER_TYPE_CLOSE_LONG, true); |
| | | } |
| | | |
| | | /** |
| | | * 空仓止损追单 — 3 个固定位置,从近到远分配合约。 |
| | | * A(gridId+2): (filledQty/qty - 2) 个独立止损单,每个 qty 张 |
| | | * B(gridId+3): 1 个止损单,qty 张 |
| | | * C(gridId+4): 1 个止损单,qty 张 |
| | | * 注意:空仓止损在 gridId 正方向,触发价 ≥ 网格价。 |
| | | * aCount<0跳过, aCount=0→A=2, aCount=1→A=2,B=1, aCount>=2→A=aCount,B=1,C=1 |
| | | */ |
| | | private void extendShortStopLoss(int filledQty, int gridId) { |
| | | int qty = Integer.parseInt(config.getQuantity()); |
| | | int aCount = Math.max(0, filledQty / qty - 2); |
| | | log.info("[Gate] 空仓追挂止损, 成交{}张, gridId:{}, A({})x{} B({})x1 C({})x1", |
| | | filledQty, gridId, gridId + 2, aCount, gridId + 3, gridId + 4); |
| | | if (aCount < 0) return; |
| | | |
| | | // A 位置:挂 aCount 个独立止损单 |
| | | placeStopLossOrders(gridId + 2, aCount, qty, FuturesPriceTrigger.RuleEnum.NUMBER_1, |
| | | int a, b, c; |
| | | if (aCount == 0) { a = 2; b = 0; c = 0; } |
| | | else if (aCount == 1) { a = 2; b = 1; c = 0; } |
| | | else { a = aCount; b = 1; c = 1; } |
| | | |
| | | log.info("[Gate] 空仓追挂止损, 成交{}张, gridId:{}, A({})x{} B({})x{} C({})x{}", |
| | | filledQty, gridId, gridId + 2, a, gridId + 3, b, gridId + 4, c); |
| | | |
| | | if (a > 0) placeStopLossOrders(gridId + 2, a, qty, FuturesPriceTrigger.RuleEnum.NUMBER_1, |
| | | ORDER_TYPE_CLOSE_SHORT, false); |
| | | // B 位置:挂 1 个 |
| | | placeStopLossOrders(gridId + 3, 1, qty, FuturesPriceTrigger.RuleEnum.NUMBER_1, |
| | | if (b > 0) placeStopLossOrders(gridId + 3, b, qty, FuturesPriceTrigger.RuleEnum.NUMBER_1, |
| | | ORDER_TYPE_CLOSE_SHORT, false); |
| | | // C 位置:挂 1 个 |
| | | placeStopLossOrders(gridId + 4, 1, qty, FuturesPriceTrigger.RuleEnum.NUMBER_1, |
| | | if (c > 0) placeStopLossOrders(gridId + 4, c, qty, FuturesPriceTrigger.RuleEnum.NUMBER_1, |
| | | ORDER_TYPE_CLOSE_SHORT, false); |
| | | } |
| | | |