| | |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.huobi.client.model.Candlestick; |
| | | import com.xcong.excoin.common.LoginUserUtils; |
| | | import com.xcong.excoin.common.contants.AppContants; |
| | | import com.xcong.excoin.common.enumerates.CoinTypeEnum; |
| | |
| | | import com.xcong.excoin.modules.contract.parameter.vo.*; |
| | | import com.xcong.excoin.modules.contract.service.ContractHoldOrderService; |
| | | import com.xcong.excoin.modules.documentary.dao.FollowFollowerOrderRelationDao; |
| | | import com.xcong.excoin.modules.documentary.dao.FollowFollowerProfitDao; |
| | | import com.xcong.excoin.modules.documentary.dao.FollowTraderInfoDao; |
| | | import com.xcong.excoin.modules.documentary.entity.FollowFollowerOrderRelationEntity; |
| | | import com.xcong.excoin.modules.documentary.entity.FollowFollowerProfitEntity; |
| | | import com.xcong.excoin.modules.documentary.entity.FollowTraderInfoEntity; |
| | | import com.xcong.excoin.modules.member.dao.MemberDao; |
| | | import com.xcong.excoin.modules.member.dao.MemberLevelRateDao; |
| | |
| | | |
| | | @Resource |
| | | private MemberDao memberDao; |
| | | |
| | | @Resource |
| | | private MemberSettingDao memberSettingDao; |
| | | |
| | | @Resource |
| | | private FollowFollowerProfitDao followFollowerProfitDao; |
| | | |
| | | @Resource |
| | | private FollowTraderInfoDao followTraderInfoDao; |
| | |
| | | log.info("全仓逻辑"); |
| | | // 获取最新价 |
| | | BigDecimal newPrice = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey(submitOrderDto.getSymbol()))); |
| | | MemberWalletContractEntity walletContract = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberEntity.getId(), CoinTypeConvert.convertContractTypeToCoin(submitOrderDto.getSymbol())); |
| | | MemberWalletContractEntity walletContract = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberEntity.getId(), CoinTypeEnum.USDT.name()); |
| | | PlatformTradeSettingEntity tradeSettingEntity = cacheSettingUtils.getTradeSetting(); |
| | | |
| | | MemberSettingEntity memberSetting = memberSettingDao.selectMemberSettingByMemberId(memberEntity.getId()); |
| | |
| | | BigDecimal openFeePrice = CalculateUtil.getOpenFeePrice(openingPrice, lotNumber, submitOrderDto.getSymbolCnt(), tradeSettingEntity.getFeeRatio()); |
| | | log.info("开仓手续费:{}", openFeePrice); |
| | | |
| | | ContractHoldOrderEntity wholeHoldOrder = contractHoldOrderDao.selectWholeHoldOrderByOrderType(memberEntity.getId(), submitOrderDto.getOrderType(), submitOrderDto.getSymbol()); |
| | | // 判断当前是否存在全仓订单,若存在则直接合并,若不存在则创建订单 |
| | | if (wholeHoldOrder != null) { |
| | | BigDecimal totalPrice = openingPrice.multiply(BigDecimal.valueOf(submitOrderDto.getSymbolCnt())); |
| | | // (当前开仓价*张数 + 原开仓价 * 原可平张数) / (张数 + 原可平张数) |
| | | BigDecimal newOpenPrice = totalPrice.add(wholeHoldOrder.getOpeningPrice().multiply(BigDecimal.valueOf(wholeHoldOrder.getSymbolCnt()))).divide(BigDecimal.valueOf(submitOrderDto.getSymbolCnt() + wholeHoldOrder.getSymbolCntSale()), 8, BigDecimal.ROUND_DOWN); |
| | | log.info("计算后开仓价:{}", newOpenPrice); |
| | | BigDecimal bondAmount = CalculateUtil.getBondAmount(newOpenPrice, lotNumber, submitOrderDto.getSymbolCnt() + wholeHoldOrder.getSymbolCntSale(), submitOrderDto.getLeverRatio()); |
| | | log.info("新保证金:{}", bondAmount); |
| | | BigDecimal fee = openFeePrice.add(wholeHoldOrder.getOpeningFeeAmount()); |
| | | log.info("手续费相加:{}", fee); |
| | | BigDecimal prePaymentAmount = bondAmount.add(fee).add(fee); |
| | | |
| | | BigDecimal subBondAmount = bondAmount.subtract(wholeHoldOrder.getBondAmount()).subtract(wholeHoldOrder.getOpeningFeeAmount()); |
| | | log.info("保证金差值:{}", subBondAmount); |
| | | |
| | | if (subBondAmount.compareTo(walletContract.getAvailableBalance()) > -1) { |
| | | // 可用余额不足 |
| | | return Result.fail(MessageSourceUtils.getString("member_service_0085")); |
| | | } |
| | | |
| | | |
| | | // BigDecimal forceClosingPrice = CalculateUtil.getForceSetPriceForWhole(submitOrderDto.getSymbol(), memberEntity); |
| | | // log.info("新预估强平价:{}", forceClosingPrice); |
| | | |
| | | ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(wholeHoldOrder); |
| | | contractOrderEntity.setBondAmount(subBondAmount.add(openFeePrice)); |
| | | // contractOrderEntity.setForceClosingPrice(forceClosingPrice); |
| | | contractOrderEntity.setOpeningPrice(newOpenPrice); |
| | | contractOrderEntity.setSymbolCnt(submitOrderDto.getSymbolCnt()); |
| | | contractOrderEntity.setOpeningTime(new Date()); |
| | | contractOrderEntity.setMarkPrice(newPrice); |
| | | contractOrderEntity.setOpeningFeeAmount(openFeePrice); |
| | | contractOrderDao.insert(contractOrderEntity); |
| | | |
| | | wholeHoldOrder.setOpeningFeeAmount(fee); |
| | | wholeHoldOrder.setOpeningPrice(newOpenPrice); |
| | | wholeHoldOrder.setBondAmount(bondAmount.add(fee)); |
| | | wholeHoldOrder.setSymbolCnt(wholeHoldOrder.getSymbolCnt() + submitOrderDto.getSymbolCnt()); |
| | | wholeHoldOrder.setSymbolCntSale(wholeHoldOrder.getSymbolCntSale() + submitOrderDto.getSymbolCnt()); |
| | | // wholeHoldOrder.setForceClosingPrice(forceClosingPrice); |
| | | wholeHoldOrder.setPrePaymentAmount(prePaymentAmount); |
| | | wholeHoldOrder.setOperateNo(wholeHoldOrder.getOperateNo() + 1); |
| | | int i = contractHoldOrderDao.updateById(wholeHoldOrder); |
| | | if (i > 0) { |
| | | BigDecimal total = subBondAmount.add(openFeePrice).add(openFeePrice); |
| | | memberWalletContractDao.increaseWalletContractBalanceById(total.negate(), openFeePrice.negate(), null, walletContract.getId()); |
| | | |
| | | // 发送爆仓消息 |
| | | // sendOrderBombMsg(wholeHoldOrder.getId(), wholeHoldOrder.getOpeningType(), forceClosingPrice, wholeHoldOrder.getSymbol(), wholeHoldOrder.getOperateNo()); |
| | | // 发送预估强平价 |
| | | ThreadPoolUtils.sendWholeForceClosingPrice(submitOrderDto.getSymbol(), memberEntity); |
| | | // 计算佣金 |
| | | ThreadPoolUtils.calReturnMoney(memberEntity.getId(), openFeePrice, contractOrderEntity, AgentReturnEntity.ORDER_TYPE_OPEN); |
| | | |
| | | // 插入财务流水 |
| | | if (submitOrderDto.getOrderType() == ContractHoldOrderEntity.OPENING_TYPE_MORE) { |
| | | LogRecordUtils.insertMemberAccountFlow(memberEntity.getId(), prePaymentAmount, walletContract.getAvailableBalance().subtract(prePaymentAmount), submitOrderDto.getSymbol(), "买涨持仓", "买涨:" + submitOrderDto.getSymbol()); |
| | | } else { |
| | | LogRecordUtils.insertMemberAccountFlow(memberEntity.getId(), prePaymentAmount, walletContract.getAvailableBalance().subtract(prePaymentAmount), submitOrderDto.getSymbol(), "买跌持仓", "买跌:" + submitOrderDto.getSymbol()); |
| | | } |
| | | |
| | | // 提交成功 |
| | | return Result.ok(MessageSourceUtils.getString("member_service_0024")); |
| | | } |
| | | // 提交失败 |
| | | return Result.fail(MessageSourceUtils.getString("member_service_0067")); |
| | | } |
| | | |
| | | // 保证金 建仓价*规格*手数*(1/杠杆倍率) |
| | | BigDecimal bondAmount = CalculateUtil.getBondAmount(openingPrice, lotNumber, submitOrderDto.getSymbolCnt(), submitOrderDto.getLeverRatio()); |
| | | log.info("保证金:{}", bondAmount); |
| | |
| | | return Result.fail(MessageSourceUtils.getString("member_service_0085")); |
| | | } |
| | | |
| | | // 预估强平价 |
| | | // BigDecimal forceClosingPrice = CalculateUtil.getForceSetPriceForWhole(submitOrderDto.getSymbol(), memberEntity); |
| | | ContractHoldOrderEntity wholeHoldOrder = contractHoldOrderDao.selectWholeHoldOrderByOrderType(memberEntity.getId(), submitOrderDto.getOrderType(), submitOrderDto.getSymbol()); |
| | | // 判断当前是否存在全仓订单,若存在则直接合并,若不存在则创建订单 |
| | | if (wholeHoldOrder != null) { |
| | | BigDecimal totalPrice = openingPrice.multiply(BigDecimal.valueOf(submitOrderDto.getSymbolCnt())); |
| | | // (当前开仓价*张数 + 原开仓价 * 原可平张数) / (张数 + 原可平张数) |
| | | BigDecimal newOpenPrice = totalPrice.add(wholeHoldOrder.getOpeningPrice().multiply(BigDecimal.valueOf(wholeHoldOrder.getSymbolCntSale()))).divide(BigDecimal.valueOf(submitOrderDto.getSymbolCnt() + wholeHoldOrder.getSymbolCntSale()), 8, BigDecimal.ROUND_DOWN); |
| | | log.info("计算后开仓价:{}", newOpenPrice); |
| | | BigDecimal fee = openFeePrice.add(wholeHoldOrder.getOpeningFeeAmount()); |
| | | log.info("手续费相加:{}", fee); |
| | | |
| | | ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(wholeHoldOrder); |
| | | contractOrderEntity.setBondAmount(bondAmount.add(openFeePrice)); |
| | | contractOrderEntity.setOpeningPrice(openingPrice); |
| | | contractOrderEntity.setSymbolCnt(submitOrderDto.getSymbolCnt()); |
| | | contractOrderEntity.setOpeningTime(new Date()); |
| | | contractOrderEntity.setMarkPrice(newPrice); |
| | | contractOrderEntity.setOpeningFeeAmount(openFeePrice); |
| | | contractOrderDao.insert(contractOrderEntity); |
| | | |
| | | wholeHoldOrder.setOpeningFeeAmount(fee); |
| | | wholeHoldOrder.setOpeningPrice(newOpenPrice); |
| | | wholeHoldOrder.setBondAmount(wholeHoldOrder.getBondAmount().add(bondAmount).add(openFeePrice)); |
| | | wholeHoldOrder.setSymbolCnt(wholeHoldOrder.getSymbolCnt() + submitOrderDto.getSymbolCnt()); |
| | | wholeHoldOrder.setSymbolCntSale(wholeHoldOrder.getSymbolCntSale() + submitOrderDto.getSymbolCnt()); |
| | | wholeHoldOrder.setPrePaymentAmount(prePaymentAmount.add(wholeHoldOrder.getPrePaymentAmount())); |
| | | wholeHoldOrder.setOperateNo(wholeHoldOrder.getOperateNo()); |
| | | wholeHoldOrder.setHoldBond(CalculateUtil.calMemberHoldBond(wholeHoldOrder)); |
| | | int i = contractHoldOrderDao.updateById(wholeHoldOrder); |
| | | if (i > 0) { |
| | | memberWalletContractDao.increaseWalletContractBalanceById(prePaymentAmount.negate(), openFeePrice.negate(), null, walletContract.getId()); |
| | | |
| | | // 发送预估强平价 |
| | | ThreadPoolUtils.sendWholeForceClosingPrice(submitOrderDto.getSymbol(), memberEntity); |
| | | // 计算佣金 |
| | | ThreadPoolUtils.calReturnMoney(memberEntity.getId(), openFeePrice, contractOrderEntity, AgentReturnEntity.ORDER_TYPE_OPEN); |
| | | |
| | | // 插入财务流水 |
| | | if (submitOrderDto.getOrderType() == ContractHoldOrderEntity.OPENING_TYPE_MORE) { |
| | | LogRecordUtils.insertMemberAccountFlow(memberEntity.getId(), prePaymentAmount, walletContract.getAvailableBalance().subtract(prePaymentAmount), submitOrderDto.getSymbol(), "买涨持仓", "买涨:" + submitOrderDto.getSymbol()); |
| | | } else { |
| | | LogRecordUtils.insertMemberAccountFlow(memberEntity.getId(), prePaymentAmount, walletContract.getAvailableBalance().subtract(prePaymentAmount), submitOrderDto.getSymbol(), "买跌持仓", "买跌:" + submitOrderDto.getSymbol()); |
| | | } |
| | | |
| | | // 全仓爆仓 |
| | | ThreadPoolUtils.sendWholePrice(memberEntity.getId()); |
| | | |
| | | // 提交成功 |
| | | return Result.ok(MessageSourceUtils.getString("member_service_0024")); |
| | | } |
| | | // 提交失败 |
| | | return Result.fail(MessageSourceUtils.getString("member_service_0067")); |
| | | } |
| | | |
| | | ContractHoldOrderEntity holdOrderEntity = new ContractHoldOrderEntity(); |
| | | holdOrderEntity.setMemberId(memberEntity.getId()); |
| | |
| | | holdOrderEntity.setSymbolCntSale(submitOrderDto.getSymbolCnt()); |
| | | holdOrderEntity.setSymbolSku(lotNumber); |
| | | holdOrderEntity.setLeverRatio(submitOrderDto.getLeverRatio()); |
| | | // holdOrderEntity.setForceClosingPrice(forceClosingPrice); |
| | | holdOrderEntity.setOpeningFeeAmount(openFeePrice); |
| | | holdOrderEntity.setOpeningPrice(openingPrice); |
| | | holdOrderEntity.setOpeningType(submitOrderDto.getOrderType()); |
| | | holdOrderEntity.setMarkPrice(newPrice); |
| | | holdOrderEntity.setIsCanClosing(ContractHoldOrderEntity.ORDER_CAN_CLOSING_N); |
| | | holdOrderEntity.setIsCanClosing(ContractHoldOrderEntity.ORDER_CAN_CLOSING_Y); |
| | | holdOrderEntity.setPrePaymentAmount(prePaymentAmount); |
| | | holdOrderEntity.setBondAmount(bondAmount.add(openFeePrice)); |
| | | holdOrderEntity.setOperateNo(1); |
| | |
| | | |
| | | ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(holdOrderEntity); |
| | | contractOrderEntity.setOpeningTime(new Date()); |
| | | |
| | | holdOrderEntity.setHoldBond(CalculateUtil.calMemberHoldBond(holdOrderEntity)); |
| | | contractHoldOrderDao.insert(holdOrderEntity); |
| | | int i = contractOrderDao.insert(contractOrderEntity); |
| | | |
| | | if (i > 0) { |
| | | memberWalletContractDao.increaseWalletContractBalanceById(prePaymentAmount.negate(), openFeePrice.negate(), null, walletContract.getId()); |
| | | |
| | | // 发送爆仓消息 |
| | | // sendOrderBombMsg(holdOrderEntity.getId(), holdOrderEntity.getOpeningType(), forceClosingPrice, holdOrderEntity.getSymbol(), holdOrderEntity.getOperateNo()); |
| | | // 发送预估强平价 |
| | | ThreadPoolUtils.sendWholeForceClosingPrice(submitOrderDto.getSymbol(), memberEntity); |
| | | |
| | | // 计算佣金 |
| | | ThreadPoolUtils.calReturnMoney(memberEntity.getId(), contractOrderEntity.getOpeningFeeAmount(), contractOrderEntity, AgentReturnEntity.ORDER_TYPE_OPEN); |
| | | |
| | |
| | | } else { |
| | | LogRecordUtils.insertMemberAccountFlow(memberEntity.getId(), prePaymentAmount, walletContract.getAvailableBalance().subtract(prePaymentAmount), submitOrderDto.getSymbol(), "买跌持仓", "买跌:" + submitOrderDto.getSymbol()); |
| | | } |
| | | |
| | | // 全仓爆仓 |
| | | ThreadPoolUtils.sendWholePrice(memberEntity.getId()); |
| | | |
| | | // 提交成功 |
| | | return Result.ok(MessageSourceUtils.getString("member_service_0024")); |
| | |
| | | memberWalletContractDao.increaseWalletContractBalanceById(prePaymentAmount.negate(), openFeePrice.negate(), null, walletContract.getId()); |
| | | |
| | | // 发送爆仓消息 |
| | | sendOrderBombMsg(holdOrderEntity.getId(), holdOrderEntity.getOpeningType(), forceClosingPrice, holdOrderEntity.getSymbol(), holdOrderEntity.getOperateNo()); |
| | | sendOrderBombMsg(holdOrderEntity.getId(), holdOrderEntity.getOpeningType(), forceClosingPrice, holdOrderEntity.getSymbol(), holdOrderEntity.getOperateNo(), holdOrderEntity.getMemberId()); |
| | | |
| | | // 计算佣金 |
| | | ThreadPoolUtils.calReturnMoney(memberEntity.getId(), contractOrderEntity.getOpeningFeeAmount(), contractOrderEntity, AgentReturnEntity.ORDER_TYPE_OPEN); |
| | |
| | | @Override |
| | | public Result findHoldOrderList(String symbol, int type) { |
| | | MemberEntity memberEntity = LoginUserUtils.getAppLoginUser(); |
| | | List<ContractHoldOrderEntity> list = null; |
| | | |
| | | List<ContractHoldOrderEntity> list = contractHoldOrderDao.selectHoldOrderListByMemberIdAndSymbol(memberEntity.getId(), symbol, type); |
| | | if (ContractEntrustOrderEntity.POSITION_TYPE_ALL == memberEntity.getContractPositionType()) { |
| | | list = contractHoldOrderDao.selectHoldOrderListByMemberIdAndSymbolTest(memberEntity.getId(), type); |
| | | } else { |
| | | list = contractHoldOrderDao.selectHoldOrderListByMemberIdAndSymbol(memberEntity.getId(), symbol, type); |
| | | } |
| | | |
| | | MemberWalletContractEntity walletContractEntity = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberEntity.getId(), CoinTypeEnum.USDT.name()); |
| | | if (CollUtil.isNotEmpty(list)) { |
| | | BigDecimal totalProfitOrLoss = BigDecimal.ZERO; |
| | | BigDecimal totalHoldBond = BigDecimal.ZERO; |
| | | List<HoldOrderListVo> resultList = new ArrayList<>(); |
| | | for (ContractHoldOrderEntity holdOrderEntity : list) { |
| | | HoldOrderListVo holdOrderListVo = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToDto(holdOrderEntity); |
| | |
| | | // 开多 |
| | | if (ContractHoldOrderEntity.OPENING_TYPE_MORE == holdOrderEntity.getOpeningType()) { |
| | | // (最新价-开仓价)*规格*张数 |
| | | rewardRatio = newPrice.subtract(holdOrderEntity.getOpeningPrice()).multiply(lotNumber).multiply(new BigDecimal(holdOrderEntity.getSymbolCnt())); |
| | | rewardRatio = newPrice.subtract(holdOrderEntity.getOpeningPrice()).multiply(lotNumber).multiply(new BigDecimal(holdOrderEntity.getSymbolCntSale())); |
| | | // 开空 |
| | | } else { |
| | | // (开仓价-最新价)*规格*张数 |
| | | rewardRatio = holdOrderEntity.getOpeningPrice().subtract(newPrice).multiply(lotNumber).multiply(new BigDecimal(holdOrderEntity.getSymbolCnt())); |
| | | rewardRatio = holdOrderEntity.getOpeningPrice().subtract(newPrice).multiply(lotNumber).multiply(new BigDecimal(holdOrderEntity.getSymbolCntSale())); |
| | | } |
| | | |
| | | if (memberEntity.getIsProfit() == MemberEntity.IS_PROFIT_Y) { |
| | |
| | | // canAddMaxBond = BigDecimal.ZERO; |
| | | // } |
| | | BigDecimal canReduceMaxBond = holdOrderEntity.getBondAmount().subtract(holdOrderEntity.getPrePaymentAmount()); |
| | | |
| | | if (rewardRatio.compareTo(BigDecimal.ZERO) < 0) { |
| | | canReduceMaxBond = canReduceMaxBond.add(rewardRatio); |
| | | } |
| | | |
| | | if (canReduceMaxBond.compareTo(BigDecimal.ZERO) < 0) { |
| | | canReduceMaxBond = BigDecimal.ZERO; |
| | | } |
| | |
| | | holdOrderListVo.setCanAddMaxBond(walletContractEntity.getAvailableBalance()); |
| | | holdOrderListVo.setReturnRate(returnRate); |
| | | holdOrderListVo.setProfitOrLoss(rewardRatio); |
| | | if (ContractEntrustOrderEntity.POSITION_TYPE_ALL == memberEntity.getContractPositionType()) { |
| | | BigDecimal forcePrice = CalculateUtil.getForceSetPriceForWhole(holdOrderEntity.getSymbol(), memberEntity); |
| | | holdOrderListVo.setForceClosingPrice(forcePrice); |
| | | } |
| | | resultList.add(holdOrderListVo); |
| | | totalProfitOrLoss = totalProfitOrLoss.add(rewardRatio); |
| | | totalHoldBond = totalHoldBond.add(holdOrderEntity.getHoldBond() == null ? BigDecimal.ZERO : holdOrderEntity.getHoldBond()); |
| | | } |
| | | |
| | | Map<String, Object> result = new HashMap<>(); |
| | | if (ContractEntrustOrderEntity.POSITION_TYPE_ALL == memberEntity.getContractPositionType()) { |
| | | List<ContractEntrustOrderEntity> entrustOrder = contractEntrustOrderDao.selectEntrustOrderListByMemberId(memberEntity.getId()); |
| | | BigDecimal totalEntrustAmount = BigDecimal.ZERO; |
| | | if (CollUtil.isNotEmpty(entrustOrder)) { |
| | | for (ContractEntrustOrderEntity contractEntrustOrderEntity : entrustOrder) { |
| | | totalEntrustAmount = totalEntrustAmount.add(contractEntrustOrderEntity.getEntrustAmount()); |
| | | } |
| | | } |
| | | BigDecimal riskRatio = totalHoldBond.divide(walletContractEntity.getTotalBalance().add(totalProfitOrLoss).subtract(totalEntrustAmount), 4, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(100)); |
| | | result.put("riskRatio", riskRatio); |
| | | } |
| | | |
| | | result.put("hold", resultList); |
| | | result.put("totalProfitOrLoss", totalProfitOrLoss.setScale(4, BigDecimal.ROUND_DOWN).toPlainString()); |
| | | return Result.ok(result); |
| | |
| | | |
| | | // 更新可平张数 |
| | | holdOrderEntity.setSymbolCntSale(sub); |
| | | holdOrderEntity.setSymbolCnt(sub); |
| | | contractHoldOrderDao.updateById(holdOrderEntity); |
| | | |
| | | // 将待平张数放入缓存 |
| | | redisUtils.set(AppContants.CLOSING_ORDER_PREFIX + holdOrderEntity.getId(), wholeCloseOrderDto.getCount()); |
| | | redisUtils.set(AppContants.CLOSING_ORDER_PREFIX + holdOrderEntity.getId(), wholeCloseOrderDto.getCount(), 30); |
| | | |
| | | // 发送平仓消息 |
| | | List<Long> ids = new ArrayList<>(); |
| | |
| | | if (ContractHoldOrderEntity.OPENING_TYPE_MORE == holdOrderEntity.getOpeningType()) { |
| | | // 开多止盈 |
| | | if (stopProfitPrice != null) { |
| | | model = new OrderModel(holdOrderEntity.getId(), RabbitPriceTypeEnum.CLOSE_MORE_STOP_PROFIT.getValue(), stopProfitPrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), holdOrderEntity.getSymbol()); |
| | | model = new OrderModel(holdOrderEntity.getId(), RabbitPriceTypeEnum.CLOSE_MORE_STOP_PROFIT.getValue(), stopProfitPrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), holdOrderEntity.getSymbol(), holdOrderEntity.getMemberId()); |
| | | producer.sendPriceOperate(JSONObject.toJSONString(model)); |
| | | } |
| | | // 开多止损 |
| | | if (stopLessPrice != null) { |
| | | model = new OrderModel(holdOrderEntity.getId(), RabbitPriceTypeEnum.CLOSE_MORE_STOP_LESS.getValue(), stopLessPrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), holdOrderEntity.getSymbol()); |
| | | model = new OrderModel(holdOrderEntity.getId(), RabbitPriceTypeEnum.CLOSE_MORE_STOP_LESS.getValue(), stopLessPrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), holdOrderEntity.getSymbol(), holdOrderEntity.getMemberId()); |
| | | producer.sendPriceOperate(JSONObject.toJSONString(model)); |
| | | } |
| | | } else { |
| | | // 开空止盈 |
| | | if (stopProfitPrice != null) { |
| | | model = new OrderModel(holdOrderEntity.getId(), RabbitPriceTypeEnum.CLOSE_LESS_STOP_PROFIT.getValue(), stopProfitPrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), holdOrderEntity.getSymbol()); |
| | | model = new OrderModel(holdOrderEntity.getId(), RabbitPriceTypeEnum.CLOSE_LESS_STOP_PROFIT.getValue(), stopProfitPrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), holdOrderEntity.getSymbol(), holdOrderEntity.getMemberId()); |
| | | producer.sendPriceOperate(JSONObject.toJSONString(model)); |
| | | } |
| | | // 开空止损 |
| | | if (stopLessPrice != null) { |
| | | model = new OrderModel(holdOrderEntity.getId(), RabbitPriceTypeEnum.CLOSE_LESS_STOP_LESS.getValue(), stopLessPrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), holdOrderEntity.getSymbol()); |
| | | model = new OrderModel(holdOrderEntity.getId(), RabbitPriceTypeEnum.CLOSE_LESS_STOP_LESS.getValue(), stopLessPrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), holdOrderEntity.getSymbol(), holdOrderEntity.getMemberId()); |
| | | producer.sendPriceOperate(JSONObject.toJSONString(model)); |
| | | } |
| | | } |
| | |
| | | if (holdOrderEntity.getBondAmount().subtract(holdOrderEntity.getPrePaymentAmount()).subtract(changeBondDto.getAmount()).compareTo(BigDecimal.ZERO) < 0) { |
| | | return Result.fail("超出保证金最大减少金额"); |
| | | } |
| | | BigDecimal newPrice = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey(holdOrderEntity.getSymbol()))); |
| | | |
| | | BigDecimal rewardRatio = BigDecimal.ZERO; |
| | | // 开多 |
| | | if (ContractHoldOrderEntity.OPENING_TYPE_MORE == holdOrderEntity.getOpeningType()) { |
| | | // (最新价-开仓价)*规格*张数 |
| | | rewardRatio = newPrice.subtract(holdOrderEntity.getOpeningPrice()).multiply(holdOrderEntity.getSymbolSku()).multiply(new BigDecimal(holdOrderEntity.getSymbolCnt())); |
| | | // 开空 |
| | | } else { |
| | | // (开仓价-最新价)*规格*张数 |
| | | rewardRatio = holdOrderEntity.getOpeningPrice().subtract(newPrice).multiply(holdOrderEntity.getSymbolSku()).multiply(new BigDecimal(holdOrderEntity.getSymbolCnt())); |
| | | } |
| | | |
| | | if (memberEntity.getIsProfit() == MemberEntity.IS_PROFIT_Y) { |
| | | PlatformTradeSettingEntity tradeSettingEntity = cacheSettingUtils.getTradeSetting(); |
| | | if (rewardRatio.compareTo(BigDecimal.ZERO) > -1) { |
| | | rewardRatio = rewardRatio.multiply(BigDecimal.ONE.subtract(tradeSettingEntity.getProfitParam())); |
| | | } |
| | | } |
| | | |
| | | if (rewardRatio.compareTo(BigDecimal.ZERO) < 0) { |
| | | BigDecimal canReduceMax = holdOrderEntity.getBondAmount().subtract(holdOrderEntity.getPrePaymentAmount()).add(rewardRatio); |
| | | if (canReduceMax.subtract(changeBondDto.getAmount()).compareTo(BigDecimal.ZERO) < 0) { |
| | | return Result.fail("超出保证金最大减少金额"); |
| | | } |
| | | } |
| | | |
| | | memberWalletContractDao.increaseWalletContractBalanceById(changeBondDto.getAmount(), null, null, walletContract.getId()); |
| | | holdOrderEntity.setBondAmount(holdOrderEntity.getBondAmount().subtract(changeBondDto.getAmount())); |
| | | } |
| | |
| | | |
| | | if (i > 0) { |
| | | // 发送爆仓消息 |
| | | sendOrderBombMsg(holdOrderEntity.getId(), holdOrderEntity.getOpeningType(), forceClosingPrice, holdOrderEntity.getSymbol(), holdOrderEntity.getOperateNo()); |
| | | sendOrderBombMsg(holdOrderEntity.getId(), holdOrderEntity.getOpeningType(), forceClosingPrice, holdOrderEntity.getSymbol(), holdOrderEntity.getOperateNo(), holdOrderEntity.getMemberId()); |
| | | return Result.ok("调整成功"); |
| | | } |
| | | return Result.fail("调整失败"); |
| | |
| | | PlatformTradeSettingEntity tradeSetting = cacheSettingUtils.getTradeSetting(); |
| | | BigDecimal newPriceSymbol = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey(symbol))); |
| | | |
| | | List<ContractEntrustOrderEntity> entrustOrderEntities; |
| | | List<ContractHoldOrderEntity> holdOrderEntities; |
| | | MemberWalletContractEntity walletContractEntity; |
| | | if (memberEntity.getContractPositionType().equals(ContractEntrustOrderEntity.POSITION_TYPE_ADD)) { |
| | | // 当前合约委托单 |
| | | entrustOrderEntities = contractEntrustOrderDao.selectEntrustOrderListByMemberId(memberEntity.getId()); |
| | | // 当前持仓列表 |
| | | holdOrderEntities = contractHoldOrderDao.selectHoldOrderListByMemberId(memberEntity.getId()); |
| | | walletContractEntity = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberEntity.getId(), CoinTypeEnum.USDT.name()); |
| | | } else { |
| | | entrustOrderEntities = contractEntrustOrderDao.selectEntrustOrderListByMemberIdAndSymbol(memberEntity.getId(), symbol); |
| | | holdOrderEntities = contractHoldOrderDao.selectHoldOrderListForWholeByMemberIdAndSymbol(memberEntity.getId(), symbol); |
| | | walletContractEntity = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberEntity.getId(), CoinTypeConvert.convertContractTypeToCoin(symbol)); |
| | | } |
| | | List<ContractEntrustOrderEntity> entrustOrderEntities = contractEntrustOrderDao.selectEntrustOrderListByMemberId(memberEntity.getId()); |
| | | List<ContractHoldOrderEntity> holdOrderEntities = contractHoldOrderDao.selectHoldOrderListByMemberId(memberEntity.getId()); |
| | | MemberWalletContractEntity walletContractEntity = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberEntity.getId(), CoinTypeEnum.USDT.name()); |
| | | // if (memberEntity.getContractPositionType().equals(ContractEntrustOrderEntity.POSITION_TYPE_ADD)) { |
| | | // // 当前合约委托单 |
| | | // entrustOrderEntities = contractEntrustOrderDao.selectEntrustOrderListByMemberId(memberEntity.getId()); |
| | | // // 当前持仓列表 |
| | | // holdOrderEntities = contractHoldOrderDao.selectHoldOrderListByMemberId(memberEntity.getId()); |
| | | // } else { |
| | | // entrustOrderEntities = contractEntrustOrderDao.selectEntrustOrderListByMemberIdAndSymbol(memberEntity.getId(), symbol); |
| | | // holdOrderEntities = contractHoldOrderDao.selectHoldOrderListForWholeByMemberIdAndSymbol(memberEntity.getId(), symbol); |
| | | // } |
| | | |
| | | // 冻结保证金 -- 即委托单中的保证金之和 |
| | | BigDecimal frozenBondAmount = BigDecimal.ZERO; |
| | |
| | | BigDecimal profitOrLess = BigDecimal.ZERO; |
| | | // 开多 |
| | | if (ContractHoldOrderEntity.OPENING_TYPE_MORE == holdOrderEntity.getOpeningType()) { |
| | | profitOrLess = newPrice.subtract(holdOrderEntity.getOpeningPrice()).multiply(new BigDecimal(holdOrderEntity.getSymbolCnt())).multiply(lotNumber); |
| | | profitOrLess = newPrice.subtract(holdOrderEntity.getOpeningPrice()).multiply(new BigDecimal(holdOrderEntity.getSymbolCntSale())).multiply(lotNumber); |
| | | // 开空 |
| | | } else { |
| | | profitOrLess = holdOrderEntity.getOpeningPrice().subtract(newPrice).multiply(new BigDecimal(holdOrderEntity.getSymbolCnt())).multiply(lotNumber); |
| | | profitOrLess = holdOrderEntity.getOpeningPrice().subtract(newPrice).multiply(new BigDecimal(holdOrderEntity.getSymbolCntSale())).multiply(lotNumber); |
| | | } |
| | | |
| | | if (MemberEntity.IS_PROFIT_Y == memberEntity.getIsProfit()) { |
| | |
| | | |
| | | MemberLevelRateEntity rateEntity = memberLevelRateDao.selectLeverRateByMemberIdAndSymbol(memberEntity.getId(), symbol); |
| | | |
| | | ContractMoneyInfoVo contractMoneyInfoVo = new ContractMoneyInfoVo(); |
| | | // 权益 |
| | | BigDecimal equity = walletContractEntity.getTotalBalance().add(totalProfitOrLess); |
| | | |
| | | ContractMoneyInfoVo contractMoneyInfoVo = new ContractMoneyInfoVo(); |
| | | contractMoneyInfoVo.setAvailableBalance(walletContractEntity.getAvailableBalance()); |
| | | if (equity.compareTo(BigDecimal.ZERO) <= 0) { |
| | | equity = BigDecimal.ZERO; |
| | | } |
| | | |
| | | BigDecimal available = walletContractEntity.getAvailableBalance(); |
| | | if (totalProfitOrLess.compareTo(BigDecimal.ZERO) <= 0) { |
| | | available = available.add(totalProfitOrLess); |
| | | if (available.compareTo(BigDecimal.ZERO) <= 0) { |
| | | available = BigDecimal.ZERO; |
| | | } |
| | | } |
| | | |
| | | // 获取当日k线的开盘价 |
| | | Candlestick symbolObject = (Candlestick) redisUtils.get(symbol); |
| | | BigDecimal openPrice = symbolObject.getOpen(); |
| | | BigDecimal upOrDown = newPriceSymbol.subtract(openPrice).divide(openPrice, 8, BigDecimal.ROUND_HALF_UP); |
| | | contractMoneyInfoVo.setBeUsedBondAmount(beUsedBondAmount); |
| | | contractMoneyInfoVo.setFrozenBondAmount(frozenBondAmount); |
| | | contractMoneyInfoVo.setEquity(equity); |
| | | contractMoneyInfoVo.setAvailableBalance(available); |
| | | contractMoneyInfoVo.setFeeRatio(tradeSetting.getFeeRatio()); |
| | | contractMoneyInfoVo.setLeverAgeRatio(tradeSetting.getLeverageRatio()); |
| | | contractMoneyInfoVo.setNewPrice(newPriceSymbol); |
| | | contractMoneyInfoVo.setUpOrDown(upOrDown); |
| | | contractMoneyInfoVo.setSymbolSku(cacheSettingUtils.getSymbolSku(symbol)); |
| | | contractMoneyInfoVo.setLeverRate(rateEntity.getLevelRateUp()); |
| | | return Result.ok(contractMoneyInfoVo); |
| | |
| | | @Override |
| | | public Result changeLeverRate(ChangeLeverRateDto changeLeverRateDto) { |
| | | MemberEntity memberEntity = LoginUserUtils.getAppLoginUser(); |
| | | |
| | | List<ContractHoldOrderEntity> holdOrders = contractHoldOrderDao.selectHoldOrderListForWholeByMemberIdAndSymbol(memberEntity.getId(), changeLeverRateDto.getSymbol()); |
| | | if (CollUtil.isNotEmpty(holdOrders)) { |
| | | return Result.fail("存在持仓, 无法调整杠杆"); |
| | | } |
| | | MemberLevelRateEntity levelRateEntity = memberLevelRateDao.selectLeverRateByMemberIdAndSymbol(memberEntity.getId(), changeLeverRateDto.getSymbol()); |
| | | levelRateEntity.setLevelRateUp(changeLeverRateDto.getLeverRate()); |
| | | levelRateEntity.setLevelRateDown(changeLeverRateDto.getLeverRate()); |
| | |
| | | } else { |
| | | BigDecimal available = walletContractEntity.getAvailableBalance(); |
| | | BigDecimal lessAmount = thisTimeHold.subtract(available); |
| | | MemberEntity memberEntity = memberDao.selectById(holdOrderEntity.getId()); |
| | | MemberEntity memberEntity = memberDao.selectById(holdOrderEntity.getMemberId()); |
| | | memberWalletContractDao.increaseWalletContractBalanceById(available.negate(), available.negate(), null, walletContractEntity.getId()); |
| | | |
| | | BigDecimal newBondAmount = holdOrderEntity.getBondAmount().subtract(lessAmount); |
| | |
| | | contractHoldOrderDao.updateById(holdOrderEntity); |
| | | |
| | | // 发送爆仓消息 |
| | | sendOrderBombMsg(holdOrderEntity.getId(), holdOrderEntity.getOpeningType(), newForcePrice, holdOrderEntity.getSymbol(), holdOrderEntity.getOperateNo()); |
| | | sendOrderBombMsg(holdOrderEntity.getId(), holdOrderEntity.getOpeningType(), newForcePrice, holdOrderEntity.getSymbol(), holdOrderEntity.getOperateNo(), holdOrderEntity.getMemberId()); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | public void sendOrderBombMsg(Long id, int type, BigDecimal forceClosingPrice, String symbol, int operateNo) { |
| | | public void sendOrderBombMsg(Long id, int type, BigDecimal forceClosingPrice, String symbol, int operateNo, Long memberId) { |
| | | OrderModel model = null; |
| | | // 开多 |
| | | if (ContractHoldOrderEntity.OPENING_TYPE_MORE == type) { |
| | | model = new OrderModel(id, RabbitPriceTypeEnum.CLOSE_MORE_BOMB.getValue(), forceClosingPrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), symbol, operateNo); |
| | | model = new OrderModel(id, RabbitPriceTypeEnum.CLOSE_MORE_BOMB.getValue(), forceClosingPrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), symbol, operateNo, memberId); |
| | | // 开空 |
| | | } else { |
| | | model = new OrderModel(id, RabbitPriceTypeEnum.CLOSE_LESS_BOMB.getValue(), forceClosingPrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), symbol, operateNo); |
| | | model = new OrderModel(id, RabbitPriceTypeEnum.CLOSE_LESS_BOMB.getValue(), forceClosingPrice.setScale(8, RoundingMode.HALF_UP).toPlainString(), symbol, operateNo, memberId); |
| | | } |
| | | producer.sendPriceOperate(JSONObject.toJSONString(model)); |
| | | } |
| | |
| | | if (CollUtil.isNotEmpty(list) || CollUtil.isNotEmpty(entrustList)) { |
| | | return Result.fail("存在持仓/委托, 无法更改"); |
| | | } |
| | | |
| | | /** |
| | | * 验证用户是否存在跟随交易员 |
| | | * 是:不允许切换成全仓模式 |
| | | */ |
| | | List<FollowFollowerProfitEntity> followFollowerProfitEntitys = followFollowerProfitDao.selectByMemberIdandIsFollow(member.getId(),FollowFollowerProfitEntity.IS_FOLLOW_Y); |
| | | if(CollUtil.isNotEmpty(followFollowerProfitEntitys)) { |
| | | return Result.fail(MessageSourceUtils.getString("documentary_service_0018")); |
| | | } |
| | | |
| | | Integer positionType = member.getContractPositionType() == ContractEntrustOrderEntity.POSITION_TYPE_ADD ? ContractEntrustOrderEntity.POSITION_TYPE_ALL : ContractEntrustOrderEntity.POSITION_TYPE_ADD; |
| | | MemberEntity updateEntity = new MemberEntity(); |
| | |
| | | } |
| | | return Result.fail(MessageSourceUtils.getString("member_service_0041")); |
| | | } |
| | | |
| | | @Transactional(rollbackFor = Exception.class) |
| | | @Override |
| | | public void calHoldFeeAmountForBondAmount() { |
| | | List<ContractHoldOrderEntity> list = contractHoldOrderDao.selectAllHoldOrder(); |
| | | PlatformTradeSettingEntity tradeSettingEntity = cacheSettingUtils.getTradeSetting(); |
| | | |
| | | if (CollUtil.isNotEmpty(list)) { |
| | | for (ContractHoldOrderEntity holdOrderEntity : list) { |
| | | BigDecimal holdAmount = holdOrderEntity.getHoldAmount(); |
| | | if (holdAmount == null) { |
| | | holdAmount = BigDecimal.ZERO; |
| | | } |
| | | |
| | | BigDecimal thisTimeHold = holdOrderEntity.getBondAmount().multiply(tradeSettingEntity.getDoingRatio()); |
| | | log.info("订单编号:{}, 持仓费:{}", holdOrderEntity.getOrderNo(), thisTimeHold); |
| | | |
| | | MemberEntity memberEntity = memberDao.selectById(holdOrderEntity.getMemberId()); |
| | | BigDecimal subBond = holdOrderEntity.getBondAmount().subtract(thisTimeHold); |
| | | |
| | | BigDecimal newForcePrice = CalculateUtil.getForceSetPrice(subBond.subtract(holdOrderEntity.getOpeningFeeAmount()), holdOrderEntity.getOpeningPrice(), holdOrderEntity.getSymbolCnt(), holdOrderEntity.getSymbolSku(), holdOrderEntity.getOpeningType(), memberEntity); |
| | | holdAmount = holdAmount.add(thisTimeHold); |
| | | holdOrderEntity.setBondAmount(subBond); |
| | | holdOrderEntity.setHoldAmount(holdAmount); |
| | | holdOrderEntity.setForceClosingPrice(newForcePrice); |
| | | holdOrderEntity.setOperateNo(holdOrderEntity.getOperateNo() + 1); |
| | | contractHoldOrderDao.updateById(holdOrderEntity); |
| | | |
| | | // 发送爆仓消息 |
| | | sendOrderBombMsg(holdOrderEntity.getId(), holdOrderEntity.getOpeningType(), newForcePrice, holdOrderEntity.getSymbol(), holdOrderEntity.getOperateNo(), holdOrderEntity.getMemberId()); |
| | | } |
| | | } |
| | | } |
| | | } |