From c4aabe264e8f2a6002116a20b3f0b27db99c0afd Mon Sep 17 00:00:00 2001 From: Helius <wangdoubleone@gmail.com> Date: Tue, 02 Feb 2021 18:46:40 +0800 Subject: [PATCH] modify --- src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java | 72 +++++++++++++++++++++++++++++++++--- 1 files changed, 66 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java b/src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java index 42b23da..4663014 100644 --- a/src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java +++ b/src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java @@ -492,7 +492,7 @@ continue; } - holdOrderEntity.setForceClosingPrice(getForceSetPrice(wholePriceData, holdOrderEntity)); + holdOrderEntity.setForceClosingPrice(getForceSetPrice(wholePriceData, holdOrderEntity, holdOrderDataModel.getSymbol())); contractHoldOrderDao.deleteById(holdOrderDataModel.getId()); ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(holdOrderEntity); @@ -611,11 +611,71 @@ * @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; } } -- Gitblit v1.9.1