From 7d6d6dd78a5fce532c8d6f075fb7d859d7e4f9f6 Mon Sep 17 00:00:00 2001 From: xiaoyong931011 <15274802129@163.com> Date: Thu, 04 Mar 2021 11:27:34 +0800 Subject: [PATCH] 20210304 合约变更类型的持仓提醒 --- src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java | 412 +++++++++++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 334 insertions(+), 78 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 58fee8e..b61cfba 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 @@ -1,8 +1,13 @@ package com.xcong.excoin.modules.contract.service.impl; +import cn.hutool.core.collection.CollUtil; import com.alibaba.fastjson.JSONObject; +import com.xcong.excoin.common.contants.AppContants; +import com.xcong.excoin.common.enumerates.CoinTypeEnum; import com.xcong.excoin.modules.coin.dao.MemberAccountFlowEntityDao; import com.xcong.excoin.modules.coin.entity.MemberAccountFlowEntity; +import com.xcong.excoin.modules.contract.dao.ContractEntrustOrderDao; +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; @@ -11,9 +16,12 @@ import com.xcong.excoin.modules.contract.service.ContractEntrustOrderService; import com.xcong.excoin.modules.contract.service.ContractHoldOrderService; import com.xcong.excoin.modules.contract.service.ContractOrderService; +import com.xcong.excoin.modules.documentary.service.FollowOrderOperationService; import com.xcong.excoin.modules.member.dao.AgentReturnDao; +import com.xcong.excoin.modules.member.dao.MemberSettingDao; import com.xcong.excoin.modules.member.entity.AgentReturnEntity; import com.xcong.excoin.modules.member.entity.MemberEntity; +import com.xcong.excoin.modules.member.entity.MemberSettingEntity; import com.xcong.excoin.modules.member.entity.MemberWalletContractEntity; import com.xcong.excoin.modules.member.parameter.vo.NeedMoneyMemberVo; import com.xcong.excoin.modules.member.service.MemberService; @@ -21,9 +29,7 @@ import com.xcong.excoin.modules.platform.entity.PlatformTradeSettingEntity; import com.xcong.excoin.rabbit.pricequeue.OrderModel; import com.xcong.excoin.rabbit.producer.OrderProducer; -import com.xcong.excoin.utils.CacheSettingUtils; -import com.xcong.excoin.utils.CalculateUtil; -import com.xcong.excoin.utils.ThreadPoolUtils; +import com.xcong.excoin.utils.*; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.springframework.stereotype.Service; @@ -67,7 +73,16 @@ @Resource private MemberAccountFlowEntityDao memberAccountFlowEntityDao; - + @Resource + private MemberSettingDao memberSettingDao; + @Resource + private ContractHoldOrderDao contractHoldOrderDao; + @Resource + private ContractEntrustOrderDao contractEntrustOrderDao; + @Resource + private RedisUtils redisUtils; + @Resource + private FollowOrderOperationService followOrderOperationService; public void dealOrderFromMq(List<OrderModel> list, Integer type) { if (CollectionUtils.isNotEmpty(list)) { @@ -123,6 +138,23 @@ } } + + /** + * 止盈/止损后删除全仓委托平仓单 + * + * @param orderNo + */ + private void deleteEntrustCloseOrder(String orderNo) { + // 若平掉所有张数,若存在委托平仓,则删除委托平仓记录 + List<ContractEntrustOrderEntity> entrustOrders = contractEntrustOrderDao.selectEntrustOrderByOrderNo(orderNo); + if (CollUtil.isNotEmpty(entrustOrders)) { + for (ContractEntrustOrderEntity entrustOrder : entrustOrders) { + contractEntrustOrderDao.deleteById(entrustOrder.getId()); + } + } + } + + /** * 开多止盈 */ @@ -135,28 +167,29 @@ } for (ContractHoldOrderEntity order : orderList) { Long orderId = order.getId(); - System.out.println("开多止盈订单号:" + order.getOrderNo()); - System.out.println("传来的止盈价格:" + modelMap.get(order.getId())); + log.info("开多止盈订单号:" + order.getOrderNo()); + log.info("传来的止盈价格:" + modelMap.get(order.getId())); if (null != order.getStopProfitPrice()) { BigDecimal closePrice = order.getStopProfitPrice(); BigDecimal queuePrice = modelMap.get(order.getId()); - System.out.println("订单的止盈价格:" + closePrice); + log.info("订单的止盈价格:" + closePrice); // 判断 保留七位是为了忽略以为小数 防止不精确导致的不相等 if (queuePrice.compareTo(closePrice) != 0) { // 不能止盈 - System.out.println("数据库价格:" + queuePrice.toPlainString() + "--价格不能止盈:" + closePrice); + log.info("数据库价格:" + queuePrice.toPlainString() + "--价格不能止盈:" + closePrice); //更新数据 contractHoldOrderService.updateOrderIsCanClosingAndBatchNoById(orderId); continue; } - System.out.println("执行操作"); + log.info("执行操作"); // 止盈价 String symbol = order.getSymbol(); // 本次需要退回的保证金 BigDecimal prePrice = order.getBondAmount(); Long memberId = order.getMemberId(); - MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, "USDT"); + MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeEnum.USDT.name()); + if (wallet != null) { // 历史订单 ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(order); @@ -164,7 +197,7 @@ contractOrderEntity.setId(null); // 本次平仓数量 - int currentFlat = order.getSymbolCnt(); + int currentFlat = order.getSymbolCntSale(); BigDecimal symbolSku = cacheSettingUtils.getSymbolSku(order.getSymbol()); // 盈亏额度= (当前的币种的平仓价-下单时的建仓价)*购买的手数/规格*倍率 BigDecimal profitLossPrice = (closePrice @@ -172,16 +205,19 @@ .multiply(new BigDecimal(currentFlat)) .multiply(symbolSku).setScale(8, BigDecimal.ROUND_DOWN); MemberEntity memberEntity = memberService.getById(memberId); - + MemberSettingEntity memberSettingEntity = memberSettingDao.selectMemberSettingByMemberId(memberId); + log.info("划点前:{}", profitLossPrice); + profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.subtract(memberSettingEntity.getClosingSpread().divide(BigDecimal.valueOf(100), 4, BigDecimal.ROUND_DOWN))); + log.info("划点后:{}", profitLossPrice); if (memberEntity.getIsProfit() == 1) { PlatformTradeSettingEntity tradeSetting = cacheSettingUtils.getTradeSetting(); if (profitLossPrice.compareTo(BigDecimal.ZERO) > 0) { profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.subtract(tradeSetting.getProfitParam())); } else { - profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.add(tradeSetting.getProfitParam())); +// profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.add(tradeSetting.getProfitParam())); } } - //回报率 + // 回报率 BigDecimal returnRate = profitLossPrice.divide((order.getBondAmount().subtract(contractOrderEntity.getOpeningFeeAmount())), 8, BigDecimal.ROUND_DOWN); contractOrderEntity.setRewardAmount(profitLossPrice); contractOrderEntity.setRewardRatio(returnRate); @@ -207,6 +243,12 @@ //返佣 ThreadPoolUtils.calReturnMoney(order.getMemberId(), order.getOpeningFeeAmount(), contractOrderEntity, AgentReturnEntity.ORDER_TYPE_CLOSE); + + // 全仓模式,止盈/止损 删除委托平仓 + if (ContractEntrustOrderEntity.POSITION_TYPE_ALL == order.getPositionType()) { + ThreadPoolUtils.sendWholePrice(memberId); + deleteEntrustCloseOrder(order.getOrderNo()); + } } } } @@ -217,6 +259,7 @@ /** * 开空止盈 */ + @Transactional(rollbackFor = Exception.class) public void dealForLessStopPro(List<ContractHoldOrderEntity> orderList, List<OrderModel> list) { //List<CoinsCoinsOrder> orderList = orderMapper.selectOrderByBatchNo(batchno); //System.out.println("开空止盈订单batchno:" + batchno); @@ -246,7 +289,8 @@ // 本次需要退回的预付款 BigDecimal prePrice = order.getBondAmount(); Long memberId = order.getMemberId(); - MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, "USDT"); + MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeEnum.USDT.name()); + if (wallet != null) { // 历史订单 ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(order); @@ -254,7 +298,7 @@ contractOrderEntity.setId(null); // 本次平仓数量 - int currentFlat = order.getSymbolCnt(); + int currentFlat = order.getSymbolCntSale(); BigDecimal symbolSku = cacheSettingUtils.getSymbolSku(order.getSymbol()); // 盈亏额度= (当前的币种的平仓价-下单时的建仓价)*购买的手数/规格*倍率 BigDecimal profitLossPrice = (order.getOpeningPrice() @@ -262,13 +306,16 @@ .multiply(new BigDecimal(currentFlat + "")) .multiply(symbolSku).setScale(8, BigDecimal.ROUND_DOWN); MemberEntity memberEntity = memberService.getById(memberId); - + MemberSettingEntity memberSettingEntity = memberSettingDao.selectMemberSettingByMemberId(memberId); + log.info("划点前:{}", profitLossPrice); + profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.subtract(memberSettingEntity.getClosingSpread().divide(BigDecimal.valueOf(100), 4, BigDecimal.ROUND_DOWN))); + log.info("划点后:{}", profitLossPrice); if (memberEntity.getIsProfit() == 1) { PlatformTradeSettingEntity tradeSetting = cacheSettingUtils.getTradeSetting(); if (profitLossPrice.compareTo(BigDecimal.ZERO) > 0) { profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.subtract(tradeSetting.getProfitParam())); } else { - profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.add(tradeSetting.getProfitParam())); +// profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.add(tradeSetting.getProfitParam())); } } //回报率 @@ -278,7 +325,7 @@ contractOrderEntity.setClosingFeeAmount(order.getOpeningFeeAmount()); contractOrderEntity.setClosingPrice(closePrice); contractOrderEntity.setClosingType(7); - contractOrderEntity.setOrderType(ContractOrderEntity.ORDER_TYPE_CLOSE_MORE); + contractOrderEntity.setOrderType(ContractOrderEntity.ORDER_TYPE_CLOSE_LESS); BigDecimal totalReturn = BigDecimal.ZERO; contractOrderService.save(contractOrderEntity); @@ -297,6 +344,12 @@ //返佣 ThreadPoolUtils.calReturnMoney(order.getMemberId(), order.getOpeningFeeAmount(), contractOrderEntity, AgentReturnEntity.ORDER_TYPE_CLOSE); + + // 全仓模式,止盈/止损 删除委托平仓 + if (ContractEntrustOrderEntity.POSITION_TYPE_ALL == order.getPositionType()) { + ThreadPoolUtils.sendWholePrice(memberId); + deleteEntrustCloseOrder(order.getOrderNo()); + } } } } @@ -309,6 +362,7 @@ * * @param */ + @Transactional(rollbackFor = Exception.class) public void dealForMoreLoss(List<ContractHoldOrderEntity> orderList, List<OrderModel> list) { //List<CoinsCoinsOrder> orderList = orderMapper.selectOrderByBatchNo(batchno); //System.out.println("开多止损批次号batchno:" + batchno); @@ -337,7 +391,7 @@ Long memberId = order.getMemberId(); // 本次需要退回的预付款 BigDecimal prePrice = order.getBondAmount(); - MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, "USDT"); + MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeEnum.USDT.name()); if (wallet != null) { // 历史订单 @@ -346,7 +400,7 @@ contractOrderEntity.setId(null); // 本次平仓数量 - int currentFlat = order.getSymbolCnt(); + int currentFlat = order.getSymbolCntSale(); BigDecimal symbolSku = cacheSettingUtils.getSymbolSku(order.getSymbol()); // 盈亏额度= (当前的币种的平仓价-下单时的建仓价)*购买的手数/规格*倍率 BigDecimal profitLossPrice = (closePrice @@ -360,7 +414,7 @@ if (profitLossPrice.compareTo(BigDecimal.ZERO) > 0) { profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.subtract(tradeSetting.getProfitParam())); } else { - profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.add(tradeSetting.getProfitParam())); +// profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.add(tradeSetting.getProfitParam())); } } //回报率 @@ -389,6 +443,12 @@ //返佣 ThreadPoolUtils.calReturnMoney(order.getMemberId(), order.getOpeningFeeAmount(), contractOrderEntity, AgentReturnEntity.ORDER_TYPE_CLOSE); + + // 全仓模式,止盈/止损 删除委托平仓 + if (ContractEntrustOrderEntity.POSITION_TYPE_ALL == order.getPositionType()) { + ThreadPoolUtils.sendWholePrice(memberId); + deleteEntrustCloseOrder(order.getOrderNo()); + } } } } @@ -400,6 +460,7 @@ * * @param */ + @Transactional(rollbackFor = Exception.class) public void dealForLessLoss(List<ContractHoldOrderEntity> orderList, List<OrderModel> list) { // List<CoinsCoinsOrder> orderList = orderMapper.selectOrderByBatchNo(batchno); //System.out.println("开空止损批次号batchno:" + batchno); @@ -428,7 +489,7 @@ Long memberId = order.getMemberId(); // 本次需要退回的预付款 BigDecimal prePrice = order.getBondAmount(); - MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, "USDT"); + MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeEnum.USDT.name()); if (wallet != null) { // 历史订单 @@ -437,7 +498,7 @@ contractOrderEntity.setId(null); // 本次平仓数量 - int currentFlat = order.getSymbolCnt(); + int currentFlat = order.getSymbolCntSale(); BigDecimal symbolSku = cacheSettingUtils.getSymbolSku(order.getSymbol()); // 盈亏额度= (当前的币种的平仓价-下单时的建仓价)*购买的手数/规格*倍率 BigDecimal profitLossPrice = (order.getOpeningPrice() @@ -451,7 +512,7 @@ if (profitLossPrice.compareTo(BigDecimal.ZERO) > 0) { profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.subtract(tradeSetting.getProfitParam())); } else { - profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.add(tradeSetting.getProfitParam())); +// profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.add(tradeSetting.getProfitParam())); } } //回报率 @@ -480,6 +541,12 @@ //返佣 ThreadPoolUtils.calReturnMoney(order.getMemberId(), order.getOpeningFeeAmount(), contractOrderEntity, AgentReturnEntity.ORDER_TYPE_CLOSE); + + // 全仓模式,止盈/止损 删除委托平仓 + if (ContractEntrustOrderEntity.POSITION_TYPE_ALL == order.getPositionType()) { + ThreadPoolUtils.sendWholePrice(memberId); + deleteEntrustCloseOrder(order.getOrderNo()); + } } } } @@ -509,6 +576,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; @@ -552,6 +625,7 @@ contractHoldOrderEntity.setOpeningPrice(entrustPrice); contractHoldOrderEntity.setTradeType(ContractHoldOrderEntity.TRADE_TYPE_LIMIT); contractHoldOrderEntity.setOperateNo(1); + contractHoldOrderEntity.setSymbolCntSale(contractHoldOrderEntity.getSymbolCnt()); contractHoldOrderService.save(contractHoldOrderEntity); // 需要一个历史插入 @@ -566,11 +640,11 @@ // 市价 if (coinsCoinsOrder.getEntrustType() == 1) { // 开多 - OrderModel model = new OrderModel(contractHoldOrderEntity.getId(), 6, contractHoldOrderEntity.getForceClosingPrice().setScale(8, RoundingMode.HALF_UP).toPlainString(), coinsCoinsOrder.getSymbol(), 1); + OrderModel model = new OrderModel(contractHoldOrderEntity.getId(), 6, contractHoldOrderEntity.getForceClosingPrice().setScale(8, RoundingMode.HALF_UP).toPlainString(), coinsCoinsOrder.getSymbol(), 1, coinsCoinsOrder.getMemberId()); producer.sendPriceOperate(JSONObject.toJSONString(model)); } else { // 开空 - OrderModel model = new OrderModel(contractHoldOrderEntity.getId(), 7, contractHoldOrderEntity.getForceClosingPrice().setScale(8, RoundingMode.HALF_UP).toPlainString(), coinsCoinsOrder.getSymbol(), 1); + OrderModel model = new OrderModel(contractHoldOrderEntity.getId(), 7, contractHoldOrderEntity.getForceClosingPrice().setScale(8, RoundingMode.HALF_UP).toPlainString(), coinsCoinsOrder.getSymbol(), 1, coinsCoinsOrder.getMemberId()); producer.sendPriceOperate(JSONObject.toJSONString(model)); } // 扣除手续费 @@ -584,11 +658,123 @@ } } + private void wholeEntrustOrder(ContractEntrustOrderEntity entrustOrder) { + log.info("全仓委托逻辑处理:{}", entrustOrder.getOrderNo()); + + int i = 1; + while (true) { + List<Object> types = redisUtils.lGet(AppContants.MEMBER_TYPE + entrustOrder.getMemberId(), 0, -1); + if (CollUtil.isEmpty(types)) { + break; + } + log.info("存在止盈/止损/爆仓/委托平仓,等待 -- {}", i); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + i++; + } + MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(entrustOrder.getMemberId(), CoinTypeEnum.USDT.name()); + + 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(), entrustOrder.getSymbol()); + // 判断持仓是否存在,若不存在则创建新的持仓订单 + if (wholeHoldOrder == null) { + log.info("持仓不存在"); + 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); + holdOrderEntity.setHoldBond(CalculateUtil.calMemberHoldBond(holdOrderEntity)); + + 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, openFeePrice.negate(), entrustOrder.getBondAmount().negate(), wallet.getId()); + + ThreadPoolUtils.sendWholePrice(member.getId()); + + // 发送强平价 + ThreadPoolUtils.sendWholeForceClosingPrice(entrustOrder.getSymbol(), member); + + //返佣 + ThreadPoolUtils.calReturnMoney(member.getId(), openFeePrice, contractOrderEntity, AgentReturnEntity.ORDER_TYPE_OPEN); + } + + return; + } + + log.info("持仓存在"); + 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 = entrustOrder.getBondAmount(); + // 手续费 + BigDecimal fee = CalculateUtil.getOpenFeePrice(entrustOrder.getEntrustPrice(), entrustOrder.getSymbolSku(), entrustOrder.getSymbolCnt(), tradeSettingEntity.getFeeRatio()); + // 预付款 + BigDecimal prePaymentAmount = wholeHoldOrder.getPrePaymentAmount().add(entrustOrder.getEntrustAmount()); + + wholeHoldOrder.setSymbolCnt(wholeHoldOrder.getSymbolCnt() + entrustOrder.getSymbolCnt()); + wholeHoldOrder.setSymbolCntSale(wholeHoldOrder.getSymbolCntSale() + entrustOrder.getSymbolCnt()); + wholeHoldOrder.setOpeningFeeAmount(wholeHoldOrder.getOpeningFeeAmount().add(fee)); + wholeHoldOrder.setOpeningPrice(newOpenPrice); + wholeHoldOrder.setBondAmount(wholeHoldOrder.getBondAmount().add(bondAmount)); + wholeHoldOrder.setPrePaymentAmount(prePaymentAmount); + wholeHoldOrder.setOperateNo(wholeHoldOrder.getOperateNo() + 1); + contractHoldOrderService.updateById(wholeHoldOrder); + + contractEntrustOrderService.removeById(entrustOrder.getId()); + memberWalletContractService.increaseWalletContractBalanceById(null, openFeePrice.negate(), entrustOrder.getBondAmount().negate(), wallet.getId()); + + // 发送强平价 + ThreadPoolUtils.sendWholeForceClosingPrice(entrustOrder.getSymbol(), member); + + //返佣 + ThreadPoolUtils.calReturnMoney(member.getId(), openFeePrice, contractOrderEntity, AgentReturnEntity.ORDER_TYPE_OPEN); + } + /** * 爆仓 * * @param */ + @Transactional(rollbackFor = Exception.class) public void dealCoinOut(List<ContractHoldOrderEntity> orderList, List<OrderModel> orderModels) { if (CollectionUtils.isNotEmpty(orderList)) { Map<Long, Integer> modelMap = new HashMap<Long, Integer>(); @@ -596,6 +782,11 @@ modelMap.put(model.getOrderId(), model.getOperateNo()); } for (ContractHoldOrderEntity coinsOrder : orderList) { + List<Object> types = redisUtils.lGet(AppContants.RABBIT_TYPE + coinsOrder.getId(), 0, -1); + if(types.contains(9) || types.contains(10) || types.contains(11) || types.contains(12)) { + log.info("存在止盈/止损 orderId : {}, types : {}", coinsOrder.getId(), JSONObject.toJSONString(types)); + continue; + } Long orderId = coinsOrder.getId(); Integer operateNo = coinsOrder.getOperateNo(); //判断当前订单是否是最新的爆仓价 不相等时直接进入下一个订单 @@ -604,60 +795,127 @@ contractHoldOrderService.updateOrderIsCanClosingAndBatchNoById(orderId); continue; } - boolean isDone = false; - Long memId = coinsOrder.getMemberId(); - BigDecimal nowPrice = coinsOrder.getForceClosingPrice(); - // 创建订单(加入历史表的订单) - ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(coinsOrder); - //查询是否满足爆仓条件 - if (coinsOrder.getOpeningType() == ContractHoldOrderEntity.OPENING_TYPE_MORE) { - //如果是开多,当前价小于预估强平价即为爆仓 - // 设置平仓类型 // 爆仓平多 - contractOrderEntity.setClosingType(4); - //更新用户钱包数据 - isDone = true; + // 仅逐仓有用 + if (ContractEntrustOrderEntity.POSITION_TYPE_ADD == coinsOrder.getPositionType()) { + bombOrder(coinsOrder); } else { - //如果是开空,当前价大于预估强平价即为爆仓 - contractOrderEntity.setClosingType(5); - //更新主表订单状态位为“已平仓” - isDone = true; + List<ContractHoldOrderEntity> holdOrderEntities = contractHoldOrderDao.selectHoldOrderListForWholeByMemberIdAndSymbol(coinsOrder.getMemberId(), coinsOrder.getSymbol()); + if (CollectionUtils.isNotEmpty(holdOrderEntities)) { + for (ContractHoldOrderEntity holdOrderEntity : holdOrderEntities) { + bombOrder(holdOrderEntity); + } - } - if (isDone) { - //删除次仓订单 - contractHoldOrderService.removeById(orderId); - // 订单状态转换 - if (ContractOrderEntity.ORDER_TYPE_OPEN_MORE == contractOrderEntity.getOrderType()) { - contractOrderEntity.setOrderType(ContractOrderEntity.ORDER_TYPE_CLOSE_MORE); - } else { - contractOrderEntity.setOrderType(ContractOrderEntity.ORDER_TYPE_CLOSE_LESS); + MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(coinsOrder.getMemberId(), CoinTypeEnum.USDT.name()); + + // 流水记录 TODO + MemberAccountFlowEntity record = new MemberAccountFlowEntity(); + record.setCreateTime(new Date()); + record.setSource("系统自动平仓"); + record.setRemark("系统自动平仓"); + record.setBalance(BigDecimal.ZERO); + record.setMemberId(coinsOrder.getMemberId()); + record.setSymbol(coinsOrder.getSymbol()); + record.setPrice(wallet.getTotalBalance().subtract(coinsOrder.getOpeningFeeAmount())); + memberAccountFlowEntityDao.insert(record); } - //更新主表订单状态位为“已平仓” - contractOrderEntity.setId(null); - contractOrderEntity.setClosingPrice(nowPrice); - contractOrderEntity.setClosingTime(new Date()); - contractOrderEntity.setClosingFeeAmount(coinsOrder.getOpeningFeeAmount()); - contractOrderEntity.setRewardAmount(coinsOrder.getBondAmount().subtract(contractOrderEntity.getOpeningFeeAmount()).negate()); - contractOrderService.save(contractOrderEntity); - - //更新用户钱包数据 - MemberWalletContractEntity usdt = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memId, "USDT"); - - // 减去的时候用负数 - BigDecimal totalPrice = coinsOrder.getBondAmount().negate(); - memberWalletContractService.increaseWalletContractBalanceById(null, totalPrice, null, usdt.getId()); - // 流水记录 TODO - MemberAccountFlowEntity record = new MemberAccountFlowEntity(); - record.setCreateTime(new Date()); - record.setSource("系统自动平仓"); - record.setRemark("系统自动平仓"); - record.setBalance(usdt.getAvailableBalance()); - record.setMemberId(memId); - record.setSymbol(coinsOrder.getSymbol()); - record.setPrice(coinsOrder.getBondAmount()); - memberAccountFlowEntityDao.insert(record); } + + } + } + } + + private void bombOrder(ContractHoldOrderEntity coinsOrder) { + Long orderId = coinsOrder.getId(); + boolean isDone = false; + Long memId = coinsOrder.getMemberId(); + BigDecimal nowPrice = coinsOrder.getForceClosingPrice(); + // 创建订单(加入历史表的订单) + ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(coinsOrder); + + //查询是否满足爆仓条件 + if (coinsOrder.getOpeningType() == ContractHoldOrderEntity.OPENING_TYPE_MORE) { + //如果是开多,当前价小于预估强平价即为爆仓 + // 设置平仓类型 // 爆仓平多 + contractOrderEntity.setClosingType(4); + //更新用户钱包数据 + isDone = true; + } else { + //如果是开空,当前价大于预估强平价即为爆仓 + contractOrderEntity.setClosingType(5); + //更新主表订单状态位为“已平仓” + isDone = true; + + } + if (isDone) { + //删除次仓订单 + contractHoldOrderService.removeById(orderId); + // 订单状态转换 + if (ContractOrderEntity.ORDER_TYPE_OPEN_MORE == contractOrderEntity.getOrderType()) { + contractOrderEntity.setOrderType(ContractOrderEntity.ORDER_TYPE_CLOSE_MORE); + } else { + contractOrderEntity.setOrderType(ContractOrderEntity.ORDER_TYPE_CLOSE_LESS); + } + //更新主表订单状态位为“已平仓” + contractOrderEntity.setId(null); + contractOrderEntity.setClosingPrice(nowPrice); + contractOrderEntity.setClosingTime(new Date()); + contractOrderEntity.setClosingFeeAmount(coinsOrder.getOpeningFeeAmount()); + + if (coinsOrder.getPositionType() == ContractEntrustOrderEntity.POSITION_TYPE_ADD) { + contractOrderEntity.setRewardAmount(coinsOrder.getBondAmount().subtract(contractOrderEntity.getOpeningFeeAmount()).negate()); + contractOrderService.save(contractOrderEntity); + + //更新用户钱包数据 + MemberWalletContractEntity usdt = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memId, CoinTypeEnum.USDT.name()); + + // 减去的时候用负数 + BigDecimal totalPrice = coinsOrder.getBondAmount().negate(); + memberWalletContractService.increaseWalletContractBalanceById(null, totalPrice, null, usdt.getId()); + + // 流水记录 TODO + MemberAccountFlowEntity record = new MemberAccountFlowEntity(); + record.setCreateTime(new Date()); + record.setSource("系统自动平仓"); + record.setRemark("系统自动平仓"); + record.setBalance(usdt.getAvailableBalance()); + record.setMemberId(memId); + record.setSymbol(coinsOrder.getSymbol()); + record.setPrice(coinsOrder.getBondAmount()); + memberAccountFlowEntityDao.insert(record); + + MemberEntity memberEntity = memberService.getById(memId); + // 如果订单为交易员的订单,爆仓了,则旗下的所有跟单都进行平仓 + if (ContractOrderEntity.CONTRACTTYPE_DOCUMENTARY == coinsOrder.getContractType() && MemberEntity.IS_TRADER_Y.equals(memberEntity.getIsTrader())) { + followOrderOperationService.closingFollowOrders(coinsOrder.getOrderNo()); + } + } else { + MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memId, "USDT"); + +// BigDecimal rewardRatio = BigDecimal.ZERO; +// // 开多 +// if (ContractHoldOrderEntity.OPENING_TYPE_MORE == coinsOrder.getOpeningType()) { +// // (最新价-开仓价)*规格*张数 +// rewardRatio = nowPrice.subtract(coinsOrder.getOpeningPrice()).multiply(coinsOrder.getSymbolSku()).multiply(new BigDecimal(coinsOrder.getSymbolCntSale())); +// // 开空 +// } else { +// // (开仓价-最新价)*规格*张数 +// rewardRatio = coinsOrder.getOpeningPrice().subtract(nowPrice).multiply(coinsOrder.getSymbolSku()).multiply(new BigDecimal(coinsOrder.getSymbolCntSale())); +// } + + // 委托单总委托金额 + BigDecimal totalPrePayment = BigDecimal.ZERO; + List<ContractEntrustOrderEntity> entrustOrderEntities = contractEntrustOrderDao.selectEntrustOrderListByMemberId(memId); + if (CollUtil.isNotEmpty(entrustOrderEntities)) { + for (ContractEntrustOrderEntity entrustOrderEntity : entrustOrderEntities) { + totalPrePayment = totalPrePayment.add(entrustOrderEntity.getEntrustAmount()); + } + } + + contractOrderEntity.setRewardAmount(wallet.getTotalBalance().subtract(totalPrePayment).subtract(contractOrderEntity.getOpeningFeeAmount()).negate()); + contractOrderService.save(contractOrderEntity); + + memberWalletContractService.increaseWalletContractBalanceById(wallet.getAvailableBalance().negate(), wallet.getTotalBalance().subtract(totalPrePayment).negate(), null, wallet.getId()); } } } @@ -671,11 +929,9 @@ String[] referenceIds = member.getRefererIds().split(","); List<String> ids = Arrays.asList(referenceIds); - log.info("---->{}", member.getAccountType()); if (MemberEntity.ACCOUNT_TYPE_TEST.equals(member.getAccountType())) { return; } - log.info("--->--->"); // 判断该用户是否为代理商 NeedMoneyMemberVo needMoneyMember = memberService.selectFriendRelationUserByMemberId(mid); -- Gitblit v1.9.1