| | |
| | | checkProfitAndReset(); |
| | | |
| | | |
| | | if (longActive == false && |
| | | longPositionSize.compareTo(BigDecimal.ZERO) == 0){ |
| | | if (state == StrategyState.ACTIVE && |
| | | longActive == false && |
| | | longPositionSize.compareTo(BigDecimal.ZERO) == 0){ |
| | | processShortGrid(closePrice); |
| | | } |
| | | |
| | | |
| | | if (shortActive == false && |
| | | if (state == StrategyState.ACTIVE && |
| | | shortActive == false && |
| | | shortPositionSize.compareTo(BigDecimal.ZERO) == 0){ |
| | | processLongGrid(closePrice); |
| | | } |
| | |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | if (BigDecimal.ZERO.compareTo( matched) == 0) { |
| | | return; |
| | | } |
| | | log.info("[Gate] 空仓队列触发, 匹配:{},当前价:{}", matched, currentPrice); |
| | | if (BigDecimal.ZERO.compareTo( matched) == 0) { |
| | | return; |
| | | } |
| | | log.info("[Gate] 多仓仓位归零 空仓队列触发, 匹配:{},当前价:{}", matched, currentPrice); |
| | | |
| | | GridElement matchedUpGridElement = GridElement.findByPrice(matched); |
| | | GridElement matchedUpGridElement = GridElement.findByPrice(matched); |
| | | if (matchedUpGridElement != null){ |
| | | Integer upId = matchedUpGridElement.getUpId(); |
| | | GridElement newEntryGrid = GridElement.findById(upId); |
| | | |
| | | Integer upId = matchedUpGridElement.getUpId(); |
| | | GridElement newEntryGrid = GridElement.findById(upId); |
| | | |
| | | if (newEntryGrid != null) { |
| | | GridElement cancelGridElement = GridElement.findById(newEntryGrid.getUpId()); |
| | | |
| | | if (cancelGridElement != null) { |
| | | BigDecimal triggerPrice = newEntryGrid.getGridPrice(); |
| | | String size = cancelGridElement.getLongTraderParam().getQuantity(); |
| | | log.info("[Gate] 多仓仓位归零 gridId:{}, 挂{}基础张多单", |
| | | newEntryGrid.getId(), size); |
| | | newEntryGrid.getLongTraderParam().setQuantity(size); |
| | | placeEntryOrderWithPreFlag(newEntryGrid, true, triggerPrice, |
| | | FuturesPriceTrigger.RuleEnum.NUMBER_1, size); |
| | | if (newEntryGrid != null) { |
| | | /** |
| | | * 看是否有多仓挂单,有就取消 |
| | | */ |
| | | if (!newEntryGrid.isHasLongOrder()) { |
| | | BigDecimal triggerPrice = newEntryGrid.getGridPrice(); |
| | | String size = config.getBaseQuantity(); |
| | | log.info("[Gate] 多仓仓位归零 gridId:{}, 挂{}基础张多单", |
| | | newEntryGrid.getId(), size); |
| | | newEntryGrid.getLongTraderParam().setQuantity(size); |
| | | placeEntryOrderWithPreFlag(newEntryGrid, true, triggerPrice, |
| | | FuturesPriceTrigger.RuleEnum.NUMBER_1, size); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 看是否有多仓挂单,有就取消 |
| | | */ |
| | | if (cancelGridElement != null && cancelGridElement.isHasLongOrder()) { |
| | | executor.cancelConditionalOrder(cancelGridElement.getLongOrderId(), oid -> { |
| | | longEntryTraderIdParam(cancelGridElement, null, false); |
| | | log.info("[Gate] 多仓仓位归零, 取消gridId:{}的多单", cancelGridElement); |
| | | }); |
| | | GridElement cancelGridElement = GridElement.findById(newEntryGrid.getUpId()); |
| | | if (cancelGridElement != null && cancelGridElement.isHasLongOrder()) { |
| | | /** |
| | | * 看是否有多仓挂单,有就取消 |
| | | */ |
| | | executor.cancelConditionalOrder(cancelGridElement.getLongOrderId(), oid -> { |
| | | longEntryTraderIdParam(cancelGridElement, null, false); |
| | | log.info("[Gate] 多仓仓位归零, 取消gridId:{}的多单", cancelGridElement); |
| | | }); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | private void processLongGrid(BigDecimal currentPrice) { |
| | |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | if (BigDecimal.ZERO.compareTo( matched) == 0) { |
| | | return; |
| | | } |
| | | |
| | | log.info("[Gate] 多仓队列触发, 匹配:{},当前价:{}", matched, currentPrice); |
| | | |
| | | GridElement matchedUpGridElement = GridElement.findByPrice(matched); |
| | | |
| | | Integer downId = matchedUpGridElement.getDownId(); |
| | | GridElement newEntryGrid = GridElement.findById(downId); |
| | | |
| | | if (newEntryGrid != null) { |
| | | GridElement cancelGridElement = GridElement.findById(newEntryGrid.getDownId()); |
| | | |
| | | if (cancelGridElement != null) { |
| | | BigDecimal triggerPrice = newEntryGrid.getGridPrice(); |
| | | String size = cancelGridElement.getShortTraderParam().getQuantity(); |
| | | log.info("[Gate] 空仓仓位归零 gridId:{}, 挂{}基础张多单", |
| | | newEntryGrid.getId(), size); |
| | | newEntryGrid.getShortTraderParam().setQuantity(size); |
| | | placeEntryOrderWithPreFlag(newEntryGrid, false, triggerPrice, |
| | | FuturesPriceTrigger.RuleEnum.NUMBER_2, negate(size)); |
| | | |
| | | /** |
| | | * 看是否有空仓挂单,有就取消 |
| | | */ |
| | | if (cancelGridElement != null && cancelGridElement.isHasShortOrder()) { |
| | | executor.cancelConditionalOrder(cancelGridElement.getShortOrderId(), oid -> { |
| | | shortEntryTraderIdParam(cancelGridElement, null, false); |
| | | log.info("[Gate] 空仓仓位归零, 取消gridId:{}的多单", cancelGridElement); |
| | | }); |
| | | } |
| | | if (BigDecimal.ZERO.compareTo( matched) == 0) { |
| | | return; |
| | | } |
| | | |
| | | log.info("[Gate] 空仓仓位归零 多仓队列触发, 匹配:{},当前价:{}", matched, currentPrice); |
| | | |
| | | GridElement matchedUpGridElement = GridElement.findByPrice(matched); |
| | | if (matchedUpGridElement != null){ |
| | | Integer downId = matchedUpGridElement.getDownId(); |
| | | GridElement newEntryGrid = GridElement.findById(downId); |
| | | |
| | | if (newEntryGrid != null) { |
| | | |
| | | if (!newEntryGrid.isHasShortOrder()){ |
| | | BigDecimal triggerPrice = newEntryGrid.getGridPrice(); |
| | | String size = config.getBaseQuantity(); |
| | | log.info("[Gate] 空仓仓位归零 gridId:{}, 挂{}基础张多单", |
| | | newEntryGrid.getId(), size); |
| | | newEntryGrid.getShortTraderParam().setQuantity(size); |
| | | placeEntryOrderWithPreFlag(newEntryGrid, false, triggerPrice, |
| | | FuturesPriceTrigger.RuleEnum.NUMBER_2, negate(size)); |
| | | } |
| | | |
| | | GridElement cancelGridElement = GridElement.findById(newEntryGrid.getDownId()); |
| | | /** |
| | | * 看是否有空仓挂单,有就取消 |
| | | */ |
| | | if (cancelGridElement != null && cancelGridElement.isHasShortOrder()) { |
| | | executor.cancelConditionalOrder(cancelGridElement.getShortOrderId(), oid -> { |
| | | shortEntryTraderIdParam(cancelGridElement, null, false); |
| | | log.info("[Gate] 空仓仓位归零, 取消gridId:{}的多单", cancelGridElement); |
| | | }); |
| | | } |
| | | |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | BigDecimal triggerPrice = newEntryGrid.getGridPrice(); |
| | | longEntryQty++; |
| | | int entryQty = longEntryQty; |
| | | |
| | | // 最大持仓限制:已持仓+本次挂单 ≤ maxPositionSize |
| | | int maxPos = config.getMaxPositionSize(); |
| | | if (maxPos > 0) { |
| | | int currentPos = longPositionSize.intValue(); |
| | | int maxAllowed = maxPos - currentPos; |
| | | if (maxAllowed <= 0) { |
| | | log.warn("[Gate] 多仓止损触发 gridId:{}, 已达最大持仓{},跳过挂单", gridId, maxPos); |
| | | longEntryQty = 1; |
| | | return; |
| | | } |
| | | if (entryQty > maxAllowed) { |
| | | log.info("[Gate] 多仓止损触发 gridId:{}, 挂单{}张超限, 截断为{}张", gridId, entryQty, maxAllowed); |
| | | entryQty = maxAllowed; |
| | | longEntryQty = 1; |
| | | } |
| | | } |
| | | |
| | | String size = new BigDecimal(String.valueOf(entryQty)).multiply(new BigDecimal(config.getQuantity())).toString(); |
| | | log.info("[Gate] 多仓止损触发 gridId:{}, 在gridId:{}挂{}基础张多单(计数器:{}, size:{})", |
| | | gridId, newEntryGridId, entryQty, longEntryQty, size); |
| | |
| | | BigDecimal triggerPrice = newEntryGrid.getGridPrice(); |
| | | shortEntryQty++; |
| | | int entryQty = shortEntryQty; |
| | | |
| | | // 最大持仓限制:已持仓+本次挂单 ≤ maxPositionSize |
| | | int maxPos = config.getMaxPositionSize(); |
| | | if (maxPos > 0) { |
| | | int currentPos = shortPositionSize.intValue(); |
| | | int maxAllowed = maxPos - currentPos; |
| | | if (maxAllowed <= 0) { |
| | | log.warn("[Gate] 空仓止损触发 gridId:{}, 已达最大持仓{},跳过挂单", gridId, maxPos); |
| | | shortEntryQty = 1; |
| | | return; |
| | | } |
| | | if (entryQty > maxAllowed) { |
| | | log.info("[Gate] 空仓止损触发 gridId:{}, 挂单{}张超限, 截断为{}张", gridId, entryQty, maxAllowed); |
| | | entryQty = maxAllowed; |
| | | shortEntryQty = 1; |
| | | } |
| | | } |
| | | |
| | | String size = new BigDecimal(String.valueOf(entryQty)).multiply(new BigDecimal(config.getQuantity())).toString(); |
| | | log.info("[Gate] 空仓止损触发 gridId:{}, 在gridId:{}挂{}基础张空单(计数器:{}, size:{})", |
| | | gridId, newEntryGridId, entryQty, shortEntryQty, size); |
| | |
| | | } |
| | | } |
| | | if (furthestSlId == 0) { |
| | | furthestSlId = -11; |
| | | furthestSlId = -(Integer.parseInt(config.getBaseQuantity()) + 1); |
| | | } |
| | | log.info("[Gate] 多仓追挂止损, 当前最远止损gridId:{}, 追加{}张", furthestSlId, filledQty); |
| | | for (int i = 0; i < filledQty; i++) { |
| | |
| | | } |
| | | } |
| | | if (furthestSlId == 0) { |
| | | furthestSlId = 11; |
| | | furthestSlId = Integer.parseInt(config.getBaseQuantity()) + 1; |
| | | } |
| | | log.info("[Gate] 空仓追挂止损, 当前最远止损gridId:{}, 追加{}张", furthestSlId, filledQty); |
| | | for (int i = 0; i < filledQty; i++) { |