| | |
| | | longTakeProfitTraderIdParam(longTpElem, null, false); |
| | | log.info("[Gate] 多仓止盈触发 gridId:{}, orderId:{}", longTpElem.getId(), orderId); |
| | | cancelFarthestLongStopLoss(); |
| | | checkLastTakeProfitAndRestart(); |
| | | // checkLastTakeProfitAndRestart(); |
| | | return; |
| | | } |
| | | // [Gate-需求1] 空仓止盈触发:清空止盈状态 + 取消最远空仓止损 + 检查是否最后一个止盈 |
| | |
| | | shortTakeProfitTraderIdParam(shortTpElem, null, false); |
| | | log.info("[Gate] 空仓止盈触发 gridId:{}, orderId:{}", shortTpElem.getId(), orderId); |
| | | cancelFarthestShortStopLoss(); |
| | | checkLastTakeProfitAndRestart(); |
| | | // checkLastTakeProfitAndRestart(); |
| | | return; |
| | | } |
| | | |
| | |
| | | shortEntryTraderIdParam(shortGridElement, null, false); |
| | | // [Gate-需求2] 加仓后先撤空仓所有止盈+止损,再查交易所持仓后重挂 |
| | | cancelAllShortTakeProfitsAndStopLosses(); |
| | | int posSize = queryPositionSize(Position.ModeEnum.DUAL_SHORT); |
| | | // REST 查询可能因交易所延迟返回旧值,与 WS 本地缓存取最大值兜底 |
| | | int posSize = Math.max(queryPositionSize(Position.ModeEnum.DUAL_SHORT), shortPositionSize.intValue()); |
| | | extendShortStopLoss(posSize, shortGridElement.getId()); |
| | | accumulatedShortLossCount = 0; // 加仓订单成交,重置止损累计 |
| | | log.info("[Gate] 空单成交 gridId:{}, 当前持仓:{}张", filledQty, posSize); |
| | | |
| | | // 空仓持仓超过baseQuantity时,从gridId-2开始向外追挂止盈 |
| | | // 空仓持仓超过baseQuantity时,先找多仓第一个止损位置,从该位置向下挂止盈(间隔=1) |
| | | BigDecimal shortBaseQty = new BigDecimal(config.getBaseQuantity()); |
| | | BigDecimal shortGridQty = new BigDecimal(config.getQuantity()); |
| | | if (BigDecimal.valueOf(posSize).compareTo(shortBaseQty) > 0) { |
| | | BigDecimal shortExcess = BigDecimal.valueOf(posSize).subtract(shortBaseQty); |
| | | int shortExcessCount = shortExcess.divide(shortGridQty, 0, RoundingMode.DOWN).intValue(); |
| | | |
| | | // 找多仓第一个(最近的)止损位置 |
| | | int firstLongSlId = 0; |
| | | for (GridElement e : config.getGridElements()) { |
| | | if (e.getLongStopLossOrderId() != null) { |
| | | if (firstLongSlId == 0 || e.getId() > firstLongSlId) { |
| | | firstLongSlId = e.getId(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | for (int i = 0; i < shortExcessCount; i++) { |
| | | int tpGridId = shortGridElement.getId() - 2 * (i + 1); |
| | | int tpGridId; |
| | | if (firstLongSlId != 0) { |
| | | tpGridId = firstLongSlId - i; // 从多仓第一个止损位置开始,向下挂,间隔=1 |
| | | } else { |
| | | tpGridId = shortGridElement.getId() - 2 * (i + 1); // 无多仓止损时回退原逻辑 |
| | | } |
| | | GridElement tpElem = GridElement.findById(tpGridId); |
| | | if (tpElem == null || tpElem.getShortTakeProfitOrderId() != null) { |
| | | continue; |
| | |
| | | longEntryTraderIdParam(longGridElement, null, false); |
| | | // [Gate-需求2] 加仓后先撤多仓所有止盈+止损,再查交易所持仓后重挂 |
| | | cancelAllLongTakeProfitsAndStopLosses(); |
| | | int posSize = queryPositionSize(Position.ModeEnum.DUAL_LONG); |
| | | // REST 查询可能因交易所延迟返回旧值,与 WS 本地缓存取最大值兜底 |
| | | int posSize = Math.max(queryPositionSize(Position.ModeEnum.DUAL_LONG), longPositionSize.intValue()); |
| | | extendLongStopLoss(posSize, longGridElement.getId()); |
| | | accumulatedLongLossCount = 0; // 加仓订单成交,重置止损累计 |
| | | log.info("[Gate] 多单成交 gridId:{}, 当前持仓:{}张", filledQty, posSize); |
| | | |
| | | // 多仓持仓超过baseQuantity时,从gridId+2开始向外追挂止盈 |
| | | // 多仓持仓超过baseQuantity时,先找空仓第一个止损位置,从该位置向上挂止盈(间隔=1) |
| | | BigDecimal longBaseQty = new BigDecimal(config.getBaseQuantity()); |
| | | BigDecimal longGridQty = new BigDecimal(config.getQuantity()); |
| | | if (BigDecimal.valueOf(posSize).compareTo(longBaseQty) > 0) { |
| | | BigDecimal longExcess = BigDecimal.valueOf(posSize).subtract(longBaseQty); |
| | | int longExcessCount = longExcess.divide(longGridQty, 0, RoundingMode.DOWN).intValue(); |
| | | |
| | | // 找空仓第一个(最近的)止损位置 |
| | | int firstShortSlId = 0; |
| | | for (GridElement e : config.getGridElements()) { |
| | | if (e.getShortStopLossOrderId() != null) { |
| | | if (firstShortSlId == 0 || e.getId() < firstShortSlId) { |
| | | firstShortSlId = e.getId(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | for (int i = 0; i < longExcessCount; i++) { |
| | | int tpGridId = longGridElement.getId() + 2 * (i + 1); |
| | | int tpGridId; |
| | | if (firstShortSlId != 0) { |
| | | tpGridId = firstShortSlId + i; // 从空仓第一个止损位置开始,向上挂,间隔=1 |
| | | } else { |
| | | tpGridId = longGridElement.getId() + 2 * (i + 1); // 无空仓止损时回退原逻辑 |
| | | } |
| | | GridElement tpElem = GridElement.findById(tpGridId); |
| | | if (tpElem == null || tpElem.getLongTakeProfitOrderId() != null) { |
| | | continue; |