| | |
| | | * @param entryGridId 入场网格 ID |
| | | */ |
| | | private void placeBaseTakeProfit(int posSize, boolean isLong, int entryGridId) { |
| | | int perGrid = config.getBaseTakeProfitPerGrid(); |
| | | BigDecimal perGrid = config.getBaseTakeProfitPerGrid(); |
| | | int gridCount = config.getBaseTakeProfitGridCount(); |
| | | if (perGrid <= 0 || gridCount <= 0) { |
| | | if (perGrid == null || perGrid.compareTo(BigDecimal.ZERO) <= 0 || gridCount <= 0) { |
| | | return; |
| | | } |
| | | int baseQty = Integer.parseInt(config.getBaseQuantity()); |
| | |
| | | // 分配范围到止损位的前一格截止(与分散止盈一致) |
| | | int endId = endElem.getId() - dir; |
| | | |
| | | int remaining = maxQty; |
| | | BigDecimal remaining = BigDecimal.valueOf(maxQty); |
| | | int placed = 0; |
| | | int id = startId; |
| | | while (placed < gridCount && remaining > 0) { |
| | | while (placed < gridCount && remaining.compareTo(BigDecimal.ZERO) > 0) { |
| | | if (isLong ? id > endId : id < endId) { |
| | | break; |
| | | } |
| | |
| | | if (elem == null) { |
| | | break; |
| | | } |
| | | int qty = Math.min(perGrid, remaining); |
| | | BigDecimal qty = perGrid.min(remaining); |
| | | final GridElement fe = elem; |
| | | final int gid = id; |
| | | final BigDecimal triggerPrice = elem.getGridPrice(); |
| | | final String size = isLong ? negate(String.valueOf(qty)) : String.valueOf(qty); |
| | | final String size = isLong ? negate(qty.toPlainString()) : qty.toPlainString(); |
| | | final String orderType = isLong ? ORDER_TYPE_CLOSE_LONG : ORDER_TYPE_CLOSE_SHORT; |
| | | final FuturesPriceTrigger.RuleEnum rule = isLong ? FuturesPriceTrigger.RuleEnum.NUMBER_1 |
| | | : FuturesPriceTrigger.RuleEnum.NUMBER_2; |
| | |
| | | isLong ? "多仓" : "空仓", gid, triggerPrice, size, profitId); |
| | | } |
| | | ); |
| | | remaining -= qty; |
| | | remaining = remaining.subtract(qty); |
| | | placed++; |
| | | id += dir; |
| | | } |