xiaoyong931011
2021-04-09 d0d0306f30ffcf22afda2da15c13df2b3a6060ee
Merge branch 'activity' of http://120.27.238.55:7000/r/exchange into activity

 Conflicts:
 src/test/java/com/xcong/excoin/LocalTest.java
5 files modified
136 ■■■■ changed files
src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java 10 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/utils/CalculateUtil.java 66 ●●●● patch | view | raw | blame | history
src/test/java/com/xcong/excoin/LocalTest.java 19 ●●●●● patch | view | raw | blame | history
src/test/java/com/xcong/excoin/WholeTest.java 39 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java
@@ -531,7 +531,7 @@
                holdOrderListVo.setReturnRate(returnRate);
                holdOrderListVo.setProfitOrLoss(rewardRatio);
                if (ContractEntrustOrderEntity.POSITION_TYPE_ALL == memberEntity.getContractPositionType()) {
                    BigDecimal forcePrice = CalculateUtil.calWholePriceTwo(memberEntity, holdOrderEntity);
                    BigDecimal forcePrice = CalculateUtil.calWholePriceTwo(memberEntity, holdOrderEntity, 1);
//                    contractHoldOrderDao.updateForcePriceBySymbolAndMemberId(forcePrice, memberEntity.getId(), holdOrderEntity.getSymbol());
                    holdOrderListVo.setForceClosingPrice(forcePrice);
                }
@@ -1169,10 +1169,10 @@
                    // 发送爆仓消息
                    sendOrderBombMsg(holdOrderEntity.getId(), holdOrderEntity.getOpeningType(), newForcePrice, holdOrderEntity.getSymbol(), holdOrderEntity.getOperateNo(), holdOrderEntity.getMemberId());
                } else {
                    holdOrderEntity.setHoldAmount(holdAmount);
                    contractHoldOrderDao.updateById(holdOrderEntity);
                    memberWalletContractDao.increaseWalletContractBalanceById(thisTimeHold.negate(), thisTimeHold.negate(), null, wallet.getId());
                    ThreadPoolUtils.sendWholePrice(holdOrderEntity.getMemberId());
//                    holdOrderEntity.setHoldAmount(holdAmount);
//                    contractHoldOrderDao.updateById(holdOrderEntity);
//                    memberWalletContractDao.increaseWalletContractBalanceById(thisTimeHold.negate(), thisTimeHold.negate(), null, wallet.getId());
//                    ThreadPoolUtils.sendWholePrice(holdOrderEntity.getMemberId());
                }
            }
        }
src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java
@@ -536,7 +536,7 @@
                    continue;
                }
                holdOrderEntity.setStopLossPrice(CalculateUtil.calWholePriceTwo(memberEntity, holdOrderEntity));
                holdOrderEntity.setStopLossPrice(CalculateUtil.calWholePriceTwo(memberEntity, holdOrderEntity, 2));
                contractHoldOrderDao.deleteById(holdOrderDataModel.getId());
                ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(holdOrderEntity);
