From 589a60e79c24aac2fac5a7e00c784d8e4731e036 Mon Sep 17 00:00:00 2001 From: xiaoyong931011 <15274802129@163.com> Date: Mon, 01 Mar 2021 12:50:13 +0800 Subject: [PATCH] 20210301 平仓时间时间戳 --- src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java | 167 +++++++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 148 insertions(+), 19 deletions(-) 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 3d1476a..e8c1396 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 @@ -1,6 +1,7 @@ package com.xcong.excoin.modules.contract.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; import com.xcong.excoin.common.contants.AppContants; @@ -35,6 +36,8 @@ import com.xcong.excoin.modules.member.entity.MemberWalletContractEntity; import com.xcong.excoin.modules.platform.entity.PlatformTradeSettingEntity; import com.xcong.excoin.rabbit.pricequeue.OrderModel; +import com.xcong.excoin.rabbit.pricequeue.whole.HoldOrderDataModel; +import com.xcong.excoin.rabbit.pricequeue.whole.WholePriceDataModel; import com.xcong.excoin.utils.*; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -212,7 +215,7 @@ followOrderOperationService.closingFollowOrders(holdOrderEntity.getOrderNo()); } else { followFollowerProfitDao.updateFollowerProfitByTradeMemberId(holdOrderEntity.getBondAmount().subtract(holdOrderEntity.getOpeningFeeAmount()), profitOrLoss, traderInfoEntity.getMemberId(), memberEntity.getId()); - LogRecordUtils.insertFollowerNotice(memberEntity.getId(), NoticeConstant.CLOSE_ORDER_TITLE, StrUtil.format(NoticeConstant.CLOSE_ORDER_CONTENT, contractOrderEntity.getSymbol(), contractOrderEntity.getClosingPrice(), profitOrLoss, traderInfoEntity.getNickname())); + LogRecordUtils.insertFollowerNotice(memberEntity.getId(), NoticeConstant.CLOSE_ORDER_TITLE, StrUtil.format(NoticeConstant.CLOSE_ORDER_CONTENT, contractOrderEntity.getSymbol(), contractOrderEntity.getClosingPrice(), profitOrLoss.setScale(8, BigDecimal.ROUND_DOWN), traderInfoEntity.getNickname())); } } } @@ -351,6 +354,8 @@ memberWalletContractDao.increaseWalletContractBalanceById(changeAmount, total, null, walletContract.getId()); + ThreadPoolUtils.sendWholePrice(memberEntity.getId()); + ThreadPoolUtils.sendWholeForceClosingPrice(holdOrderEntity.getSymbol(), memberEntity); // 计算佣金 ThreadPoolUtils.calReturnMoney(memberEntity.getId(), fee, contractOrderEntity, AgentReturnEntity.ORDER_TYPE_CLOSE); @@ -466,11 +471,73 @@ memberWalletContractDao.increaseWalletContractBalanceById(changeAmount, total, null, walletContract.getId()); contractEntrustOrderDao.deleteById(entrustOrder.getId()); + + ThreadPoolUtils.sendWholePrice(memberEntity.getId()); + ThreadPoolUtils.sendWholeForceClosingPrice(holdOrderEntity.getSymbol(), memberEntity); // 计算佣金 ThreadPoolUtils.calReturnMoney(memberEntity.getId(), fee, contractOrderEntity, AgentReturnEntity.ORDER_TYPE_CLOSE); } + @Transactional(rollbackFor = Exception.class) + @Override + public void wholeBombOrder(WholePriceDataModel wholePriceData) { + MemberWalletContractEntity wallet = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(wholePriceData.getMemberId(), CoinTypeEnum.USDT.name()); + MemberEntity memberEntity = memberDao.selectById(wholePriceData.getMemberId()); + List<HoldOrderDataModel> list = wholePriceData.getList(); + if (CollUtil.isNotEmpty(list)) { + String batchNo = IdUtil.randomUUID(); + for (HoldOrderDataModel holdOrderDataModel : list) { + ContractHoldOrderEntity holdOrderEntity = contractHoldOrderDao.selectById(holdOrderDataModel.getId()); + if (holdOrderEntity == null) { + log.info("持仓不存在:{}", holdOrderDataModel.getId()); + redisUtils.del(AppContants.WHOLE_BOMB_PREFIX + wholePriceData.getMemberId()); + continue; + } + +// holdOrderEntity.setForceClosingPrice(getForceSetPrice(wholePriceData, holdOrderEntity, holdOrderDataModel.getSymbol())); + contractHoldOrderDao.deleteById(holdOrderDataModel.getId()); + + ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(holdOrderEntity); + + if (holdOrderEntity.getOpeningType() == ContractHoldOrderEntity.OPENING_TYPE_MORE) { + contractOrderEntity.setClosingType(4); + } else { + contractOrderEntity.setClosingType(5); + } + + BigDecimal rewardRatio = holdOrderDataModel.getRewardAmount().divide(holdOrderEntity.getBondAmount().subtract(holdOrderEntity.getOpeningFeeAmount()), 8, BigDecimal.ROUND_DOWN); + contractOrderEntity.setRewardRatio(rewardRatio); + contractOrderEntity.setRewardAmount(holdOrderDataModel.getRewardAmount().add(contractOrderEntity.getHoldBond().negate())); + contractOrderEntity.setClosingPrice(holdOrderDataModel.getClosingPrice()); + contractOrderEntity.setForceClosingPrice(holdOrderDataModel.getClosingPrice()); + + // 订单状态转换 + if (ContractOrderEntity.ORDER_TYPE_OPEN_MORE == contractOrderEntity.getOrderType()) { + contractOrderEntity.setOrderType(ContractOrderEntity.ORDER_TYPE_CLOSE_MORE); + } else { + contractOrderEntity.setOrderType(ContractOrderEntity.ORDER_TYPE_CLOSE_LESS); + } + contractOrderEntity.setClosingTime(new Date()); + contractOrderEntity.setBatchNo(batchNo); + contractOrderDao.insert(contractOrderEntity); + } + + List<ContractEntrustOrderEntity> entrustOrder = contractEntrustOrderDao.selectEntrustOrderListByMemberId(wholePriceData.getMemberId()); + BigDecimal totalAmount = BigDecimal.ZERO; + if (CollUtil.isNotEmpty(entrustOrder)) { + for (ContractEntrustOrderEntity contractEntrustOrderEntity : entrustOrder) { + totalAmount = totalAmount.add(contractEntrustOrderEntity.getEntrustAmount()); + } + } + + memberWalletContractDao.increaseWalletContractBalanceById(wallet.getAvailableBalance().negate(), wallet.getTotalBalance().subtract(totalAmount).negate(), null, wallet.getId()); + + redisUtils.del(AppContants.WHOLE_BOMB_PREFIX + wholePriceData.getMemberId()); + } else { + log.info("参数有误:{}", memberEntity.getId()); + } + } @Transactional(rollbackFor = Exception.class) @Override @@ -483,7 +550,9 @@ Map<Object, Object> value = redisUtils.hmget(AppContants.WHOLE_BOMB_PREFIX + memberId); if (CollUtil.isNotEmpty(holdOrderEntities)) { - PlatformTradeSettingEntity tradeSetting = cacheSettingUtils.getTradeSetting(); + BigDecimal maxLess = BigDecimal.ZERO; + ContractOrderEntity maxLessEntity = null; + BigDecimal totalProfitOrLess = BigDecimal.ZERO; for (ContractHoldOrderEntity holdOrderEntity : holdOrderEntities) { // 删除次仓订单 contractHoldOrderDao.deleteById(holdOrderEntity.getId()); @@ -491,23 +560,7 @@ String symbolPrice = (String) value.get(holdOrderEntity.getSymbol()); log.info("symbolPrice : {}, symbol : {}", symbolPrice, holdOrderEntity.getSymbol()); BigDecimal currentPrice = new BigDecimal(symbolPrice); - // 单个订单盈利 -// BigDecimal profitOrLess = BigDecimal.ZERO; -// // 开多 -// if (ContractHoldOrderEntity.OPENING_TYPE_MORE == holdOrderEntity.getOpeningType()) { -// profitOrLess = currentPrice.subtract(holdOrderEntity.getOpeningPrice()).multiply(new BigDecimal(holdOrderEntity.getSymbolCntSale())).multiply(lotNumber); -// // 开空 -// } else { -// profitOrLess = holdOrderEntity.getOpeningPrice().subtract(currentPrice).multiply(new BigDecimal(holdOrderEntity.getSymbolCntSale())).multiply(lotNumber); -// } -// -// if (MemberEntity.IS_PROFIT_Y == memberEntity.getIsProfit()) { -// if (profitOrLess.compareTo(BigDecimal.ZERO) > 0) { -// profitOrLess = profitOrLess.multiply(BigDecimal.ONE.subtract(tradeSetting.getForceParam())); -// } else { -// profitOrLess = profitOrLess.multiply(BigDecimal.ONE.add(tradeSetting.getForceParam())); -// } -// } + BigDecimal profitOrLess = CalculateUtil.calOrderProfitOrLess(holdOrderEntity.getOpeningType(), currentPrice, holdOrderEntity.getOpeningPrice(), lotNumber, holdOrderEntity.getSymbolCntSale(), memberEntity.getIsProfit()); log.info("profitOrLess ---> {}", profitOrLess); ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(holdOrderEntity); @@ -555,4 +608,80 @@ } } } + + /** + * 1 2 3 + * 开仓价 - (权益 - 其他币种成本)/当前币种成本 * (开仓价 * 1/杠杆) + * + * @param dataModel + * @param holdOrder + * @return + */ + private BigDecimal getForceSetPrice(WholePriceDataModel dataModel, ContractHoldOrderEntity holdOrder, String currentSymbol) { + Long memberId = holdOrder.getMemberId(); + List<ContractHoldOrderEntity> holdOrderEntities = contractHoldOrderDao.selectHoldOrderListForWholeByMemberIdAndSymbol(memberId, null); + List<String> symbols = contractHoldOrderDao.selectWholeHoldOrderSymbolsByMemberId(memberId); + + BigDecimal result = BigDecimal.ZERO; + if (CollUtil.isNotEmpty(holdOrderEntities)) { + + for (String symbol : symbols) { + // 其他币种成本 + BigDecimal totalBondAmount = BigDecimal.ZERO; + // 当前币种保证金 + BigDecimal symbolBondAmount = BigDecimal.ZERO; + + // 开仓均价 + BigDecimal openPrice = BigDecimal.ZERO; + // 杠杆 + int leverRatio = 0; + boolean isAloneLess = true; + for (ContractHoldOrderEntity holdOrderEntity : holdOrderEntities) { + BigDecimal bondAmount = holdOrderEntity.getBondAmount().subtract(holdOrderEntity.getOpeningFeeAmount()); + + if (symbol.equalsIgnoreCase(holdOrderEntity.getSymbol())) { + if (holdOrderEntity.getOpeningType() == ContractHoldOrderEntity.OPENING_TYPE_MORE) { + isAloneLess = false; + } + symbolBondAmount = symbolBondAmount.add(bondAmount.subtract(holdOrderEntity.getOpeningFeeAmount())); + + if (openPrice.compareTo(BigDecimal.ZERO) == 0) { + openPrice = holdOrderEntity.getOpeningPrice(); + } else { + openPrice = openPrice.add(holdOrderEntity.getOpeningPrice()).divide(BigDecimal.valueOf(2), 8, BigDecimal.ROUND_DOWN); + } + leverRatio = holdOrderEntity.getLeverRatio(); + } else { + totalBondAmount = totalBondAmount.add(holdOrderEntity.getBondAmount().subtract(holdOrderEntity.getOpeningFeeAmount())); + } + + } + + BigDecimal equity = dataModel.getEquity(); + BigDecimal sub = equity.subtract(totalBondAmount); + + if (sub.compareTo(symbolBondAmount) <= 0) { + BigDecimal multi = BigDecimal.valueOf(10); + BigDecimal divide = equity.divide(equity.add(multi), 8, BigDecimal.ROUND_DOWN); + sub = symbolBondAmount.multiply(divide); + } + + BigDecimal divide = sub.divide(symbolBondAmount, 8, BigDecimal.ROUND_DOWN); + BigDecimal divide2 = openPrice.divide(BigDecimal.valueOf(leverRatio), 8, BigDecimal.ROUND_DOWN); + + BigDecimal forcePrice = BigDecimal.ZERO; + if (isAloneLess) { + forcePrice = openPrice.add(divide.multiply(divide2)); + } else { + forcePrice = openPrice.subtract(divide.multiply(divide2)); + } + + if (symbol.equalsIgnoreCase(currentSymbol)) { + result = forcePrice; + } + } + } + + return result; + } } -- Gitblit v1.9.1