| | |
| | | import com.xcong.excoin.modules.contract.entity.ContractEntrustOrderEntity; |
| | | import com.xcong.excoin.modules.contract.entity.ContractHoldOrderEntity; |
| | | import com.xcong.excoin.modules.contract.entity.ContractOrderEntity; |
| | | import com.xcong.excoin.modules.contract.mapper.ContractEntrustOrderEntityMapper; |
| | | import com.xcong.excoin.modules.contract.mapper.ContractHoldOrderEntityMapper; |
| | | import com.xcong.excoin.modules.contract.service.ContractEntrustOrderService; |
| | | import com.xcong.excoin.modules.contract.service.ContractHoldOrderService; |
| | |
| | | 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 lombok.extern.slf4j.Slf4j; |
| | | import org.apache.commons.collections.CollectionUtils; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.util.*; |
| | | |
| | | /** |
| | | * @author helius |
| | | */ |
| | | @Slf4j |
| | | @Service |
| | | public class OrderWebsocketServiceImpl { |
| | | |
| | | @Resource |
| | | ContractHoldOrderService contractHoldOrderService; |
| | | |
| | | |
| | | @Resource |
| | | ContractOrderService contractOrderService; |
| | |
| | | @Resource |
| | | ContractEntrustOrderService contractEntrustOrderService; |
| | | |
| | | |
| | | @Resource |
| | | MemberWalletContractService memberWalletContractService; |
| | | |
| | | |
| | | @Resource |
| | | CacheSettingUtils cacheSettingUtils; |
| | |
| | | private MemberAccountFlowEntityDao memberAccountFlowEntityDao; |
| | | |
| | | |
| | | |
| | | public void dealOrderFromMq(List<OrderModel> list, Integer type) { |
| | | if (CollectionUtils.isNotEmpty(list)) { |
| | | String batchno = UUID.randomUUID().toString(); |
| | |
| | | // 6在这里是爆仓 包括爆空和暴多 |
| | | switch (type) { |
| | | case 6: |
| | | this.dealCoinOut(coinsCoinsOrders,list); |
| | | this.dealCoinOut(coinsCoinsOrders, list); |
| | | break; |
| | | case 9: |
| | | this.dealForMoreStopPro(coinsCoinsOrders,list); |
| | | this.dealForMoreStopPro(coinsCoinsOrders, list); |
| | | break; |
| | | case 10: |
| | | this.dealForLessStopPro(coinsCoinsOrders,list); |
| | | this.dealForLessStopPro(coinsCoinsOrders, list); |
| | | break; |
| | | case 11: |
| | | this.dealForMoreLoss(coinsCoinsOrders,list); |
| | | this.dealForMoreLoss(coinsCoinsOrders, list); |
| | | break; |
| | | case 12: |
| | | this.dealForLessLoss(coinsCoinsOrders,list); |
| | | this.dealForLessLoss(coinsCoinsOrders, list); |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | public void dealForLimitMq(List<OrderModel> list){ |
| | | if(CollectionUtils.isNotEmpty(list)){ |
| | | public void dealForLimitMq(List<OrderModel> list) { |
| | | if (CollectionUtils.isNotEmpty(list)) { |
| | | //查询限价委托的单 |
| | | String batchno =UUID.randomUUID().toString(); |
| | | String batchno = UUID.randomUUID().toString(); |
| | | List<Long> ids = new ArrayList<>(); |
| | | list.forEach(model->ids.add(model.getOrderId())); |
| | | list.forEach(model -> ids.add(model.getOrderId())); |
| | | List<ContractEntrustOrderEntity> contractEntrustOrderEntities = contractEntrustOrderService.selectEntrustOrderListByIds(ids); |
| | | |
| | | if(CollectionUtils.isNotEmpty(contractEntrustOrderEntities)){ |
| | | if (CollectionUtils.isNotEmpty(contractEntrustOrderEntities)) { |
| | | this.dealLimitBuyOrder(contractEntrustOrderEntities); |
| | | } |
| | | |
| | |
| | | /** |
| | | * 开多止盈 |
| | | */ |
| | | public void dealForMoreStopPro(List<ContractHoldOrderEntity> orderList,List<OrderModel> list) { |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void dealForMoreStopPro(List<ContractHoldOrderEntity> orderList, List<OrderModel> list) { |
| | | if (CollectionUtils.isNotEmpty(orderList)) { |
| | | Map<Long,BigDecimal> modelMap = new HashMap<Long,BigDecimal>(); |
| | | for(OrderModel model : list){ |
| | | modelMap.put(model.getOrderId(),new BigDecimal(model.getPrice())); |
| | | Map<Long, BigDecimal> modelMap = new HashMap<Long, BigDecimal>(); |
| | | for (OrderModel model : list) { |
| | | modelMap.put(model.getOrderId(), new BigDecimal(model.getPrice())); |
| | | } |
| | | for (ContractHoldOrderEntity order : orderList) { |
| | | Long orderId = order.getId(); |
| | | System.out.println("开多止盈订单号:" + order.getOrderNo()); |
| | | System.out.println("传来的止盈价格:"+modelMap.get(order.getId())); |
| | | System.out.println("传来的止盈价格:" + modelMap.get(order.getId())); |
| | | if (null != order.getStopProfitPrice()) { |
| | | BigDecimal closePrice = order.getStopProfitPrice(); |
| | | BigDecimal queuePrice = modelMap.get(order.getId()); |
| | | System.out.println("订单的止盈价格:"+closePrice); |
| | | System.out.println("订单的止盈价格:" + closePrice); |
| | | // 判断 保留七位是为了忽略以为小数 防止不精确导致的不相等 |
| | | if(queuePrice.compareTo(closePrice)!=0){ |
| | | if (queuePrice.compareTo(closePrice) != 0) { |
| | | |
| | | // 不能止盈 |
| | | System.out.println("数据库价格:"+queuePrice.toPlainString()+"--价格不能止盈:"+closePrice); |
| | | System.out.println("数据库价格:" + queuePrice.toPlainString() + "--价格不能止盈:" + closePrice); |
| | | //更新数据 |
| | | contractHoldOrderService.updateOrderIsCanClosingAndBatchNoById(orderId); |
| | | continue; |
| | |
| | | System.out.println("执行操作"); |
| | | // 止盈价 |
| | | String symbol = order.getSymbol(); |
| | | // 本次需要退回的预付款 |
| | | BigDecimal prePrice = order.getPrePaymentAmount(); |
| | | // 本次需要退回的保证金 |
| | | BigDecimal prePrice = order.getBondAmount(); |
| | | Long memberId = order.getMemberId(); |
| | | MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, "USDT"); |
| | | if (wallet != null) { |
| | |
| | | // 盈亏额度= (当前的币种的平仓价-下单时的建仓价)*购买的手数/规格*倍率 |
| | | BigDecimal profitLossPrice = (closePrice |
| | | .subtract(order.getOpeningPrice())) |
| | | .multiply(new BigDecimal(currentFlat+"")) |
| | | .multiply(new BigDecimal(currentFlat)) |
| | | .multiply(symbolSku).setScale(8, BigDecimal.ROUND_DOWN); |
| | | MemberEntity memberEntity = memberService.getById(memberId); |
| | | |
| | | if(memberEntity.getIsProfit() == 1) { |
| | | if (memberEntity.getIsProfit() == 1) { |
| | | PlatformTradeSettingEntity tradeSetting = cacheSettingUtils.getTradeSetting(); |
| | | if(profitLossPrice.compareTo(BigDecimal.ZERO)>0) { |
| | | profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.subtract(tradeSetting.getProfitParam())); |
| | | }else { |
| | | if (profitLossPrice.compareTo(BigDecimal.ZERO) > 0) { |
| | | profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.subtract(tradeSetting.getProfitParam())); |
| | | } else { |
| | | profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.add(tradeSetting.getProfitParam())); |
| | | } |
| | | } |
| | | //回报率 |
| | | BigDecimal returnRate = profitLossPrice.divide((order.getPrePaymentAmount().subtract(contractOrderEntity.getClosingFeeAmount())), 8, BigDecimal.ROUND_DOWN); |
| | | contractOrderEntity.setRewardAmount(profitLossPrice); |
| | | BigDecimal returnRate = profitLossPrice.divide((order.getBondAmount().subtract(contractOrderEntity.getOpeningFeeAmount())), 8, BigDecimal.ROUND_DOWN); |
| | | contractOrderEntity.setRewardAmount(profitLossPrice); |
| | | contractOrderEntity.setRewardRatio(returnRate); |
| | | contractOrderEntity.setClosingFeeAmount(order.getOpeningFeeAmount()); |
| | | contractOrderEntity.setClosingPrice(closePrice); |
| | | contractOrderEntity.setClosingType(6); |
| | | contractOrderEntity.setOrderType(ContractOrderEntity.ORDER_TYPE_CLOSE_MORE); |
| | | BigDecimal totalReturn = BigDecimal.ZERO; |
| | | contractOrderService.save(contractOrderEntity); |
| | | contractOrderService.save(contractOrderEntity); |
| | | |
| | | contractHoldOrderService.removeById(order.getId()); |
| | | // 将需要退回的减去手续费 |
| | | BigDecimal needReturn = prePrice.add(profitLossPrice); |
| | | //总退回金额=保证金+收益-手续费 |
| | | totalReturn = needReturn.subtract(contractOrderEntity.getClosingFeeAmount()); |
| | | // 更新钱包 |
| | | // 总的是收益-平仓手续费 |
| | | BigDecimal totalBalance = profitLossPrice.subtract(contractOrderEntity.getClosingFeeAmount()); |
| | | memberWalletContractService.increaseWalletContractBalanceById(totalBalance,totalReturn,null,wallet.getId()); |
| | | |
| | | memberWalletContractService.increaseWalletContractBalanceById(totalReturn, totalBalance, null, wallet.getId()); |
| | | |
| | | // 流水记录 TODO 531e |
| | | insertAccountFlow(order, wallet, profitLossPrice, "止盈平仓"); |
| | | |
| | | //返佣 |
| | | calYj(order.getMemberId(), order.getOpeningFeeAmount(), contractOrderEntity, 2); |
| | | ThreadPoolUtils.calReturnMoney(order.getMemberId(), order.getOpeningFeeAmount(), contractOrderEntity, AgentReturnEntity.ORDER_TYPE_CLOSE); |
| | | } |
| | | } |
| | | } |
| | |
| | | /** |
| | | * 开空止盈 |
| | | */ |
| | | public void dealForLessStopPro(List<ContractHoldOrderEntity> orderList,List<OrderModel> list) { |
| | | public void dealForLessStopPro(List<ContractHoldOrderEntity> orderList, List<OrderModel> list) { |
| | | //List<CoinsCoinsOrder> orderList = orderMapper.selectOrderByBatchNo(batchno); |
| | | //System.out.println("开空止盈订单batchno:" + batchno); |
| | | if (CollectionUtils.isNotEmpty(orderList)) { |
| | | Map<Long,BigDecimal> modelMap = new HashMap<Long,BigDecimal>(); |
| | | for(OrderModel model : list){ |
| | | modelMap.put(model.getOrderId(),new BigDecimal(model.getPrice())); |
| | | Map<Long, BigDecimal> modelMap = new HashMap<Long, BigDecimal>(); |
| | | for (OrderModel model : list) { |
| | | modelMap.put(model.getOrderId(), new BigDecimal(model.getPrice())); |
| | | } |
| | | for (ContractHoldOrderEntity order : orderList) { |
| | | System.out.println("开空止盈订单号:" + order.getOrderNo()); |
| | | System.out.println("传来的止盈价格:"+modelMap.get(order.getId()).toPlainString()); |
| | | System.out.println("传来的止盈价格:" + modelMap.get(order.getId()).toPlainString()); |
| | | BigDecimal closePrice = order.getStopProfitPrice(); |
| | | Long orderId = order.getId(); |
| | | if (null != closePrice) { |
| | | |
| | | // 止盈价 |
| | | System.out.println("订单的止盈价格:"+closePrice); |
| | | System.out.println("订单的止盈价格:" + closePrice); |
| | | System.out.println(closePrice.compareTo(modelMap.get(order.getId()))); |
| | | BigDecimal queuePrice = modelMap.get(order.getId()).setScale(7, RoundingMode.HALF_UP); |
| | | if(closePrice.compareTo(queuePrice)!=0){ |
| | | System.out.println("数据库价格:"+queuePrice.toPlainString()+"--价格不能开空止盈:"+closePrice); |
| | | if (closePrice.compareTo(queuePrice) != 0) { |
| | | System.out.println("数据库价格:" + queuePrice.toPlainString() + "--价格不能开空止盈:" + closePrice); |
| | | contractHoldOrderService.updateOrderIsCanClosingAndBatchNoById(orderId); |
| | | continue; |
| | | } |
| | | System.out.println("执行操作"); |
| | | String symbol = order.getSymbol(); |
| | | // 本次需要退回的预付款 |
| | | BigDecimal prePrice =order.getPrePaymentAmount(); |
| | | BigDecimal prePrice = order.getBondAmount(); |
| | | Long memberId = order.getMemberId(); |
| | | MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, "USDT"); |
| | | if (wallet != null) { |
| | |
| | | // 盈亏额度= (当前的币种的平仓价-下单时的建仓价)*购买的手数/规格*倍率 |
| | | BigDecimal profitLossPrice = (order.getOpeningPrice() |
| | | .subtract(closePrice)) |
| | | .multiply(new BigDecimal(currentFlat+"")) |
| | | .multiply(new BigDecimal(currentFlat + "")) |
| | | .multiply(symbolSku).setScale(8, BigDecimal.ROUND_DOWN); |
| | | MemberEntity memberEntity = memberService.getById(memberId); |
| | | |
| | | if(memberEntity.getIsProfit() == 1) { |
| | | if (memberEntity.getIsProfit() == 1) { |
| | | PlatformTradeSettingEntity tradeSetting = cacheSettingUtils.getTradeSetting(); |
| | | if(profitLossPrice.compareTo(BigDecimal.ZERO)>0) { |
| | | if (profitLossPrice.compareTo(BigDecimal.ZERO) > 0) { |
| | | profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.subtract(tradeSetting.getProfitParam())); |
| | | }else { |
| | | } else { |
| | | profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.add(tradeSetting.getProfitParam())); |
| | | } |
| | | } |
| | | //回报率 |
| | | BigDecimal returnRate = profitLossPrice.divide((order.getPrePaymentAmount().subtract(contractOrderEntity.getClosingFeeAmount())), 8, BigDecimal.ROUND_DOWN); |
| | | BigDecimal returnRate = profitLossPrice.divide((order.getBondAmount().subtract(contractOrderEntity.getOpeningFeeAmount())), 8, BigDecimal.ROUND_DOWN); |
| | | contractOrderEntity.setRewardAmount(profitLossPrice); |
| | | contractOrderEntity.setRewardRatio(returnRate); |
| | | contractOrderEntity.setClosingFeeAmount(order.getOpeningFeeAmount()); |
| | | contractOrderEntity.setClosingPrice(closePrice); |
| | | contractOrderEntity.setClosingType(7); |
| | | contractOrderEntity.setOrderType(ContractOrderEntity.ORDER_TYPE_CLOSE_MORE); |
| | | BigDecimal totalReturn = BigDecimal.ZERO; |
| | | contractOrderService.save(contractOrderEntity); |
| | | |
| | | contractHoldOrderService.removeById(order.getId()); |
| | | // 将需要退回的减去手续费 |
| | | BigDecimal needReturn = prePrice.add(profitLossPrice); |
| | | //总退回金额=保证金+收益-手续费 |
| | |
| | | // 更新钱包 |
| | | // 总的是收益-平仓手续费 |
| | | BigDecimal totalBalance = profitLossPrice.subtract(contractOrderEntity.getClosingFeeAmount()); |
| | | memberWalletContractService.increaseWalletContractBalanceById(totalBalance,totalReturn,null,wallet.getId()); |
| | | |
| | | memberWalletContractService.increaseWalletContractBalanceById(totalReturn, totalBalance, null, wallet.getId()); |
| | | |
| | | insertAccountFlow(order, wallet, profitLossPrice, "止盈平仓"); |
| | | |
| | | //返佣 |
| | | calYj(order.getMemberId(), order.getOpeningFeeAmount(), contractOrderEntity, 2); |
| | | ThreadPoolUtils.calReturnMoney(order.getMemberId(), order.getOpeningFeeAmount(), contractOrderEntity, AgentReturnEntity.ORDER_TYPE_CLOSE); |
| | | } |
| | | } |
| | | } |
| | |
| | | * |
| | | * @param |
| | | */ |
| | | public void dealForMoreLoss(List<ContractHoldOrderEntity> orderList,List<OrderModel> list) { |
| | | public void dealForMoreLoss(List<ContractHoldOrderEntity> orderList, List<OrderModel> list) { |
| | | //List<CoinsCoinsOrder> orderList = orderMapper.selectOrderByBatchNo(batchno); |
| | | //System.out.println("开多止损批次号batchno:" + batchno); |
| | | if (CollectionUtils.isNotEmpty(orderList)) { |
| | | Map<Long,BigDecimal> modelMap = new HashMap<Long,BigDecimal>(); |
| | | for(OrderModel model : list){ |
| | | modelMap.put(model.getOrderId(),new BigDecimal(model.getPrice())); |
| | | Map<Long, BigDecimal> modelMap = new HashMap<Long, BigDecimal>(); |
| | | for (OrderModel model : list) { |
| | | modelMap.put(model.getOrderId(), new BigDecimal(model.getPrice())); |
| | | } |
| | | for (ContractHoldOrderEntity order : orderList) { |
| | | System.out.println("开多止损订单号:" + order.getOrderNo()); |
| | | Long orderId = order.getId(); |
| | | System.out.println("传来的止损价格:"+modelMap.get(orderId)); |
| | | System.out.println("传来的止损价格:" + modelMap.get(orderId)); |
| | | |
| | | if (null != order.getStopLossPrice()) { |
| | | // 止损价 |
| | | BigDecimal closePrice = order.getStopLossPrice(); |
| | | System.out.println("订单止损价格:"+closePrice.toPlainString()); |
| | | System.out.println("订单止损价格:" + closePrice.toPlainString()); |
| | | BigDecimal queuePrice = modelMap.get(orderId); |
| | | if(closePrice.compareTo(queuePrice)!=0){ |
| | | System.out.println("数据库价格:"+queuePrice.toPlainString()+"--价格不能开多止损:"+closePrice); |
| | | if (closePrice.compareTo(queuePrice) != 0) { |
| | | System.out.println("数据库价格:" + queuePrice.toPlainString() + "--价格不能开多止损:" + closePrice); |
| | | contractHoldOrderService.updateOrderIsCanClosingAndBatchNoById(orderId); |
| | | continue; |
| | | } |
| | |
| | | String symbol = order.getSymbol(); |
| | | Long memberId = order.getMemberId(); |
| | | // 本次需要退回的预付款 |
| | | BigDecimal prePrice =order.getPrePaymentAmount(); |
| | | BigDecimal prePrice = order.getBondAmount(); |
| | | MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, "USDT"); |
| | | |
| | | if (wallet != null) { |
| | |
| | | // 盈亏额度= (当前的币种的平仓价-下单时的建仓价)*购买的手数/规格*倍率 |
| | | BigDecimal profitLossPrice = (closePrice |
| | | .subtract(order.getOpeningPrice())) |
| | | .multiply(new BigDecimal(currentFlat+"")) |
| | | .multiply(new BigDecimal(currentFlat + "")) |
| | | .multiply(symbolSku).setScale(8, BigDecimal.ROUND_DOWN); |
| | | MemberEntity memberEntity = memberService.getById(memberId); |
| | | |
| | | if(memberEntity.getIsProfit() == 1) { |
| | | if (memberEntity.getIsProfit() == 1) { |
| | | PlatformTradeSettingEntity tradeSetting = cacheSettingUtils.getTradeSetting(); |
| | | if(profitLossPrice.compareTo(BigDecimal.ZERO)>0) { |
| | | if (profitLossPrice.compareTo(BigDecimal.ZERO) > 0) { |
| | | profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.subtract(tradeSetting.getProfitParam())); |
| | | }else { |
| | | } else { |
| | | profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.add(tradeSetting.getProfitParam())); |
| | | } |
| | | } |
| | | //回报率 |
| | | BigDecimal returnRate = profitLossPrice.divide((order.getPrePaymentAmount().subtract(contractOrderEntity.getClosingFeeAmount())), 8, BigDecimal.ROUND_DOWN); |
| | | BigDecimal returnRate = profitLossPrice.divide((order.getBondAmount().subtract(contractOrderEntity.getOpeningFeeAmount())), 8, BigDecimal.ROUND_DOWN); |
| | | contractOrderEntity.setRewardAmount(profitLossPrice); |
| | | contractOrderEntity.setRewardRatio(returnRate); |
| | | contractOrderEntity.setClosingFeeAmount(order.getOpeningFeeAmount()); |
| | | contractOrderEntity.setClosingPrice(closePrice); |
| | | contractOrderEntity.setOrderType(ContractOrderEntity.ORDER_TYPE_CLOSE_MORE); |
| | | contractOrderEntity.setClosingType(8); |
| | | BigDecimal totalReturn = BigDecimal.ZERO; |
| | | contractOrderService.save(contractOrderEntity); |
| | | |
| | | contractHoldOrderService.removeById(order.getId()); |
| | | // 将需要退回的减去手续费 |
| | | BigDecimal needReturn = prePrice.add(profitLossPrice); |
| | | //总退回金额=保证金+收益-手续费 |
| | |
| | | // 更新钱包 |
| | | // 总的是收益-平仓手续费 |
| | | BigDecimal totalBalance = profitLossPrice.subtract(contractOrderEntity.getClosingFeeAmount()); |
| | | memberWalletContractService.increaseWalletContractBalanceById(totalBalance,totalReturn,null,wallet.getId()); |
| | | |
| | | memberWalletContractService.increaseWalletContractBalanceById(totalReturn, totalBalance, null, wallet.getId()); |
| | | |
| | | insertAccountFlow(order, wallet, profitLossPrice, "开多止损平仓"); |
| | | |
| | | //返佣 |
| | | calYj(order.getMemberId(), order.getOpeningFeeAmount(), contractOrderEntity, 2); |
| | | ThreadPoolUtils.calReturnMoney(order.getMemberId(), order.getOpeningFeeAmount(), contractOrderEntity, AgentReturnEntity.ORDER_TYPE_CLOSE); |
| | | } |
| | | } |
| | | } |
| | |
| | | * |
| | | * @param |
| | | */ |
| | | public void dealForLessLoss(List<ContractHoldOrderEntity> orderList,List<OrderModel> list) { |
| | | public void dealForLessLoss(List<ContractHoldOrderEntity> orderList, List<OrderModel> list) { |
| | | // List<CoinsCoinsOrder> orderList = orderMapper.selectOrderByBatchNo(batchno); |
| | | //System.out.println("开空止损批次号batchno:" + batchno); |
| | | if (CollectionUtils.isNotEmpty(orderList)) { |
| | | Map<Long,BigDecimal> modelMap = new HashMap<Long,BigDecimal>(); |
| | | for(OrderModel model : list){ |
| | | modelMap.put(model.getOrderId(),new BigDecimal(model.getPrice())); |
| | | Map<Long, BigDecimal> modelMap = new HashMap<Long, BigDecimal>(); |
| | | for (OrderModel model : list) { |
| | | modelMap.put(model.getOrderId(), new BigDecimal(model.getPrice())); |
| | | } |
| | | for (ContractHoldOrderEntity order : orderList) { |
| | | Long orderId = order.getId(); |
| | | System.out.println("传来的止损价格:"+modelMap.get(orderId).toPlainString()); |
| | | System.out.println("传来的止损价格:" + modelMap.get(orderId).toPlainString()); |
| | | System.out.println("开空止损订单号:" + order.getOrderNo()); |
| | | if (null != order.getStopLossPrice()) { |
| | | // 止损价 |
| | | BigDecimal closePrice = order.getStopLossPrice(); |
| | | |
| | | System.out.println("订单止损价格:"+closePrice.toPlainString()); |
| | | System.out.println("订单止损价格:" + closePrice.toPlainString()); |
| | | BigDecimal queuePrice = modelMap.get(orderId); |
| | | if(closePrice.compareTo(queuePrice)!=0){ |
| | | System.out.println("数据库价格:"+queuePrice.toPlainString()+"--价格不能开空止损:"+closePrice); |
| | | if (closePrice.compareTo(queuePrice) != 0) { |
| | | System.out.println("数据库价格:" + queuePrice.toPlainString() + "--价格不能开空止损:" + closePrice); |
| | | contractHoldOrderService.updateOrderIsCanClosingAndBatchNoById(orderId); |
| | | continue; |
| | | } |
| | |
| | | String symbol = order.getSymbol(); |
| | | Long memberId = order.getMemberId(); |
| | | // 本次需要退回的预付款 |
| | | BigDecimal prePrice =order.getPrePaymentAmount(); |
| | | BigDecimal prePrice = order.getBondAmount(); |
| | | MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, "USDT"); |
| | | |
| | | if (wallet != null) { |
| | |
| | | // 盈亏额度= (当前的币种的平仓价-下单时的建仓价)*购买的手数/规格*倍率 |
| | | BigDecimal profitLossPrice = (order.getOpeningPrice() |
| | | .subtract(closePrice)) |
| | | .multiply(new BigDecimal(currentFlat+"")) |
| | | .multiply(new BigDecimal(currentFlat + "")) |
| | | .multiply(symbolSku).setScale(8, BigDecimal.ROUND_DOWN); |
| | | MemberEntity memberEntity = memberService.getById(memberId); |
| | | |
| | | if(memberEntity.getIsProfit() == 1) { |
| | | if (memberEntity.getIsProfit() == 1) { |
| | | PlatformTradeSettingEntity tradeSetting = cacheSettingUtils.getTradeSetting(); |
| | | if(profitLossPrice.compareTo(BigDecimal.ZERO)>0) { |
| | | if (profitLossPrice.compareTo(BigDecimal.ZERO) > 0) { |
| | | profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.subtract(tradeSetting.getProfitParam())); |
| | | }else { |
| | | } else { |
| | | profitLossPrice = profitLossPrice.multiply(BigDecimal.ONE.add(tradeSetting.getProfitParam())); |
| | | } |
| | | } |
| | | //回报率 |
| | | BigDecimal returnRate = profitLossPrice.divide((order.getPrePaymentAmount().subtract(contractOrderEntity.getClosingFeeAmount())), 8, BigDecimal.ROUND_DOWN); |
| | | BigDecimal returnRate = profitLossPrice.divide((order.getBondAmount().subtract(contractOrderEntity.getOpeningFeeAmount())), 8, BigDecimal.ROUND_DOWN); |
| | | contractOrderEntity.setRewardAmount(profitLossPrice); |
| | | contractOrderEntity.setRewardRatio(returnRate); |
| | | contractOrderEntity.setClosingFeeAmount(order.getOpeningFeeAmount()); |
| | | contractOrderEntity.setClosingPrice(closePrice); |
| | | contractOrderEntity.setClosingType(9); |
| | | contractOrderEntity.setOrderType(ContractOrderEntity.ORDER_TYPE_CLOSE_LESS); |
| | | BigDecimal totalReturn = BigDecimal.ZERO; |
| | | contractOrderService.save(contractOrderEntity); |
| | | |
| | | contractHoldOrderService.removeById(order.getId()); |
| | | |
| | | // 将需要退回的减去手续费 |
| | | BigDecimal needReturn = prePrice.add(profitLossPrice); |
| | | //总退回金额=保证金+收益-手续费 |
| | |
| | | // 更新钱包 |
| | | // 总的是收益-平仓手续费 |
| | | BigDecimal totalBalance = profitLossPrice.subtract(contractOrderEntity.getClosingFeeAmount()); |
| | | memberWalletContractService.increaseWalletContractBalanceById(totalBalance,totalReturn,null,wallet.getId()); |
| | | memberWalletContractService.increaseWalletContractBalanceById(totalReturn, totalBalance, null, wallet.getId()); |
| | | |
| | | insertAccountFlow(order, wallet, profitLossPrice, "开空止损平仓"); |
| | | |
| | | //返佣 |
| | | calYj(order.getMemberId(), order.getOpeningFeeAmount(), contractOrderEntity, 2); |
| | | |
| | | ThreadPoolUtils.calReturnMoney(order.getMemberId(), order.getOpeningFeeAmount(), contractOrderEntity, AgentReturnEntity.ORDER_TYPE_CLOSE); |
| | | } |
| | | } |
| | | } |
| | |
| | | * @param |
| | | */ |
| | | public void dealLimitBuyOrder(List<ContractEntrustOrderEntity> orderList) { |
| | | |
| | | //List<CoinsCoinsOrder> orderList = orderMapper.selectOrderByBatchNo(batchno); |
| | | if (CollectionUtils.isNotEmpty(orderList)) { |
| | | ContractHoldOrderEntity contractHoldOrderEntity=null; |
| | | ContractHoldOrderEntity contractHoldOrderEntity = null; |
| | | for (ContractEntrustOrderEntity coinsCoinsOrder : orderList) { |
| | | MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(coinsCoinsOrder.getMemberId(), "USDT"); |
| | | if (wallet == null) { |
| | | continue; |
| | | } |
| | | |
| | | contractHoldOrderEntity = new ContractHoldOrderEntity(); |
| | | // 委托单bean转换为持仓单bean |
| | | contractHoldOrderEntity = ContractEntrustOrderEntityMapper.INSTANCE.entrustOrderToHoldOrder(coinsCoinsOrder); |
| | | contractHoldOrderEntity.setId(null); |
| | | Long memId = coinsCoinsOrder.getMemberId(); |
| | | MemberEntity memberEntity = memberService.getById(memId); |
| | | BigDecimal entrustPrice = coinsCoinsOrder.getEntrustPrice(); |
| | | int symbolCnt = coinsCoinsOrder.getSymbolCnt(); |
| | | int type = coinsCoinsOrder.getEntrustType(); |
| | | //开仓价 |
| | | // Double openPrice = coinsCoinsOrder.getOpenPrice().doubleValue(); |
| | | //委托价 |
| | | // Double markPrice = coinsCoinsOrder.getMarkPrice(); |
| | | |
| | | if (type == 1) { |
| | | // 开多 |
| | | contractHoldOrderEntity.setOpeningType(ContractHoldOrderEntity.OPENING_TYPE_MORE); |
| | | } else { |
| | | // 开空 |
| | | contractHoldOrderEntity.setOpeningType(ContractHoldOrderEntity.OPENING_TYPE_LESS); |
| | | |
| | | } |
| | | |
| | | //持仓单赋值 |
| | |
| | | .setScale(8, BigDecimal.ROUND_DOWN); |
| | | contractHoldOrderEntity.setOpeningFeeAmount(openFeePrice); |
| | | contractHoldOrderEntity.setVersion(1); |
| | | BigDecimal forceSetPrice = CalculateUtil.getForceSetPrice(coinsCoinsOrder.getBondAmount(), entrustPrice, symbolCnt, lotNumber, type, memberEntity); |
| | | BigDecimal forceSetPrice = CalculateUtil.getForceSetPrice(coinsCoinsOrder.getBondAmount().subtract(openFeePrice), entrustPrice, symbolCnt, lotNumber, type, memberEntity); |
| | | |
| | | contractHoldOrderEntity.setForceClosingPrice(forceSetPrice); |
| | | contractHoldOrderEntity.setLeverRatio(coinsCoinsOrder.getLeverRatio()); |
| | | contractHoldOrderEntity.setOpeningPrice(entrustPrice); |
| | | contractHoldOrderEntity.setTradeType(ContractHoldOrderEntity.TRADE_TYPE_LIMIT); |
| | | contractHoldOrderService.save(contractHoldOrderEntity); |
| | | |
| | | // 需要一个历史插入 |
| | | ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(contractHoldOrderEntity); |
| | | contractOrderEntity.setEntrustOpeningPrice(coinsCoinsOrder.getEntrustPrice()); |
| | | contractOrderEntity.setEntrustTime(coinsCoinsOrder.getCreateTime()); |
| | | contractOrderEntity.setOpeningTime(new Date()); |
| | | |
| | | contractOrderEntity.setId(null); |
| | | contractOrderService.save(contractOrderEntity); |
| | | // 发送爆仓的队列 |
| | | // 市价 |
| | | if (coinsCoinsOrder.getEntrustType() == 1) { |
| | | // 开多 |
| | | OrderModel model = new OrderModel(contractHoldOrderEntity.getId(), 6, contractHoldOrderEntity.getForceClosingPrice().toPlainString(), coinsCoinsOrder.getSymbol(),1); |
| | | OrderModel model = new OrderModel(contractHoldOrderEntity.getId(), 6, contractHoldOrderEntity.getForceClosingPrice().setScale(8, RoundingMode.HALF_UP).toPlainString(), coinsCoinsOrder.getSymbol(), 1); |
| | | producer.sendPriceOperate(JSONObject.toJSONString(model)); |
| | | } else { |
| | | // 开空 |
| | | OrderModel model = new OrderModel(contractHoldOrderEntity.getId(), 7, contractHoldOrderEntity.getForceClosingPrice().toPlainString(), coinsCoinsOrder.getSymbol(),1); |
| | | OrderModel model = new OrderModel(contractHoldOrderEntity.getId(), 7, contractHoldOrderEntity.getForceClosingPrice().setScale(8, RoundingMode.HALF_UP).toPlainString(), coinsCoinsOrder.getSymbol(), 1); |
| | | producer.sendPriceOperate(JSONObject.toJSONString(model)); |
| | | } |
| | | // 扣除手续费 |
| | | //double totalBalance = wallet.getTotalBalance() - coinsCoinsOrder.getClosingPrice(); |
| | | BigDecimal totalBalance = openFeePrice.negate(); |
| | | BigDecimal totalBalance = openFeePrice.negate(); |
| | | contractEntrustOrderService.removeById(coinsCoinsOrder.getId()); |
| | | memberWalletContractService.increaseWalletContractBalanceById(null, totalBalance, coinsCoinsOrder.getBondAmount().negate(), wallet.getId()); |
| | | |
| | | /** TradeSetting tradeSetting = tradeSettingCache.getTradeSetting(); |
| | | |
| | | Double totalPayPrice = new BigDecimal(coinsCoinsOrder.getPrePrice()).add(new BigDecimal(coinsCoinsOrder.getClosingPrice())).add(new BigDecimal(coinsCoinsOrder.getClosingPrice())) |
| | | .setScale(8, BigDecimal.ROUND_HALF_UP).doubleValue(); |
| | | totalBalance = totalBalance+(-totalPayPrice*(Double.valueOf(tradeSetting.getSpread())/10000));*/ |
| | | |
| | | memberWalletContractService.increaseWalletContractBalanceById(null,totalBalance,null,wallet.getId()); |
| | | // TODO 531 待写 |
| | | calYj(memId, contractOrderEntity.getClosingFeeAmount(), contractOrderEntity, 1); |
| | | //返佣 |
| | | ThreadPoolUtils.calReturnMoney(memberEntity.getId(), openFeePrice, contractOrderEntity, AgentReturnEntity.ORDER_TYPE_OPEN); |
| | | } |
| | | } |
| | | } |
| | |
| | | * |
| | | * @param |
| | | */ |
| | | public void dealCoinOut(List<ContractHoldOrderEntity> orderList,List<OrderModel> orderModels) { |
| | | // 需要比较查询到的和消息发来的单的爆仓操作次序号是否相同 |
| | | // 构建map |
| | | |
| | | public void dealCoinOut(List<ContractHoldOrderEntity> orderList, List<OrderModel> orderModels) { |
| | | if (CollectionUtils.isNotEmpty(orderList)) { |
| | | Map<Long,Integer> modelMap = new HashMap<Long,Integer>(); |
| | | for(OrderModel model : orderModels){ |
| | | modelMap.put(model.getOrderId(),model.getOperateNo()); |
| | | Map<Long, Integer> modelMap = new HashMap<Long, Integer>(); |
| | | for (OrderModel model : orderModels) { |
| | | modelMap.put(model.getOrderId(), model.getOperateNo()); |
| | | } |
| | | // TradeSetting tradeSetting = tradeMapper.findTradeSetting(); |
| | | for (ContractHoldOrderEntity coinsOrder : orderList) { |
| | | Long orderId = coinsOrder.getId(); |
| | | Integer operateNo = coinsOrder.getOperateNo(); |
| | | //判断当前订单是否是最新的爆仓价 不相等时直接进入下一个订单 |
| | | if(!modelMap.get(orderId).equals(operateNo)){ |
| | | if (!modelMap.get(orderId).equals(operateNo)) { |
| | | // 将订单更新为可平仓并删除批次号 |
| | | contractHoldOrderService.updateOrderIsCanClosingAndBatchNoById(orderId); |
| | | continue; |
| | | } |
| | | boolean isDone = false; |
| | | Long memId = coinsOrder.getMemberId(); |
| | | MemberEntity byId = memberService.getById(memId); |
| | | String symbol = coinsOrder.getSymbol(); |
| | | //TradeSymbolSku symbolSku = tradeMapper.findSymbolSkubySymbol(symbol); |
| | | BigDecimal nowPrice = coinsOrder.getForceClosingPrice(); |
| | | // 创建订单(加入历史表的订单) |
| | | ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(coinsOrder); |
| | |
| | | if (isDone) { |
| | | //删除次仓订单 |
| | | contractHoldOrderService.removeById(orderId); |
| | | |
| | | //系统自动平仓(爆仓) |
| | | // Double closingPrice = nowPrice |
| | | // .multiply(new BigDecimal(tradeSetting.getClosingRatio()).divide(new BigDecimal(100), 8, BigDecimal.ROUND_DOWN)) |
| | | // .multiply(symbolSku.getLotNumber())// 规格 |
| | | // .multiply(new BigDecimal(coinsOrder.getSymbolSkuNumber())) |
| | | // .setScale(8, BigDecimal.ROUND_DOWN).doubleValue(); |
| | | // 订单状态转换 |
| | | 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(BigDecimal.ZERO); |
| | | //order.setPayTotalPrice(coinsOrder.getPrePrice()+coinsOrder.getClosingPrice());// 总支付金额(预付款) |
| | | |
| | | contractOrderEntity.setClosingPrice(nowPrice); |
| | | contractOrderEntity.setClosingTime(new Date()); |
| | | contractOrderEntity.setRewardAmount((coinsOrder.getOpeningFeeAmount().multiply(new BigDecimal("2")).subtract(coinsOrder.getPrePaymentAmount()))); |
| | | //order.setRewardRatio(-(coinsOrder.getPrePrice() - (2*coinsOrder.getClosingPrice()))); |
| | | contractOrderEntity.setClosingFeeAmount(coinsOrder.getOpeningFeeAmount()); |
| | | contractOrderEntity.setRewardAmount(coinsOrder.getBondAmount().subtract(contractOrderEntity.getOpeningFeeAmount()).negate()); |
| | | contractOrderService.save(contractOrderEntity); |
| | | |
| | | //更新用户钱包数据 |
| | | MemberWalletContractEntity usdt = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memId, "USDT"); |
| | | |
| | | // Double totalPrice = wallet.getTotalBalance() - coinsOrder.getPrePrice(); |
| | | // 减去的时候用负数 |
| | | BigDecimal totalPrice = coinsOrder.getPrePaymentAmount().negate(); |
| | | //Double totalPrice = - coinsOrder.getPrePrice(); |
| | | memberWalletContractService.increaseWalletContractBalanceById(null,totalPrice,null,usdt.getId()); |
| | | BigDecimal totalPrice = coinsOrder.getBondAmount().negate(); |
| | | memberWalletContractService.increaseWalletContractBalanceById(null, totalPrice, null, usdt.getId()); |
| | | // 流水记录 TODO |
| | | MemberAccountFlowEntity record = new MemberAccountFlowEntity(); |
| | | record.setCreateTime(new Date()); |
| | |
| | | record.setBalance(usdt.getAvailableBalance()); |
| | | record.setMemberId(memId); |
| | | record.setSymbol(coinsOrder.getSymbol()); |
| | | record.setPrice(coinsOrder.getPrePaymentAmount()); |
| | | record.setPrice(coinsOrder.getBondAmount()); |
| | | memberAccountFlowEntityDao.insert(record); |
| | | |
| | | |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | public void calYj(Long mid, BigDecimal money, ContractOrderEntity order, int type) { |
| | | if(money!=null) { |
| | | money = money.multiply(new BigDecimal(0.7868)); |
| | | } |
| | | if (money != null) { |
| | | money = money.multiply(new BigDecimal(0.7868)); |
| | | } |
| | | MemberEntity member = memberService.getById(mid); |
| | | String[] referenceIds = member.getRefererIds().split(","); |
| | | List<String> ids = Arrays.asList(referenceIds); |
| | |
| | | if (type == 1) {//开仓 |
| | | agent.setOpeningFeeAmount(order.getOpeningFeeAmount()); |
| | | } else if (type == 2) {//平仓 |
| | | agent.setClosingFeeAmount(order.getOpeningFeeAmount()); |
| | | agent.setClosingFeeAmount(order.getClosingFeeAmount()); |
| | | } else {//持仓费 |
| | | agent.setHoldingFeeAmount(order.getHoldAmount()); |
| | | } |
| | | agent.setInviteId(entry.getKey()); |
| | | agentReturnDao.insert(agent); |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | } |