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)); } }