| | |
| | | return; |
| | | } |
| | | |
| | | checkProfitAndReset(); |
| | | // 异步检查盈亏,避免 REST 调用阻塞 WS 心跳导致 Socket closed |
| | | executor.submitTask(this::checkProfitAndReset); |
| | | |
| | | if (state == StrategyState.ACTIVE && |
| | | longActive == false && |
| | |
| | | for (int i = 0; i < shortTpCount; i++) { |
| | | int tpGridId = shortGridElement.getId() - 2 * (i + 1); |
| | | GridElement tpElem = GridElement.findById(tpGridId); |
| | | if (tpElem == null || tpElem.getShortTakeProfitOrderId() != null) { |
| | | // 用 takeProfitPlaced 做同步标记,避免异步回调未执行时重复挂单 |
| | | if (tpElem == null || tpElem.getShortTraderParam().isTakeProfitPlaced()) { |
| | | continue; |
| | | } |
| | | tpElem.getShortTraderParam().setTakeProfitPlaced(true); |
| | | BigDecimal tpPrice = tpElem.getGridPrice(); |
| | | int finalTpGridId = tpGridId; |
| | | executor.placeTakeProfit( |
| | |
| | | for (int i = 0; i < longTpCount; i++) { |
| | | int tpGridId = longGridElement.getId() + 2 * (i + 1); |
| | | GridElement tpElem = GridElement.findById(tpGridId); |
| | | if (tpElem == null || tpElem.getLongTakeProfitOrderId() != null) { |
| | | // 用 takeProfitPlaced 做同步标记,避免异步回调未执行时重复挂单 |
| | | if (tpElem == null || tpElem.getLongTraderParam().isTakeProfitPlaced()) { |
| | | continue; |
| | | } |
| | | tpElem.getLongTraderParam().setTakeProfitPlaced(true); |
| | | BigDecimal tpPrice = tpElem.getGridPrice(); |
| | | int finalTpGridId = tpGridId; |
| | | executor.placeTakeProfit( |
| | |
| | | String quantity = String.valueOf((accumulatedLongLossCount + 1) * Integer.parseInt(config.getQuantity())); |
| | | // 向上遍历取消所有遗留多单(跳过基础入场网格0) |
| | | GridElement cancelCursor = GridElement.findById(newEntryGrid.getUpId()); |
| | | while (cancelCursor != null && cancelCursor.getId() < 0) { |
| | | while (cancelCursor != null) { |
| | | if (cancelCursor.isHasLongOrder()) { |
| | | for (String longOrderId : new ArrayList<>(cancelCursor.getLongOrderIds())) { |
| | | GridElement finalCancelCursor = cancelCursor; |
| | |
| | | String quantity = String.valueOf((accumulatedShortLossCount + 1) * Integer.parseInt(config.getQuantity())); |
| | | // 向下遍历取消所有遗留空单(跳过基础入场网格0) |
| | | GridElement cancelCursor = GridElement.findById(newEntryGrid.getDownId()); |
| | | while (cancelCursor != null && cancelCursor.getId() > 0) { |
| | | while (cancelCursor != null) { |
| | | if (cancelCursor.isHasShortOrder()) { |
| | | for (String shortOrderId : new ArrayList<>(cancelCursor.getShortOrderIds())) { |
| | | GridElement finalCancelCursor = cancelCursor; |
| | |
| | | for (GridElement e : config.getGridElements()) { |
| | | String tpId = e.getLongTakeProfitOrderId(); |
| | | if (tpId != null) { |
| | | e.getLongTraderParam().setTakeProfitPlaced(false); |
| | | e.setLongTakeProfitOrderId(null); |
| | | executor.cancelConditionalOrder(tpId, oid -> {}); |
| | | } |
| | |
| | | for (GridElement e : config.getGridElements()) { |
| | | String tpId = e.getShortTakeProfitOrderId(); |
| | | if (tpId != null) { |
| | | e.getShortTraderParam().setTakeProfitPlaced(false); |
| | | e.setShortTakeProfitOrderId(null); |
| | | executor.cancelConditionalOrder(tpId, oid -> {}); |
| | | } |