| | |
| | | package com.xcong.excoin.modules.gateApi; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import com.xcong.excoin.utils.dingtalk.DingTalkUtils; |
| | | import io.gate.gateapi.ApiClient; |
| | | import io.gate.gateapi.ApiException; |
| | | import io.gate.gateapi.GateApiException; |
| | |
| | | tryGenerateQueues(); |
| | | }else { |
| | | longPositionSize = size; |
| | | //取消多仓位线以上的开空仓挂单 |
| | | List<GridElement> allShortOrders = GridElement.findAllShortOrders(longEntryPrice); |
| | | if (CollUtil.isNotEmpty(allShortOrders)){ |
| | | for (GridElement e : allShortOrders) { |
| | | executor.cancelConditionalOrder( |
| | | e.getShortOrderId(), |
| | | orderId -> { |
| | | shortEntryTraderIdParam( |
| | | e, |
| | | null, |
| | | false |
| | | ); |
| | | } |
| | | ); |
| | | |
| | | if (e.getShortTakeProfitOrderId() != null){ |
| | | executor.cancelConditionalOrder( |
| | | e.getShortTakeProfitOrderId(), |
| | | orderId -> { |
| | | shortTakeProfitTraderIdParam( |
| | | e, |
| | | null, |
| | | false |
| | | ); |
| | | } |
| | | ); |
| | | } |
| | | } |
| | | } |
| | | checkShortEntryOrderToCancel(); |
| | | checkLongEntryOrderToCancel(); |
| | | } |
| | | } else { |
| | | longActive = false; |
| | |
| | | tryGenerateQueues(); |
| | | }else { |
| | | shortPositionSize = size.abs(); |
| | | //取消空仓仓位线以下的开多仓挂单 |
| | | List<GridElement> allLongOrders = GridElement.findAllLongOrders(shortEntryPrice); |
| | | if (CollUtil.isNotEmpty(allLongOrders)){ |
| | | for (GridElement e : allLongOrders) { |
| | | executor.cancelConditionalOrder( |
| | | e.getLongOrderId(), |
| | | orderId -> { |
| | | longEntryTraderIdParam( |
| | | e, |
| | | null, |
| | | false |
| | | ); |
| | | } |
| | | ); |
| | | if (e.getLongTakeProfitOrderId() != null){ |
| | | executor.cancelConditionalOrder( |
| | | e.getLongTakeProfitOrderId(), |
| | | orderId -> { |
| | | longTakeProfitTraderIdParam( |
| | | e, |
| | | null, |
| | | false |
| | | ); |
| | | } |
| | | ); |
| | | } |
| | | } |
| | | } |
| | | checkShortEntryOrderToCancel(); |
| | | checkLongEntryOrderToCancel(); |
| | | } |
| | | } else { |
| | | shortActive = false; |
| | | shortPositionSize = BigDecimal.ZERO; |
| | | } |
| | | } |
| | | } |
| | | |
| | | private void checkShortEntryOrderToCancel() { |
| | | List<GridElement> allLongOrders = GridElement.findAllShortOrders(shortEntryPrice); |
| | | if (CollUtil.isNotEmpty(allLongOrders)){ |
| | | GridElement keep = allLongOrders.stream() |
| | | .min((a, b) -> a.getGridPrice().compareTo(b.getGridPrice())) |
| | | .orElse(null); |
| | | for (GridElement e : allLongOrders) { |
| | | if (e == keep) { |
| | | continue; |
| | | } |
| | | executor.cancelConditionalOrder( |
| | | e.getShortOrderId(), |
| | | orderId -> { |
| | | shortEntryTraderIdParam( |
| | | e, |
| | | null, |
| | | false |
| | | ); |
| | | } |
| | | ); |
| | | if (e.getShortTakeProfitOrderId() != null){ |
| | | executor.cancelConditionalOrder( |
| | | e.getShortTakeProfitOrderId(), |
| | | orderId -> { |
| | | shortTakeProfitTraderIdParam( |
| | | e, |
| | | null, |
| | | false |
| | | ); |
| | | } |
| | | ); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | private void checkLongEntryOrderToCancel() { |
| | | List<GridElement> allShortOrders = GridElement.findAllLongOrders(longEntryPrice); |
| | | if (CollUtil.isNotEmpty(allShortOrders)){ |
| | | GridElement keep = allShortOrders.stream() |
| | | .max((a, b) -> a.getGridPrice().compareTo(b.getGridPrice())) |
| | | .orElse(null); |
| | | for (GridElement e : allShortOrders) { |
| | | if (e == keep) { |
| | | continue; |
| | | } |
| | | executor.cancelConditionalOrder( |
| | | e.getLongOrderId(), |
| | | orderId -> { |
| | | longEntryTraderIdParam( |
| | | e, |
| | | null, |
| | | false |
| | | ); |
| | | } |
| | | ); |
| | | |
| | | if (e.getLongTakeProfitOrderId() != null){ |
| | | executor.cancelConditionalOrder( |
| | | e.getLongTakeProfitOrderId(), |
| | | orderId -> { |
| | | longTakeProfitTraderIdParam( |
| | | e, |
| | | null, |
| | | false |
| | | ); |
| | | } |
| | | ); |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | totalPnl, cumulativePnl, unrealizedPnl); |
| | | state = StrategyState.STOPPED; |
| | | } else if (totalPnl.compareTo(config.getMaxLoss().negate()) <= 0) { |
| | | log.info("[Gate] 已达亏损上限(合计{})→已停止, 已实现:{}, 未实现:{}", |
| | | String logMessage = StrUtil.format("[Gate] 已达亏损风险值(合计{}), 已实现:{}, 未实现:{}", |
| | | totalPnl, cumulativePnl, unrealizedPnl); |
| | | state = StrategyState.STOPPED; |
| | | log.info(logMessage); |
| | | |
| | | |
| | | DingTalkUtils.getDefault().sendActionCard("风险提醒", logMessage, config.getApiKey(), ""); |
| | | // state = StrategyState.STOPPED; |
| | | } |
| | | } |
| | | |
| | |
| | | null, |
| | | false |
| | | ); |
| | | // TPonUserTradeShortEntry(byShortTakeProfitOrderId); |
| | | TPonUserTradeShortEntry(byShortTakeProfitOrderId); |
| | | } |
| | | GridElement byLongTakeProfitOrderId = GridElement.findByLongTakeProfitOrderId(orderId); |
| | | if (byLongTakeProfitOrderId != null){ |
| | |
| | | null, |
| | | false |
| | | ); |
| | | // TPonUserTradeLongEntry(byLongTakeProfitOrderId); |
| | | TPonUserTradeLongEntry(byLongTakeProfitOrderId); |
| | | } |
| | | |
| | | /** |
| | |
| | | if (!isMarginSafe()) { |
| | | log.warn("[Gate] 保证金超限,跳过挂条件单"); |
| | | } else { |
| | | |
| | | /** |
| | | * 下一个开仓位置 |
| | | * 获取队列第一个元素的价格对应的网格 |
| | | * 判断网格是否能开空仓,如果不能则跳过 |
| | | * 前进方向挂空仓条件单 |
| | | * 后置方向挂多空条件单 |
| | | */ |
| | | //下一个开仓位置 |
| | | BigDecimal gridPrice = gridElement.getGridPrice(); |
| | | |
| | | // 判断网格是否能开空仓,如果不能则跳过 |
| | | if (gridElement != null) { |
| | | TraderParam downShortTraderParam = gridElement.getShortTraderParam(); |
| | | // 判断网格是否能开多仓,如果不能则跳过 |
| | | GridElement upGridElement = GridElement.findById(gridElement.getUpId()); |
| | | if (upGridElement != null){ |
| | | BigDecimal upGridPrice = upGridElement.getGridPrice(); |
| | | TraderParam downLongTraderParam = upGridElement.getLongTraderParam(); |
| | | if ( |
| | | !gridElement.isHasShortOrder() && |
| | | gridPrice.compareTo(longEntryPrice) <= 0 && |
| | | gridPrice.compareTo(shortEntryPrice) >= 0 |
| | | !upGridElement.isHasLongOrder() && |
| | | upGridPrice.compareTo(longEntryPrice) <= 0 |
| | | ){ |
| | | placeEntryOrderWithPreFlag(gridElement, false, |
| | | downShortTraderParam.getEntryPrice(), |
| | | FuturesPriceTrigger.RuleEnum.NUMBER_1, |
| | | negate(downShortTraderParam.getQuantity())); |
| | | |
| | | } |
| | | |
| | | TraderParam downLongTraderParam = gridElement.getLongTraderParam(); |
| | | if ( |
| | | !gridElement.isHasLongOrder() && |
| | | gridPrice.compareTo(longEntryPrice) <= 0 |
| | | ){ |
| | | placeEntryOrderWithPreFlag(gridElement, true, |
| | | placeEntryOrderWithPreFlag(upGridElement, true, |
| | | downLongTraderParam.getEntryPrice(), |
| | | FuturesPriceTrigger.RuleEnum.NUMBER_1, |
| | | downLongTraderParam.getQuantity()); |
| | | } |
| | | |
| | | } |
| | | } |
| | | } |
| | |
| | | if (!isMarginSafe()) { |
| | | log.warn("[Gate] 保证金超限,跳过挂条件单"); |
| | | } else { |
| | | BigDecimal newLongFirst = gridElement.getGridPrice() ; |
| | | // 判断网格是否能开空仓,如果不能则跳过 |
| | | GridElement downGridElement = GridElement.findById(gridElement.getDownId()); |
| | | if (downGridElement != null){ |
| | | |
| | | // 判断网格是否能开多空仓,如果不能则跳过 |
| | | if (gridElement != null) { |
| | | BigDecimal downGridPrice = downGridElement.getGridPrice(); |
| | | |
| | | // TraderParam downLongTraderParam = gridElement.getLongTraderParam(); |
| | | // if ( |
| | | // !gridElement.isHasLongOrder() && |
| | | // newLongFirst.compareTo(shortEntryPrice) >= 0 && |
| | | // newLongFirst.compareTo(longEntryPrice) <= 0 |
| | | // ){ |
| | | // placeEntryOrderWithPreFlag(gridElement, true, |
| | | // downLongTraderParam.getEntryPrice(), |
| | | // FuturesPriceTrigger.RuleEnum.NUMBER_2, |
| | | // config.getQuantity()); |
| | | // |
| | | // } |
| | | |
| | | TraderParam shortTraderParam = gridElement.getShortTraderParam(); |
| | | TraderParam shortTraderParam = downGridElement.getShortTraderParam(); |
| | | if ( |
| | | !gridElement.isHasShortOrder() && |
| | | newLongFirst.compareTo(shortEntryPrice) >= 0 |
| | | !downGridElement.isHasShortOrder() && |
| | | downGridPrice.compareTo(shortEntryPrice) >= 0 |
| | | ){ |
| | | |
| | | placeEntryOrderWithPreFlag(gridElement, false, |
| | | placeEntryOrderWithPreFlag(downGridElement, false, |
| | | shortTraderParam.getEntryPrice(), |
| | | FuturesPriceTrigger.RuleEnum.NUMBER_2, |
| | | negate(config.getQuantity())); |