From 67de76a89e21c545122c6cf111ef47b35f23997d Mon Sep 17 00:00:00 2001 From: Helius <wangdoubleone@gmail.com> Date: Fri, 04 Sep 2020 11:52:32 +0800 Subject: [PATCH] modify --- src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 108 insertions(+), 3 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 6e1b51f..4e4e080 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 @@ -2,6 +2,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; import com.xcong.excoin.common.contants.AppContants; import com.xcong.excoin.common.enumerates.CoinTypeEnum; import com.xcong.excoin.common.enumerates.OrderClosingTypeEnum; @@ -258,7 +259,7 @@ MemberEntity memberEntity = memberDao.selectById(holdOrderEntity.getMemberId()); - MemberWalletContractEntity walletContract = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(holdOrderEntity.getMemberId(), CoinTypeConvert.convertContractTypeToCoin(symbol)); + MemberWalletContractEntity walletContract = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(holdOrderEntity.getMemberId(), CoinTypeEnum.USDT.name()); if (walletContract != null) { BigDecimal lotNumber = cacheSettingUtils.getSymbolSku(symbol); // 盈亏 @@ -302,8 +303,10 @@ log.info("bondAmount:{}", bondAmount); // 平仓手续费 TODO 可能需要修复手续费 BigDecimal fee = BigDecimal.ZERO; - if (holdOrderEntity.getSymbolCnt() != 0) { - fee = holdOrderEntity.getOpeningFeeAmount().divide(BigDecimal.valueOf(holdOrderEntity.getSymbolCnt()), 8, BigDecimal.ROUND_DOWN).multiply(BigDecimal.valueOf(closeCnt)); + + if (holdOrderEntity.getSymbolCntSale() != 0) { + BigDecimal totalFeeAmount = contractOrderDao.selectWholeFeeAmountByOrderNo(holdOrderEntity.getOrderNo()); + fee = totalFeeAmount.divide(BigDecimal.valueOf(holdOrderEntity.getSymbolCnt()), 8, BigDecimal.ROUND_DOWN).multiply(BigDecimal.valueOf(closeCnt)); } else { fee = holdOrderEntity.getOpeningFeeAmount(); } @@ -322,9 +325,19 @@ if (holdOrderEntity.getSymbolCntSale() != 0) { holdOrderEntity.setOpeningFeeAmount(holdOrderEntity.getOpeningFeeAmount().subtract(fee)); holdOrderEntity.setBondAmount(holdOrderEntity.getBondAmount().subtract(bondAmount)); + BigDecimal rewardAmount = holdOrderEntity.getRewardAmount() == null ? BigDecimal.ZERO : holdOrderEntity.getRewardAmount(); + holdOrderEntity.setRewardAmount(rewardAmount.add(profitOrLoss)); contractHoldOrderDao.updateById(holdOrderEntity); } else { contractHoldOrderDao.deleteById(holdOrderEntity.getId()); + + // 若平掉所有张数,若存在委托平仓,则删除委托平仓记录 + List<ContractEntrustOrderEntity> entrustOrders = contractEntrustOrderDao.selectEntrustOrderByOrderNo(holdOrderEntity.getOrderNo()); + if (CollUtil.isNotEmpty(entrustOrders)) { + for (ContractEntrustOrderEntity entrustOrder : entrustOrders) { + contractEntrustOrderDao.deleteById(entrustOrder.getId()); + } + } } BigDecimal changeAmount = profitOrLoss.add(bondAmount); @@ -361,5 +374,97 @@ private void closeOrder(ContractEntrustOrderEntity entrustOrder) { log.info("执行平仓委托"); + + Long memberId = entrustOrder.getMemberId(); + int orderType = entrustOrder.getEntrustType() == ContractEntrustOrderEntity.ENTRUST_TYPE_CLOSE_MORE ? ContractHoldOrderEntity.OPENING_TYPE_MORE : ContractHoldOrderEntity.OPENING_TYPE_LESS; + String symbol = entrustOrder.getSymbol(); + + MemberEntity memberEntity = memberDao.selectById(memberId); + MemberWalletContractEntity walletContract = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeEnum.USDT.name()); + + BigDecimal lotNumber = cacheSettingUtils.getSymbolSku(symbol); + + BigDecimal newPrice = entrustOrder.getEntrustPrice(); + int closeCnt = entrustOrder.getSymbolCnt(); + + ContractHoldOrderEntity holdOrderEntity = contractHoldOrderDao.selectWholeHoldOrderByOrderType(memberId, orderType, symbol); + + List<Object> types = redisUtils.lGet(AppContants.RABBIT_TYPE + holdOrderEntity.getId(), 0, -1); + if(types.contains(9) || types.contains(10) || types.contains(11) || types.contains(12)) { + log.info("存在止盈/止损 orderId : {}, types : {}", holdOrderEntity.getId(), JSONObject.toJSONString(types)); + return; + } + + BigDecimal profitOrLoss; + int closingType; + // 平多 + if (entrustOrder.getEntrustType() == ContractEntrustOrderEntity.ENTRUST_TYPE_CLOSE_MORE) { + profitOrLoss = newPrice.subtract(holdOrderEntity.getOpeningPrice()).multiply(lotNumber).multiply(new BigDecimal(closeCnt)); + closingType = OrderClosingTypeEnum.CLOSE_MORE.getValue(); + + // 平空 + } else { + profitOrLoss = newPrice.subtract(holdOrderEntity.getOpeningPrice()).multiply(lotNumber).multiply(new BigDecimal(closeCnt)); + closingType = OrderClosingTypeEnum.CLOSE_LESS.getValue(); + } + + if (memberEntity.getIsProfit() == MemberEntity.IS_PROFIT_Y) { + PlatformTradeSettingEntity tradeSettingEntity = cacheSettingUtils.getTradeSetting(); + if (profitOrLoss.compareTo(BigDecimal.ZERO) > -1) { + profitOrLoss = profitOrLoss.multiply(BigDecimal.ONE.subtract(tradeSettingEntity.getProfitParam())); + } else { + profitOrLoss = profitOrLoss.multiply(BigDecimal.ONE.add(tradeSettingEntity.getProfitParam())); + } + } + log.info("profitOrLoss:{}", profitOrLoss); + + // 保证金 + BigDecimal bondAmount = CalculateUtil.getBondAmount(holdOrderEntity.getOpeningPrice(), lotNumber, closeCnt, holdOrderEntity.getLeverRatio()); + + log.info("bondAmount:{}", bondAmount); + // 平仓手续费 TODO 可能需要修复手续费 + BigDecimal fee = BigDecimal.ZERO; + + if (holdOrderEntity.getSymbolCntSale() != 0) { + fee = holdOrderEntity.getOpeningFeeAmount().divide(BigDecimal.valueOf(holdOrderEntity.getSymbolCnt()), 8, BigDecimal.ROUND_DOWN).multiply(BigDecimal.valueOf(closeCnt)); + } else { + fee = holdOrderEntity.getOpeningFeeAmount(); + } + + log.info("fee:{}", fee); + ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(holdOrderEntity); + contractOrderEntity.setId(null); + contractOrderEntity.setEntrustOpeningPrice(newPrice); + contractOrderEntity.setEntrustTime(new Date()); + contractOrderEntity.setClosingPrice(newPrice); + contractOrderEntity.setOrderType(orderType); + contractOrderEntity.setClosingType(closingType); + contractOrderEntity.setSymbolCnt(closeCnt); + contractOrderEntity.setRewardAmount(profitOrLoss); + contractOrderEntity.setBondAmount(bondAmount); + contractOrderEntity.setClosingFeeAmount(fee); + contractOrderDao.insert(contractOrderEntity); + + if (holdOrderEntity.getSymbolCntSale() - closeCnt != 0) { + holdOrderEntity.setSymbolCntSale(holdOrderEntity.getSymbolCntSale() - closeCnt); + holdOrderEntity.setOpeningFeeAmount(holdOrderEntity.getOpeningFeeAmount().subtract(fee)); + holdOrderEntity.setBondAmount(holdOrderEntity.getBondAmount().subtract(bondAmount)); + contractHoldOrderDao.updateById(holdOrderEntity); + } else { + contractHoldOrderDao.deleteById(holdOrderEntity.getId()); + } + + BigDecimal changeAmount = profitOrLoss.add(bondAmount); + log.info("changeAmount : {}", changeAmount); + + BigDecimal total = profitOrLoss.subtract(fee); + log.info("totalMoney : {}", total); + + memberWalletContractDao.increaseWalletContractBalanceById(changeAmount, total, null, walletContract.getId()); + + contractEntrustOrderDao.deleteById(entrustOrder.getId()); + ThreadPoolUtils.sendWholeForceClosingPrice(holdOrderEntity.getSymbol(), memberEntity); + // 计算佣金 + ThreadPoolUtils.calReturnMoney(memberEntity.getId(), fee, contractOrderEntity, AgentReturnEntity.ORDER_TYPE_CLOSE); } } -- Gitblit v1.9.1