| | |
| | | return result;
|
| | | }
|
| | |
|
| | | /**
|
| | | * 开仓价 +/- (权益 - 其他币种成本 - 当前币种维持保证金)/(规格*张数)
|
| | | *
|
| | | * @param memberEntity
|
| | | * @param contractHoldOrderEntity
|
| | | * @return
|
| | | */
|
| | | public static BigDecimal calForcePriceForWhole(MemberEntity memberEntity, ContractHoldOrderEntity contractHoldOrderEntity) {
|
| | | ContractHoldOrderDao holdOrderDao = SpringContextHolder.getBean(ContractHoldOrderDao.class);
|
| | | MemberWalletContractDao walletContractDao = SpringContextHolder.getBean(MemberWalletContractDao.class);
|
| | |
|
| | | Long memberId = memberEntity.getId();
|
| | | MemberWalletContractEntity walletContract = walletContractDao.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeEnum.USDT.name());
|
| | | List<ContractHoldOrderEntity> holdOrderEntities = holdOrderDao.selectHoldOrderListForWholeByMemberIdAndSymbol(memberId, null);
|
| | | BigDecimal forcePrice = BigDecimal.ZERO;
|
| | | if (CollUtil.isNotEmpty(holdOrderEntities)) {
|
| | | BigDecimal totalBondAmount = BigDecimal.ZERO;
|
| | | BigDecimal totalProfitOrLoss = BigDecimal.ZERO;
|
| | | for (ContractHoldOrderEntity holdOrderEntity : holdOrderEntities) {
|
| | | if (holdOrderEntity.getId().equals(contractHoldOrderEntity.getId())) {
|
| | | // totalBondAmount = totalBondAmount.add(holdOrderEntity.getHoldBond());
|
| | | } else {
|
| | | totalBondAmount = totalBondAmount.add(holdOrderEntity.getBondAmount());
|
| | | }
|
| | | totalProfitOrLoss = totalProfitOrLoss.add(calProfitOrLoss(holdOrderEntity, memberEntity));
|
| | | }
|
| | |
|
| | | BigDecimal divideChild = walletContract.getTotalBalance().subtract(totalBondAmount).add(totalProfitOrLoss);
|
| | | BigDecimal divideParent = contractHoldOrderEntity.getSymbolSku().multiply(new BigDecimal(contractHoldOrderEntity.getSymbolCntSale()));
|
| | |
|
| | | BigDecimal divide = divideChild.divide(divideParent, 8, BigDecimal.ROUND_DOWN);
|
| | |
|
| | | if (ContractHoldOrderEntity.OPENING_TYPE_MORE == contractHoldOrderEntity.getOpeningType()) {
|
| | | forcePrice = contractHoldOrderEntity.getOpeningPrice().subtract(divide);
|
| | | } else {
|
| | | forcePrice = contractHoldOrderEntity.getOpeningPrice().add(divide);
|
| | | }
|
| | | }
|
| | | return forcePrice;
|
| | | }
|
| | |
|
| | | /**
|
| | | * 权益-维持保证金+开仓价*张数*规格-开仓价*费率-(总账户-维持保证金) / 规格*张数
|
| | | *
|
| | | * @param memberEntity
|
| | | * @param contractHoldOrderEntity
|
| | | * @return
|
| | | */
|
| | | public static BigDecimal calWholePriceTwo(MemberEntity memberEntity, ContractHoldOrderEntity contractHoldOrderEntity, int type) {
|
| | | ContractHoldOrderDao holdOrderDao = SpringContextHolder.getBean(ContractHoldOrderDao.class);
|
| | | MemberWalletContractDao walletContractDao = SpringContextHolder.getBean(MemberWalletContractDao.class);
|
| | | CacheSettingUtils cacheSettingUtils = SpringContextHolder.getBean(CacheSettingUtils.class);
|
| | | RedisUtils redisUtils = SpringContextHolder.getBean(RedisUtils.class);
|
| | |
|
| | | Long memberId = memberEntity.getId();
|
| | | MemberWalletContractEntity walletContract = walletContractDao.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeEnum.USDT.name());
|
| | | List<ContractHoldOrderEntity> holdOrderEntities = holdOrderDao.selectHoldOrderListForWholeByMemberIdAndSymbol(memberId, null);
|
| | | BigDecimal forcePrice = BigDecimal.ZERO;
|
| | | if (CollUtil.isNotEmpty(holdOrderEntities)) {
|
| | | BigDecimal totalBondAmount = BigDecimal.ZERO;
|
| | | BigDecimal totalProfitOrLoss = BigDecimal.ZERO;
|
| | | for (ContractHoldOrderEntity holdOrderEntity : holdOrderEntities) {
|
| | | if (holdOrderEntity.getId().equals(contractHoldOrderEntity.getId())) {
|
| | | // totalBondAmount = totalBondAmount.add(holdOrderEntity.getHoldBond());
|
| | | } else {
|
| | | totalBondAmount = totalBondAmount.add(holdOrderEntity.getBondAmount());
|
| | | }
|
| | |
|
| | |
|
| | | BigDecimal newPrice = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey(contractHoldOrderEntity.getSymbol())));
|
| | | if (type == 2) {
|
| | | log.info("newPrice : {}", newPrice);
|
| | | }
|
| | | // 盈亏
|
| | | BigDecimal rewardRatio = BigDecimal.ZERO;
|
| | | // 开多
|
| | | if (ContractHoldOrderEntity.OPENING_TYPE_MORE == holdOrderEntity.getOpeningType()) {
|
| | | // (最新价-开仓价)*规格*张数
|
| | | rewardRatio = newPrice.subtract(holdOrderEntity.getOpeningPrice()).multiply(contractHoldOrderEntity.getSymbolSku()).multiply(new BigDecimal(holdOrderEntity.getSymbolCntSale()));
|
| | | // 开空
|
| | | } else {
|
| | | // (开仓价-最新价)*规格*张数
|
| | | rewardRatio = holdOrderEntity.getOpeningPrice().subtract(newPrice).multiply(contractHoldOrderEntity.getSymbolSku()).multiply(new BigDecimal(holdOrderEntity.getSymbolCntSale()));
|
| | | }
|
| | |
|
| | | if (memberEntity.getIsProfit() == MemberEntity.IS_PROFIT_Y) {
|
| | | PlatformTradeSettingEntity tradeSettingEntity = cacheSettingUtils.getTradeSetting();
|
| | | if (rewardRatio.compareTo(BigDecimal.ZERO) > -1) {
|
| | | rewardRatio = rewardRatio.multiply(BigDecimal.ONE.subtract(tradeSettingEntity.getProfitParam()));
|
| | | }
|
| | | }
|
| | |
|
| | | totalProfitOrLoss = totalProfitOrLoss.add(rewardRatio);
|
| | | }
|
| | |
|
| | | // 维持保证金
|
| | | BigDecimal holdBond = contractHoldOrderEntity.getHoldBond();
|
| | | // 成本 数量*面值*开仓价
|
| | | BigDecimal cost = contractHoldOrderEntity.getSymbolSku().multiply(contractHoldOrderEntity.getOpeningPrice()).multiply(new BigDecimal(contractHoldOrderEntity.getSymbolCntSale()));
|
| | | // 费率
|
| | | BigDecimal ratio = contractHoldOrderEntity.getOpeningPrice().multiply(new BigDecimal("0.005"));
|
| | | // 总账户 - 维持保证金
|
| | | BigDecimal orderProfitOrLoss = walletContract.getTotalBalance().subtract(holdBond);
|
| | | // 权益 - 维持保证金
|
| | | BigDecimal qy = walletContract.getTotalBalance().add(totalProfitOrLoss).subtract(holdBond);
|
| | | // BigDecimal qy = BigDecimal.ZERO;
|
| | |
|
| | | BigDecimal prefix = cost.subtract(totalBondAmount);
|
| | | BigDecimal divideChild;
|
| | | if (ContractHoldOrderEntity.OPENING_TYPE_MORE == contractHoldOrderEntity.getOpeningType()) {
|
| | | divideChild = prefix.subtract(orderProfitOrLoss).subtract(qy);
|
| | | } else {
|
| | | divideChild = prefix.add(orderProfitOrLoss).add(qy);
|
| | | }
|
| | | // BigDecimal divideChild = walletContract.getTotalBalance().add(totalProfitOrLoss).subtract(holdBond).subtract(cost).add(newPrice.multiply(new BigDecimal("0.005")));
|
| | | BigDecimal divideParent = contractHoldOrderEntity.getSymbolSku().multiply(new BigDecimal(contractHoldOrderEntity.getSymbolCntSale()));
|
| | |
|
| | | forcePrice = divideChild.divide(divideParent, 8, BigDecimal.ROUND_DOWN);
|
| | | if (type == 2) {
|
| | | log.info("=======全仓爆仓=======");
|
| | | log.info("holdBond : {}", holdBond);
|
| | | log.info("cost : {}", cost);
|
| | | log.info("ratio : {}", ratio);
|
| | | log.info("orderProfitOrLoss : {}", orderProfitOrLoss);
|
| | | log.info("total : {}", walletContract.getTotalBalance());
|
| | | log.info("totalProfitOrLoss : {}", totalProfitOrLoss);
|
| | | log.info("qy : {}", qy);
|
| | | }
|
| | | }
|
| | | return forcePrice;
|
| | | }
|
| | |
|
| | | public static BigDecimal calProfitOrLoss(ContractHoldOrderEntity holdOrderEntity, MemberEntity memberEntity) {
|
| | | CacheSettingUtils cacheSettingUtils = SpringContextHolder.getBean(CacheSettingUtils.class);
|
| | | RedisUtils redisUtils = SpringContextHolder.getBean(RedisUtils.class);
|
| | |
| | | redisUtils.set(AppContants.HOLD_BOND_RATIO, tradeSetting.getHoldBondRatio());
|
| | | }
|
| | |
|
| | | return contractHoldOrder.getOpeningPrice().multiply(new BigDecimal(contractHoldOrder.getSymbolCntSale())).multiply(holdBondRatio).multiply(contractHoldOrder.getSymbolSku());
|
| | | return contractHoldOrder.getOpeningPrice().multiply(new BigDecimal(contractHoldOrder.getSymbolCntSale())).multiply(holdBondRatio.multiply(new BigDecimal(100))).multiply(contractHoldOrder.getSymbolSku()).divide(new BigDecimal(contractHoldOrder.getLeverRatio()), 8, BigDecimal.ROUND_DOWN);
|
| | | }
|
| | | }
|