| | |
| | | continue; |
| | | } |
| | | |
| | | holdOrderEntity.setForceClosingPrice(getForceSetPrice(wholePriceData, holdOrderEntity)); |
| | | holdOrderEntity.setForceClosingPrice(getForceSetPrice(wholePriceData, holdOrderEntity, holdOrderDataModel.getSymbol())); |
| | | contractHoldOrderDao.deleteById(holdOrderDataModel.getId()); |
| | | |
| | | ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(holdOrderEntity); |
| | |
| | | * @param holdOrder |
| | | * @return |
| | | */ |
| | | private BigDecimal getForceSetPrice(WholePriceDataModel dataModel, ContractHoldOrderEntity holdOrder) { |
| | | if (holdOrder.getOpeningType() == ContractOrderEntity.ORDER_TYPE_OPEN_MORE) { |
| | | return holdOrder.getOpeningPrice().subtract(holdOrder.getOpeningPrice().multiply(BigDecimal.ONE.divide(new BigDecimal(holdOrder.getLeverRatio()), 8, BigDecimal.ROUND_DOWN))); |
| | | } else { |
| | | return holdOrder.getOpeningPrice().add(holdOrder.getOpeningPrice().multiply(BigDecimal.ONE.divide(new BigDecimal(holdOrder.getLeverRatio()), 8, BigDecimal.ROUND_DOWN))); |
| | | private BigDecimal getForceSetPrice(WholePriceDataModel dataModel, ContractHoldOrderEntity holdOrder, String currentSymbol) { |
| | | Long memberId = holdOrder.getMemberId(); |
| | | List<ContractHoldOrderEntity> holdOrderEntities = contractHoldOrderDao.selectHoldOrderListForWholeByMemberIdAndSymbol(memberId, null); |
| | | List<String> symbols = contractHoldOrderDao.selectWholeHoldOrderSymbolsByMemberId(memberId); |
| | | |
| | | BigDecimal result = BigDecimal.ZERO; |
| | | if (CollUtil.isNotEmpty(holdOrderEntities)) { |
| | | |
| | | for (String symbol : symbols) { |
| | | // 其他币种成本 |
| | | BigDecimal totalBondAmount = BigDecimal.ZERO; |
| | | // 当前币种保证金 |
| | | BigDecimal symbolBondAmount = BigDecimal.ZERO; |
| | | |
| | | // 开仓均价 |
| | | BigDecimal openPrice = BigDecimal.ZERO; |
| | | // 杠杆 |
| | | int leverRatio = 0; |
| | | boolean isAloneLess = true; |
| | | for (ContractHoldOrderEntity holdOrderEntity : holdOrderEntities) { |
| | | BigDecimal bondAmount = holdOrderEntity.getBondAmount().subtract(holdOrderEntity.getOpeningFeeAmount()); |
| | | |
| | | if (symbol.equalsIgnoreCase(holdOrderEntity.getSymbol())) { |
| | | if (holdOrderEntity.getOpeningType() == ContractHoldOrderEntity.OPENING_TYPE_MORE) { |
| | | isAloneLess = false; |
| | | } |
| | | symbolBondAmount = symbolBondAmount.add(bondAmount.subtract(holdOrderEntity.getOpeningFeeAmount())); |
| | | |
| | | if (openPrice.compareTo(BigDecimal.ZERO) == 0) { |
| | | openPrice = holdOrderEntity.getOpeningPrice(); |
| | | } else { |
| | | openPrice = openPrice.add(holdOrderEntity.getOpeningPrice()).divide(BigDecimal.valueOf(2), 8, BigDecimal.ROUND_DOWN); |
| | | } |
| | | leverRatio = holdOrderEntity.getLeverRatio(); |
| | | } else { |
| | | totalBondAmount = totalBondAmount.add(holdOrderEntity.getBondAmount().subtract(holdOrderEntity.getOpeningFeeAmount())); |
| | | } |
| | | |
| | | } |
| | | |
| | | BigDecimal equity = dataModel.getEquity(); |
| | | BigDecimal sub = equity.subtract(totalBondAmount); |
| | | |
| | | if (sub.compareTo(symbolBondAmount) <= 0) { |
| | | BigDecimal multi = BigDecimal.valueOf(10); |
| | | BigDecimal divide = equity.divide(equity.add(multi), 8, BigDecimal.ROUND_DOWN); |
| | | sub = symbolBondAmount.multiply(divide); |
| | | } |
| | | |
| | | BigDecimal divide = sub.divide(symbolBondAmount, 8, BigDecimal.ROUND_DOWN); |
| | | BigDecimal divide2 = openPrice.divide(BigDecimal.valueOf(leverRatio), 8, BigDecimal.ROUND_DOWN); |
| | | |
| | | BigDecimal forcePrice = BigDecimal.ZERO; |
| | | if (isAloneLess) { |
| | | forcePrice = openPrice.add(divide.multiply(divide2)); |
| | | } else { |
| | | forcePrice = openPrice.subtract(divide.multiply(divide2)); |
| | | } |
| | | |
| | | if (symbol.equalsIgnoreCase(currentSymbol)) { |
| | | result = forcePrice; |
| | | } |
| | | } |
| | | } |
| | | |
| | | return result; |
| | | } |
| | | } |