From e263d08f97afb2b9994fa9e4bfe542150a82011c Mon Sep 17 00:00:00 2001 From: Helius <wangdoubleone@gmail.com> Date: Fri, 21 Aug 2020 11:22:30 +0800 Subject: [PATCH] add entrust whole open --- src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 101 insertions(+), 0 deletions(-) diff --git a/src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java b/src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java index 93b135e..5cef914 100644 --- a/src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java +++ b/src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java @@ -3,6 +3,7 @@ import com.alibaba.fastjson.JSONObject; import com.xcong.excoin.modules.coin.dao.MemberAccountFlowEntityDao; import com.xcong.excoin.modules.coin.entity.MemberAccountFlowEntity; +import com.xcong.excoin.modules.contract.dao.ContractHoldOrderDao; import com.xcong.excoin.modules.contract.entity.ContractEntrustOrderEntity; import com.xcong.excoin.modules.contract.entity.ContractHoldOrderEntity; import com.xcong.excoin.modules.contract.entity.ContractOrderEntity; @@ -25,6 +26,7 @@ import com.xcong.excoin.rabbit.producer.OrderProducer; import com.xcong.excoin.utils.CacheSettingUtils; import com.xcong.excoin.utils.CalculateUtil; +import com.xcong.excoin.utils.CoinTypeConvert; import com.xcong.excoin.utils.ThreadPoolUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; @@ -71,6 +73,8 @@ private MemberAccountFlowEntityDao memberAccountFlowEntityDao; @Resource private MemberSettingDao memberSettingDao; + @Resource + private ContractHoldOrderDao contractHoldOrderDao; public void dealOrderFromMq(List<OrderModel> list, Integer type) { @@ -519,6 +523,12 @@ if (CollectionUtils.isNotEmpty(orderList)) { ContractHoldOrderEntity contractHoldOrderEntity = null; for (ContractEntrustOrderEntity coinsCoinsOrder : orderList) { + // 全仓委托 + if (coinsCoinsOrder.getPositionType() == ContractEntrustOrderEntity.POSITION_TYPE_ALL) { + wholeEntrustOrder(coinsCoinsOrder); + continue; + } + MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(coinsCoinsOrder.getMemberId(), "USDT"); if (wallet == null) { continue; @@ -594,6 +604,97 @@ } } + private void wholeEntrustOrder(ContractEntrustOrderEntity entrustOrder) { + log.info("全仓委托逻辑处理:{}", entrustOrder.getOrderNo()); + MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(entrustOrder.getMemberId(), CoinTypeConvert.convertContractTypeToCoin(entrustOrder.getSymbol())); + + PlatformTradeSettingEntity tradeSettingEntity = cacheSettingUtils.getTradeSetting(); + MemberEntity member = memberService.getById(entrustOrder.getMemberId()); + + // 手续费 + BigDecimal openFeePrice = CalculateUtil.getOpenFeePrice(entrustOrder.getEntrustPrice(), entrustOrder.getSymbolSku(), entrustOrder.getSymbolCnt(), tradeSettingEntity.getFeeRatio()); + + ContractHoldOrderEntity wholeHoldOrder = contractHoldOrderDao.selectWholeHoldOrderByOrderType(entrustOrder.getMemberId(), entrustOrder.getEntrustType()); + // 判断持仓是否存在,若不存在则创建新的持仓订单 + if (wholeHoldOrder == null) { + ContractHoldOrderEntity holdOrderEntity = ContractEntrustOrderEntityMapper.INSTANCE.entrustOrderToHoldOrder(entrustOrder); + + int type = entrustOrder.getEntrustType(); + if (type == 1) { + // 开多 + holdOrderEntity.setOpeningType(ContractHoldOrderEntity.OPENING_TYPE_MORE); + } else { + // 开空 + holdOrderEntity.setOpeningType(ContractHoldOrderEntity.OPENING_TYPE_LESS); + } + + holdOrderEntity.setTradeType(ContractHoldOrderEntity.TRADE_TYPE_LIMIT); + holdOrderEntity.setSymbolCntSale(holdOrderEntity.getSymbolCnt()); + holdOrderEntity.setOpeningFeeAmount(openFeePrice); + holdOrderEntity.setOpeningPrice(entrustOrder.getEntrustPrice()); + holdOrderEntity.setMarkPrice(entrustOrder.getEntrustPrice()); + holdOrderEntity.setIsCanClosing(ContractHoldOrderEntity.ORDER_CAN_CLOSING_N); + holdOrderEntity.setOperateNo(1); + // 设置合约类型 + holdOrderEntity.setContractType(ContractOrderEntity.CONTRACTTYPE_NORMAL); + + ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(holdOrderEntity); + contractOrderEntity.setOpeningTime(new Date()); + contractHoldOrderDao.insert(holdOrderEntity); + + boolean isSuccess = contractOrderService.save(contractOrderEntity); + + if (isSuccess) { + contractEntrustOrderService.removeById(entrustOrder.getId()); + memberWalletContractService.increaseWalletContractBalanceById(null, entrustOrder.getBondAmount().add(openFeePrice).negate(), entrustOrder.getBondAmount().negate(), wallet.getId()); + + // 发送强平价 + ThreadPoolUtils.sendWholeForceClosingPrice(entrustOrder.getSymbol(), member); + + //返佣 + ThreadPoolUtils.calReturnMoney(member.getId(), openFeePrice, contractOrderEntity, AgentReturnEntity.ORDER_TYPE_OPEN); + } + + return; + } + + ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(wholeHoldOrder); + contractOrderEntity.setBondAmount(entrustOrder.getBondAmount().add(openFeePrice)); + contractOrderEntity.setOpeningPrice(entrustOrder.getEntrustPrice()); + contractOrderEntity.setSymbolCnt(entrustOrder.getSymbolCnt()); + contractOrderEntity.setOpeningTime(new Date()); + contractOrderEntity.setMarkPrice(entrustOrder.getEntrustPrice()); + contractOrderEntity.setOpeningFeeAmount(openFeePrice); + contractOrderService.save(contractOrderEntity); + + BigDecimal totalPrice = entrustOrder.getEntrustPrice().multiply(BigDecimal.valueOf(entrustOrder.getSymbolCnt())); + BigDecimal newOpenPrice = totalPrice.add(wholeHoldOrder.getOpeningPrice().multiply(BigDecimal.valueOf(wholeHoldOrder.getSymbolCnt()))).divide(BigDecimal.valueOf(entrustOrder.getSymbolCnt() + wholeHoldOrder.getSymbolCntSale()), 8, BigDecimal.ROUND_DOWN); + // 保证金 + BigDecimal bondAmount = CalculateUtil.getBondAmount(newOpenPrice, entrustOrder.getSymbolSku(), entrustOrder.getSymbolCnt() + wholeHoldOrder.getSymbolCntSale(), entrustOrder.getLeverRatio()); + // 手续费 + BigDecimal fee = openFeePrice.add(wholeHoldOrder.getOpeningFeeAmount()); + // 预付款 + BigDecimal prePaymentAmount = bondAmount.add(fee).add(fee); + + wholeHoldOrder.setSymbolCnt(wholeHoldOrder.getSymbolCnt() + entrustOrder.getSymbolCnt()); + wholeHoldOrder.setSymbolCntSale(wholeHoldOrder.getSymbolCntSale() + entrustOrder.getSymbolCnt()); + wholeHoldOrder.setOpeningFeeAmount(wholeHoldOrder.getOpeningFeeAmount().add(openFeePrice)); + wholeHoldOrder.setOpeningPrice(newOpenPrice); + wholeHoldOrder.setBondAmount(bondAmount); + wholeHoldOrder.setPrePaymentAmount(prePaymentAmount); + wholeHoldOrder.setOperateNo(wholeHoldOrder.getOperateNo() + 1); + contractHoldOrderService.save(wholeHoldOrder); + + contractEntrustOrderService.removeById(entrustOrder.getId()); + memberWalletContractService.increaseWalletContractBalanceById(null, entrustOrder.getBondAmount().add(openFeePrice).negate(), entrustOrder.getBondAmount().negate(), wallet.getId()); + + // 发送强平价 + ThreadPoolUtils.sendWholeForceClosingPrice(entrustOrder.getSymbol(), member); + + //返佣 + ThreadPoolUtils.calReturnMoney(member.getId(), openFeePrice, contractOrderEntity, AgentReturnEntity.ORDER_TYPE_OPEN); + } + /** * 爆仓 * -- Gitblit v1.9.1