Helius
2020-08-26 2b6a63aae10fa22a2b98d8d2c037d8ec8baa340f
modify
1 files modified
68 ■■■■■ changed files
src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java 68 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java
@@ -146,6 +146,19 @@
        BigDecimal openFeePrice = CalculateUtil.getOpenFeePrice(openingPrice, lotNumber, submitOrderDto.getSymbolCnt(), tradeSettingEntity.getFeeRatio());
        log.info("开仓手续费:{}", openFeePrice);
        // 保证金 建仓价*规格*手数*(1/杠杆倍率)
        BigDecimal bondAmount = CalculateUtil.getBondAmount(openingPrice, lotNumber, submitOrderDto.getSymbolCnt(), submitOrderDto.getLeverRatio());
        log.info("保证金:{}", bondAmount);
        // 预付款为 --> 保证金+开仓手续费+平仓手续费 (开仓平仓手续费相同)
        BigDecimal prePaymentAmount = bondAmount.add(openFeePrice).add(openFeePrice);
        log.info("预付款:{}", prePaymentAmount);
        if (prePaymentAmount.compareTo(walletContract.getAvailableBalance()) > -1) {
            // 可用余额不足
            return Result.fail(MessageSourceUtils.getString("member_service_0085"));
        }
        ContractHoldOrderEntity wholeHoldOrder = contractHoldOrderDao.selectWholeHoldOrderByOrderType(memberEntity.getId(), submitOrderDto.getOrderType(), submitOrderDto.getSymbol());
        // 判断当前是否存在全仓订单,若存在则直接合并,若不存在则创建订单
        if (wholeHoldOrder != null) {
@@ -153,28 +166,25 @@
            // (当前开仓价*张数 + 原开仓价 * 原可平张数) / (张数 + 原可平张数)
            BigDecimal newOpenPrice = totalPrice.add(wholeHoldOrder.getOpeningPrice().multiply(BigDecimal.valueOf(wholeHoldOrder.getSymbolCnt()))).divide(BigDecimal.valueOf(submitOrderDto.getSymbolCnt() + wholeHoldOrder.getSymbolCntSale()), 8, BigDecimal.ROUND_DOWN);
            log.info("计算后开仓价:{}", newOpenPrice);
            BigDecimal bondAmount = CalculateUtil.getBondAmount(newOpenPrice, lotNumber, submitOrderDto.getSymbolCnt() + wholeHoldOrder.getSymbolCntSale(), submitOrderDto.getLeverRatio());
            log.info("新保证金:{}", bondAmount);
//            BigDecimal bondAmount = CalculateUtil.getBondAmount(newOpenPrice, lotNumber, submitOrderDto.getSymbolCnt() + wholeHoldOrder.getSymbolCntSale(), submitOrderDto.getLeverRatio());
//            log.info("新保证金:{}", bondAmount);
            BigDecimal fee = openFeePrice.add(wholeHoldOrder.getOpeningFeeAmount());
            log.info("手续费相加:{}", fee);
            BigDecimal prePaymentAmount = bondAmount.add(fee).add(fee);
            BigDecimal subBondAmount = bondAmount.subtract(wholeHoldOrder.getBondAmount()).subtract(wholeHoldOrder.getOpeningFeeAmount());
            log.info("保证金差值:{}", subBondAmount);
            if (subBondAmount.compareTo(walletContract.getAvailableBalance()) > -1) {
                // 可用余额不足
                return Result.fail(MessageSourceUtils.getString("member_service_0085"));
            }
//            BigDecimal prePaymentAmount = bondAmount.add(fee).add(fee);
//
//            BigDecimal subBondAmount = bondAmount.subtract(wholeHoldOrder.getBondAmount()).subtract(wholeHoldOrder.getOpeningFeeAmount());
//            log.info("保证金差值:{}", subBondAmount);
//
//            if (subBondAmount.compareTo(walletContract.getAvailableBalance()) > -1) {
//                // 可用余额不足
//                return Result.fail(MessageSourceUtils.getString("member_service_0085"));
//            }
//            BigDecimal forceClosingPrice = CalculateUtil.getForceSetPriceForWhole(submitOrderDto.getSymbol(), memberEntity);
//            log.info("新预估强平价:{}", forceClosingPrice);
            ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(wholeHoldOrder);
            contractOrderEntity.setBondAmount(subBondAmount.add(openFeePrice));
//            contractOrderEntity.setForceClosingPrice(forceClosingPrice);
            contractOrderEntity.setOpeningPrice(newOpenPrice);
            contractOrderEntity.setBondAmount(bondAmount.add(openFeePrice));
            contractOrderEntity.setOpeningPrice(openingPrice);
            contractOrderEntity.setSymbolCnt(submitOrderDto.getSymbolCnt());
            contractOrderEntity.setOpeningTime(new Date());
            contractOrderEntity.setMarkPrice(newPrice);
@@ -183,19 +193,15 @@
            wholeHoldOrder.setOpeningFeeAmount(fee);
            wholeHoldOrder.setOpeningPrice(newOpenPrice);
            wholeHoldOrder.setBondAmount(bondAmount.add(fee));
            wholeHoldOrder.setBondAmount(wholeHoldOrder.getBondAmount().add(bondAmount).add(openFeePrice));
            wholeHoldOrder.setSymbolCnt(wholeHoldOrder.getSymbolCnt() + submitOrderDto.getSymbolCnt());
            wholeHoldOrder.setSymbolCntSale(wholeHoldOrder.getSymbolCntSale() + submitOrderDto.getSymbolCnt());
//            wholeHoldOrder.setForceClosingPrice(forceClosingPrice);
            wholeHoldOrder.setPrePaymentAmount(prePaymentAmount);
            wholeHoldOrder.setPrePaymentAmount(prePaymentAmount.add(wholeHoldOrder.getPrePaymentAmount()));
            wholeHoldOrder.setOperateNo(wholeHoldOrder.getOperateNo() + 1);
            int i = contractHoldOrderDao.updateById(wholeHoldOrder);
            if (i > 0) {
                BigDecimal total = subBondAmount.add(openFeePrice).add(openFeePrice);
                memberWalletContractDao.increaseWalletContractBalanceById(total.negate(), openFeePrice.negate(), null, walletContract.getId());
                memberWalletContractDao.increaseWalletContractBalanceById(prePaymentAmount.negate(), openFeePrice.negate(), null, walletContract.getId());
                // 发送爆仓消息
//                sendOrderBombMsg(wholeHoldOrder.getId(), wholeHoldOrder.getOpeningType(), forceClosingPrice, wholeHoldOrder.getSymbol(), wholeHoldOrder.getOperateNo());
                // 发送预估强平价
                ThreadPoolUtils.sendWholeForceClosingPrice(submitOrderDto.getSymbol(), memberEntity);
                // 计算佣金
@@ -214,22 +220,6 @@
            // 提交失败
            return Result.fail(MessageSourceUtils.getString("member_service_0067"));
        }
        // 保证金 建仓价*规格*手数*(1/杠杆倍率)
        BigDecimal bondAmount = CalculateUtil.getBondAmount(openingPrice, lotNumber, submitOrderDto.getSymbolCnt(), submitOrderDto.getLeverRatio());
        log.info("保证金:{}", bondAmount);
        // 预付款为 --> 保证金+开仓手续费+平仓手续费 (开仓平仓手续费相同)
        BigDecimal prePaymentAmount = bondAmount.add(openFeePrice).add(openFeePrice);
        log.info("预付款:{}", prePaymentAmount);
        if (prePaymentAmount.compareTo(walletContract.getAvailableBalance()) > -1) {
            // 可用余额不足
            return Result.fail(MessageSourceUtils.getString("member_service_0085"));
        }
        // 预估强平价
//        BigDecimal forceClosingPrice = CalculateUtil.getForceSetPriceForWhole(submitOrderDto.getSymbol(), memberEntity);
        ContractHoldOrderEntity holdOrderEntity = new ContractHoldOrderEntity();
        holdOrderEntity.setMemberId(memberEntity.getId());