src/main/java/com/xcong/excoin/utils/CalculateUtil.java
@@ -204,11 +204,18 @@
        return forcePrice;
    }
    public static BigDecimal calWholePriceTwo(MemberEntity memberEntity, ContractHoldOrderEntity contractHoldOrderEntity) {
    /**
     * 权益-维持保证金+开仓价*张数*规格-开仓价*费率-(总账户-维持保证金) / 规格*张数
     *
     * @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);
        BigDecimal newPrice = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey(contractHoldOrderEntity.getSymbol())));
        Long memberId = memberEntity.getId();
        MemberWalletContractEntity walletContract = walletContractDao.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeEnum.USDT.name());
@@ -223,26 +230,67 @@
                } else {
                    totalBondAmount = totalBondAmount.add(holdOrderEntity.getBondAmount());
                }
                totalProfitOrLoss = totalProfitOrLoss.add(calProfitOrLoss(holdOrderEntity, memberEntity));
                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 = newPrice.multiply(new BigDecimal("0.015"));
            // 权益
            BigDecimal qy = walletContract.getTotalBalance().add(totalProfitOrLoss).add(walletContract.getTotalBalance());
            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 = holdBond.negate().subtract(cost).add(ratio).add(qy);
                divideChild = prefix.subtract(orderProfitOrLoss).subtract(qy);
            } else {
                divideChild = holdBond.negate().subtract(cost).add(ratio).subtract(qy);
                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).negate();
            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;
    }
src/test/java/com/xcong/excoin/LocalTest.java
@@ -90,7 +90,7 @@
    private FollowTraderLabelDao followTraderLabelDao;
    @Resource
    private MemberSettingDao memberSettingDao;
//
//    @Test
//    public void traderProfitUpdate() {
//        log.info("交易员定时任务执行");
@@ -134,16 +134,13 @@
//                List<ContractOrderEntity> orders = contractOrderDao.selectFollowOrderListByMemberId(tradeMemberId);
//                traderInfoProfit.setTotalOrderCnt(CollUtil.isNotEmpty(orders) ? orders.size() : 0);
//                // 近三周胜率
//                BigDecimal winCnt = contractOrderDao.selectFollowOrderCntForWinRate(tradeMemberId, 1);
//                winCnt = (winCnt == null?BigDecimal.ZERO:winCnt.setScale(2, BigDecimal.ROUND_DOWN));
//                BigDecimal allCnt = contractOrderDao.selectFollowOrderCntForWinRate(tradeMemberId, null);
//                allCnt = (allCnt == null?BigDecimal.ZERO:allCnt.setScale(2, BigDecimal.ROUND_DOWN));
//                BigDecimal winRate = BigDecimal.ZERO.setScale(2, BigDecimal.ROUND_DOWN);
//                if (allCnt.compareTo(BigDecimal.ZERO) > 0) {
//                    winRate = winCnt.divide(allCnt, 2, BigDecimal.ROUND_DOWN).setScale(2, BigDecimal.ROUND_DOWN);
//                }
//                traderInfoProfit.setWinRate(winRate);
//                Integer winCnt = contractOrderDao.selectFollowOrderCntForWinRate(tradeMemberId, 1);
//                Integer allCnt = contractOrderDao.selectFollowOrderCntForWinRate(tradeMemberId, null);
//
//                if (winCnt != null && allCnt != null && allCnt!=0) {
//                    BigDecimal winRate = BigDecimal.valueOf(winCnt).divide(BigDecimal.valueOf(allCnt), 4, BigDecimal.ROUND_DOWN);
//                    traderInfoProfit.setWinRate(winRate);
//                }
//                Date date = new Date();
//                DateTime offsetDay = DateUtil.offsetDay(new Date(), -30);
//                //30天胜率(30天盈利总单数/30平仓总单数)
@@ -151,7 +148,7 @@
//                BigDecimal thirtyWinCnt = contractOrderDao.selectThirtyWinCntByMemberId(tradeMemberId,date,offsetDay);
//                BigDecimal thirtyTotalCntRatio = (thirtyTotalCnt == null?BigDecimal.ZERO:thirtyTotalCnt.setScale(2, BigDecimal.ROUND_DOWN));
//                BigDecimal thirtyWinCntRatio = (thirtyWinCnt == null?BigDecimal.ZERO:thirtyWinCnt.setScale(2, BigDecimal.ROUND_DOWN));
//                BigDecimal thirtyProfitRatio = BigDecimal.ZERO.setScale(2, BigDecimal.ROUND_DOWN);
//                BigDecimal thirtyProfitRatio = BigDecimal.ZERO.setScale(2, BigDecimal.ROUND_DOWN);;
//                if(thirtyTotalCnt.compareTo(BigDecimal.ZERO) > 0) {
//                    thirtyProfitRatio = thirtyWinCntRatio.divide(thirtyTotalCntRatio, 2, BigDecimal.ROUND_DOWN).setScale(2, BigDecimal.ROUND_DOWN);
//                }
src/test/java/com/xcong/excoin/WholeTest.java
@@ -17,6 +17,7 @@
import com.xcong.excoin.rabbit.pricequeue.WebsocketPriceService;
import com.xcong.excoin.rabbit.producer.OrderProducer;
import com.xcong.excoin.utils.CalculateUtil;
import com.xcong.excoin.utils.CoinTypeConvert;
import com.xcong.excoin.utils.RedisUtils;
import com.xcong.excoin.utils.ThreadPoolUtils;
import lombok.SneakyThrows;
@@ -200,10 +201,42 @@
    @Test
    public void wholeForceNewTest() {
        MemberEntity memberEntity = memberDao.selectById(15L);
        ContractHoldOrderEntity holdOrder = contractHoldOrderDao.selectById(400L);
        BigDecimal newPrice = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey("BTC/USDT")));
        System.out.println(CalculateUtil.calForcePriceForWhole(memberEntity, holdOrder));
        MemberEntity memberEntity = memberDao.selectById(16L);
        ContractHoldOrderEntity holdOrder = contractHoldOrderDao.selectById(769L);
        System.out.println(CalculateUtil.calWholePriceTwo(memberEntity, holdOrder, 2));
    }
    @Test
    public void wholeForceNewTest2() {
        BigDecimal holdBond = new BigDecimal("1161.8951");
        BigDecimal sku = new BigDecimal("0.1");
        BigDecimal openPrice = new BigDecimal("58094.75");
        int cnt = 50;
        BigDecimal total = new BigDecimal("9866.3820");
        // 成本 数量*面值*开仓价
        BigDecimal cost = sku.multiply(openPrice).multiply(new BigDecimal(cnt));
        // 费率
        BigDecimal ratio = openPrice.multiply(new BigDecimal("0.005"));
        // 总账户 - 维持保证金
        BigDecimal orderProfitOrLoss = total.subtract(holdBond);
        // 权益
        BigDecimal qy = BigDecimal.ZERO;
        BigDecimal prefix = cost.subtract(ratio);
        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 = sku.multiply(new BigDecimal(cnt));
        System.out.println(divideChild.divide(divideParent, 8, BigDecimal.ROUND_DOWN));
    }
}