From d0d0306f30ffcf22afda2da15c13df2b3a6060ee Mon Sep 17 00:00:00 2001 From: xiaoyong931011 <15274802129@163.com> Date: Fri, 09 Apr 2021 16:01:49 +0800 Subject: [PATCH] Merge branch 'activity' of http://120.27.238.55:7000/r/exchange into activity --- src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java | 2 src/test/java/com/xcong/excoin/WholeTest.java | 39 ++++++++++++- src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java | 10 +- src/test/java/com/xcong/excoin/LocalTest.java | 21 +++---- src/main/java/com/xcong/excoin/utils/CalculateUtil.java | 66 +++++++++++++++++++--- 5 files changed, 108 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java b/src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java index a87efc9..70940c6 100644 --- a/src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java +++ b/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()); } } } 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 6116938..9ff4d66 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 @@ -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); diff --git a/src/main/java/com/xcong/excoin/utils/CalculateUtil.java b/src/main/java/com/xcong/excoin/utils/CalculateUtil.java index 3e7a722..b3ba2b4 100644 --- a/src/main/java/com/xcong/excoin/utils/CalculateUtil.java +++ b/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; } diff --git a/src/test/java/com/xcong/excoin/LocalTest.java b/src/test/java/com/xcong/excoin/LocalTest.java index adfa401..a40bfba 100644 --- a/src/test/java/com/xcong/excoin/LocalTest.java +++ b/src/test/java/com/xcong/excoin/LocalTest.java @@ -55,7 +55,7 @@ @Slf4j @SpringBootTest public class LocalTest { - + @Resource private MemberDao memberDao; @Resource @@ -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); // } diff --git a/src/test/java/com/xcong/excoin/WholeTest.java b/src/test/java/com/xcong/excoin/WholeTest.java index 1123b19..da62aa7 100644 --- a/src/test/java/com/xcong/excoin/WholeTest.java +++ b/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)); } } -- Gitblit v1.9.1