src/main/java/com/xcong/excoin/modules/contract/dao/ContractHoldOrderDao.java
@@ -54,4 +54,6 @@ public List<HashMap<String, Object>> selectAllWholeOrderMemberIdAndSymbol(); public List<String> selectWholeHoldOrderSymbolsByMemberId(@Param("memberId") Long memberId); } src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractEntrustOrderServiceImpl.java
@@ -109,128 +109,59 @@ } } // 逐仓委托 if (ContractEntrustOrderEntity.POSITION_TYPE_ADD == memberEntity.getContractPositionType()) { return entrustForAdd(submitEntrustDto, memberEntity); // 全仓委托 BigDecimal lotNumber = cacheSettingUtils.getSymbolSku(submitEntrustDto.getSymbol()); PlatformTradeSettingEntity tradeSettingEntity = cacheSettingUtils.getTradeSetting(); MemberWalletContractEntity walletContract = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberEntity.getId(), CoinTypeEnum.USDT.name()); // 保证金计算 -- 建仓价X规格X手数X(1/杠杆倍率) BigDecimal bondAmount = CalculateUtil.getBondAmount(submitEntrustDto.getEntrustPrice(), lotNumber, submitEntrustDto.getSymbolCnt(), submitEntrustDto.getLeverRatio()); // 开仓手续费 建仓价*规格*手数*手续费率 BigDecimal openFeePrice = CalculateUtil.getOpenFeePrice(submitEntrustDto.getEntrustPrice(), lotNumber, submitEntrustDto.getSymbolCnt(), tradeSettingEntity.getFeeRatio()); log.info("手续费:{}", openFeePrice); // 预付款 BigDecimal entrustTotalAmount = bondAmount.add(openFeePrice).add(openFeePrice); log.info("预付款:{}", entrustTotalAmount); if (entrustTotalAmount.compareTo(walletContract.getAvailableBalance()) > -1) { throw new GlobalException(MessageSourceUtils.getString("member_service_0085")); } ContractEntrustOrderEntityMapper convert = ContractEntrustOrderEntityMapper.INSTANCE; ContractEntrustOrderEntity entrustOrderEntity = convert.submitEntrustDtoToEntity(submitEntrustDto); entrustOrderEntity.setOrderNo(commonService.generateOrderNo(memberEntity.getId())); entrustOrderEntity.setMemberId(memberEntity.getId()); entrustOrderEntity.setBondAmount(bondAmount.add(openFeePrice)); entrustOrderEntity.setSymbolSku(lotNumber); entrustOrderEntity.setEntrustAmount(entrustTotalAmount); entrustOrderEntity.setPositionType(memberEntity.getContractPositionType()); int i = contractEntrustOrderDao.insert(entrustOrderEntity); memberWalletContractDao.increaseWalletContractBalanceById(entrustTotalAmount.negate(), null, entrustOrderEntity.getBondAmount(), walletContract.getId()); if (i > 0) { // 发送委托单队列消息 if (submitEntrustDto.getEntrustType() == ContractEntrustOrderEntity.ENTRUST_TYPE_OPEN_MORE) { OrderModel model = new OrderModel(entrustOrderEntity.getId(), RabbitPriceTypeEnum.ENTRUST_OPEN_MORE.getValue(), submitEntrustDto.getEntrustPrice().setScale(8, RoundingMode.HALF_UP).toPlainString(), submitEntrustDto.getSymbol(), entrustOrderEntity.getMemberId()); producer.sendPriceOperate(JSONObject.toJSONString(model)); LogRecordUtils.insertMemberAccountFlow(memberEntity.getId(), entrustTotalAmount, walletContract.getAvailableBalance().subtract(entrustTotalAmount), submitEntrustDto.getSymbol(), "委托买涨", "买涨:" + submitEntrustDto.getSymbol()); } else { OrderModel model = new OrderModel(entrustOrderEntity.getId(), RabbitPriceTypeEnum.ENTRUST_OPEN_LESS.getValue(), submitEntrustDto.getEntrustPrice().setScale(8, RoundingMode.HALF_UP).toPlainString(), submitEntrustDto.getSymbol(), entrustOrderEntity.getMemberId()); producer.sendPriceOperate(JSONObject.toJSONString(model)); LogRecordUtils.insertMemberAccountFlow(memberEntity.getId(), entrustTotalAmount, walletContract.getAvailableBalance().subtract(entrustTotalAmount), submitEntrustDto.getSymbol(), "委托买跌", "买跌:" + submitEntrustDto.getSymbol()); } return Result.ok(MessageSourceUtils.getString("result_success_msg")); } else { return entrustForWhole(submitEntrustDto, memberEntity); return Result.fail(MessageSourceUtils.getString("result_fail_msg")); } } return Result.fail(MessageSourceUtils.getString("result_fail_msg")); } private Result entrustForAdd(SubmitEntrustDto submitEntrustDto, MemberEntity memberEntity) { BigDecimal lotNumber = cacheSettingUtils.getSymbolSku(submitEntrustDto.getSymbol()); PlatformTradeSettingEntity tradeSettingEntity = cacheSettingUtils.getTradeSetting(); MemberWalletContractEntity walletContract = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberEntity.getId(), CoinTypeEnum.USDT.name()); // 保证金计算 -- 建仓价X规格X手数X(1/杠杆倍率) BigDecimal bondAmount = CalculateUtil.getBondAmount(submitEntrustDto.getEntrustPrice(), lotNumber, submitEntrustDto.getSymbolCnt(), submitEntrustDto.getLeverRatio()); // 开仓手续费 建仓价*规格*手数*手续费率 BigDecimal openFeePrice = CalculateUtil.getOpenFeePrice(submitEntrustDto.getEntrustPrice(), lotNumber, submitEntrustDto.getSymbolCnt(), tradeSettingEntity.getFeeRatio()); log.info("手续费:{}", openFeePrice); // 预付款 BigDecimal entrustTotalAmount = bondAmount.add(openFeePrice).add(openFeePrice); log.info("预付款:{}", entrustTotalAmount); if (entrustTotalAmount.compareTo(walletContract.getAvailableBalance()) > -1) { throw new GlobalException(MessageSourceUtils.getString("member_service_0085")); } ContractEntrustOrderEntityMapper convert = ContractEntrustOrderEntityMapper.INSTANCE; ContractEntrustOrderEntity entrustOrderEntity = convert.submitEntrustDtoToEntity(submitEntrustDto); entrustOrderEntity.setOrderNo(commonService.generateOrderNo(memberEntity.getId())); entrustOrderEntity.setMemberId(memberEntity.getId()); entrustOrderEntity.setBondAmount(bondAmount.add(openFeePrice)); entrustOrderEntity.setSymbolSku(lotNumber); entrustOrderEntity.setEntrustAmount(entrustTotalAmount); entrustOrderEntity.setPositionType(ContractEntrustOrderEntity.POSITION_TYPE_ADD); int i = contractEntrustOrderDao.insert(entrustOrderEntity); memberWalletContractDao.increaseWalletContractBalanceById(entrustTotalAmount.negate(), null, entrustOrderEntity.getBondAmount(), walletContract.getId()); if (i > 0) { // 发送委托单队列消息 if (submitEntrustDto.getEntrustType() == ContractEntrustOrderEntity.ENTRUST_TYPE_OPEN_MORE) { OrderModel model = new OrderModel(entrustOrderEntity.getId(), RabbitPriceTypeEnum.ENTRUST_OPEN_MORE.getValue(), submitEntrustDto.getEntrustPrice().setScale(8, RoundingMode.HALF_UP).toPlainString(), submitEntrustDto.getSymbol(), entrustOrderEntity.getMemberId()); producer.sendPriceOperate(JSONObject.toJSONString(model)); LogRecordUtils.insertMemberAccountFlow(memberEntity.getId(), entrustTotalAmount, walletContract.getAvailableBalance().subtract(entrustTotalAmount), submitEntrustDto.getSymbol(), "委托买涨", "买涨:" + submitEntrustDto.getSymbol()); } else { OrderModel model = new OrderModel(entrustOrderEntity.getId(), RabbitPriceTypeEnum.ENTRUST_OPEN_LESS.getValue(), submitEntrustDto.getEntrustPrice().setScale(8, RoundingMode.HALF_UP).toPlainString(), submitEntrustDto.getSymbol(), entrustOrderEntity.getMemberId()); producer.sendPriceOperate(JSONObject.toJSONString(model)); LogRecordUtils.insertMemberAccountFlow(memberEntity.getId(), entrustTotalAmount, walletContract.getAvailableBalance().subtract(entrustTotalAmount), submitEntrustDto.getSymbol(), "委托买跌", "买跌:" + submitEntrustDto.getSymbol()); } return Result.ok(MessageSourceUtils.getString("result_success_msg")); } else { return Result.fail(MessageSourceUtils.getString("result_fail_msg")); } } private Result entrustForWhole(SubmitEntrustDto submitEntrustDto, MemberEntity memberEntity) { BigDecimal lotNumber = cacheSettingUtils.getSymbolSku(submitEntrustDto.getSymbol()); PlatformTradeSettingEntity tradeSettingEntity = cacheSettingUtils.getTradeSetting(); MemberWalletContractEntity walletContract = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberEntity.getId(), CoinTypeConvert.convertContractTypeToCoin(submitEntrustDto.getSymbol())); ContractHoldOrderEntity holdOrderEntity = contractHoldOrderDao.selectWholeHoldOrderByOrderType(memberEntity.getId(), submitEntrustDto.getEntrustType(), submitEntrustDto.getSymbol()); BigDecimal bondAmount; BigDecimal openFeePrice; BigDecimal entrustTotalAmount; // 保证金计算 -- 建仓价X规格X手数X(1/杠杆倍率) bondAmount = CalculateUtil.getBondAmount(submitEntrustDto.getEntrustPrice(), lotNumber, submitEntrustDto.getSymbolCnt(), submitEntrustDto.getLeverRatio()); // 开仓手续费 建仓价*规格*手数*手续费率 openFeePrice = CalculateUtil.getOpenFeePrice(submitEntrustDto.getEntrustPrice(), lotNumber, submitEntrustDto.getSymbolCnt(), tradeSettingEntity.getFeeRatio()); log.info("手续费:{}", openFeePrice); // 预付款 entrustTotalAmount = bondAmount.add(openFeePrice).add(openFeePrice); log.info("预付款:{}", entrustTotalAmount); if (entrustTotalAmount.compareTo(walletContract.getAvailableBalance()) > -1) { throw new GlobalException(MessageSourceUtils.getString("member_service_0085")); } ContractEntrustOrderEntityMapper convert = ContractEntrustOrderEntityMapper.INSTANCE; ContractEntrustOrderEntity entrustOrderEntity = convert.submitEntrustDtoToEntity(submitEntrustDto); entrustOrderEntity.setOrderNo(commonService.generateOrderNo(memberEntity.getId())); entrustOrderEntity.setMemberId(memberEntity.getId()); entrustOrderEntity.setBondAmount(bondAmount.add(openFeePrice)); entrustOrderEntity.setSymbolSku(lotNumber); entrustOrderEntity.setEntrustAmount(entrustTotalAmount); entrustOrderEntity.setPositionType(ContractEntrustOrderEntity.POSITION_TYPE_ALL); int i = contractEntrustOrderDao.insert(entrustOrderEntity); memberWalletContractDao.increaseWalletContractBalanceById(entrustTotalAmount.negate(), null, entrustOrderEntity.getBondAmount(), walletContract.getId()); if (i > 0) { // 发送委托单队列消息 if (submitEntrustDto.getEntrustType() == ContractEntrustOrderEntity.ENTRUST_TYPE_OPEN_MORE) { OrderModel model = new OrderModel(entrustOrderEntity.getId(), RabbitPriceTypeEnum.ENTRUST_OPEN_MORE.getValue(), submitEntrustDto.getEntrustPrice().setScale(8, RoundingMode.HALF_UP).toPlainString(), submitEntrustDto.getSymbol(), entrustOrderEntity.getMemberId()); producer.sendPriceOperate(JSONObject.toJSONString(model)); LogRecordUtils.insertMemberAccountFlow(memberEntity.getId(), entrustTotalAmount, walletContract.getAvailableBalance().subtract(entrustTotalAmount), submitEntrustDto.getSymbol(), "委托买涨", "买涨:" + submitEntrustDto.getSymbol()); } else { OrderModel model = new OrderModel(entrustOrderEntity.getId(), RabbitPriceTypeEnum.ENTRUST_OPEN_LESS.getValue(), submitEntrustDto.getEntrustPrice().setScale(8, RoundingMode.HALF_UP).toPlainString(), submitEntrustDto.getSymbol(), entrustOrderEntity.getMemberId()); producer.sendPriceOperate(JSONObject.toJSONString(model)); LogRecordUtils.insertMemberAccountFlow(memberEntity.getId(), entrustTotalAmount, walletContract.getAvailableBalance().subtract(entrustTotalAmount), submitEntrustDto.getSymbol(), "委托买跌", "买跌:" + submitEntrustDto.getSymbol()); } ThreadPoolUtils.sendWholeForceClosingPrice(submitEntrustDto.getSymbol(), memberEntity); return Result.ok(MessageSourceUtils.getString("result_success_msg")); } else { return Result.fail(MessageSourceUtils.getString("result_fail_msg")); } } @Override @@ -251,22 +182,6 @@ if (entrustOrderEntity == null) { return Result.fail(MessageSourceUtils.getString("entrust_order_not_exist")); } MemberWalletContractEntity walletContractEntity; if (ContractEntrustOrderEntity.POSITION_TYPE_ADD == entrustOrderEntity.getPositionType()) { walletContractEntity = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberEntity.getId(), MemberWalletCoinEnum.WALLETCOINCODE.getValue()); BigDecimal total = entrustOrderEntity.getEntrustAmount(); memberWalletContractDao.increaseWalletContractBalanceById(total, null, entrustOrderEntity.getBondAmount().negate(), walletContractEntity.getId()); // 插入财务流水 LogRecordUtils.insertMemberAccountFlow(memberEntity.getId(), total, walletContractEntity.getAvailableBalance().add(total), entrustOrderEntity.getSymbol(), "撤销委托单", "撤销委托单"); } else { walletContractEntity = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberEntity.getId(), CoinTypeConvert.convertContractTypeToCoin(entrustOrderEntity.getSymbol())); memberWalletContractDao.increaseWalletContractBalanceById(entrustOrderEntity.getEntrustAmount(), null, entrustOrderEntity.getBondAmount().negate(), walletContractEntity.getId()); } ContractOrderEntity orderEntity = ContractEntrustOrderEntityMapper.INSTANCE.entrustOrderToOrder(entrustOrderEntity); orderEntity.setTradeType(ContractOrderEntity.TRADE_TYPE_MARK_PRICE); orderEntity.setOrderStatus(ContractOrderEntity.ORDER_STATUS_CANCEL); @@ -284,6 +199,13 @@ contractEntrustOrderDao.deleteById(entrustOrderEntity.getId()); if (i > 0) { MemberWalletContractEntity walletContractEntity = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberEntity.getId(), CoinTypeEnum.USDT.name()); BigDecimal total = entrustOrderEntity.getEntrustAmount(); memberWalletContractDao.increaseWalletContractBalanceById(total, null, entrustOrderEntity.getBondAmount().negate(), walletContractEntity.getId()); // 插入财务流水 LogRecordUtils.insertMemberAccountFlow(memberEntity.getId(), total, walletContractEntity.getAvailableBalance().add(total), entrustOrderEntity.getSymbol(), "撤销委托单", "撤销委托单"); if (ContractEntrustOrderEntity.POSITION_TYPE_ALL == entrustOrderEntity.getPositionType()) { ThreadPoolUtils.sendWholeForceClosingPrice(entrustOrderEntity.getSymbol(), memberEntity); } @@ -349,9 +271,6 @@ closeType = ContractOrderEntity.ORDER_TYPE_CLOSE_LESS; } MemberWalletContractEntity walletContract = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(member.getId(), CoinTypeConvert.convertContractTypeToCoin(holdOrderEntity.getSymbol())); BigDecimal lotNumber = cacheSettingUtils.getSymbolSku(holdOrderEntity.getSymbol()); BigDecimal bondAmount = CalculateUtil.getBondAmount(holdOrderEntity.getOpeningPrice(), lotNumber, submitCloseEntrustDto.getSymbolCnt(), holdOrderEntity.getLeverRatio()); @@ -369,9 +288,6 @@ entrustOrder.setSymbol(holdOrderEntity.getSymbol()); int i = contractEntrustOrderDao.insert(entrustOrder); // memberWalletContractDao.increaseWalletContractBalanceById(null, null, bondAmount, walletContract.getId()); if (i > 0) { // 发送委托消息 src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java
@@ -131,7 +131,7 @@ 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()); @@ -731,17 +731,15 @@ List<ContractEntrustOrderEntity> entrustOrderEntities; List<ContractHoldOrderEntity> holdOrderEntities; MemberWalletContractEntity walletContractEntity; 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()); 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)); } // 冻结保证金 -- 即委托单中的保证金之和 @@ -790,15 +788,6 @@ ContractMoneyInfoVo contractMoneyInfoVo = new ContractMoneyInfoVo(); // 权益 BigDecimal equity = walletContractEntity.getTotalBalance().add(totalProfitOrLess); // 全仓模式,可用余额需随着盈亏变动 if (memberEntity.getContractPositionType() == ContractEntrustOrderEntity.POSITION_TYPE_ALL) { BigDecimal available = walletContractEntity.getAvailableBalance().add(totalProfitOrLess); if (available.compareTo(BigDecimal.ZERO) < 0) { available = BigDecimal.ZERO; } contractMoneyInfoVo.setAvailableBalance(available); } contractMoneyInfoVo.setBeUsedBondAmount(beUsedBondAmount); contractMoneyInfoVo.setFrozenBondAmount(frozenBondAmount); src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java
@@ -3,6 +3,7 @@ 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; @@ -185,12 +186,7 @@ // 本次需要退回的保证金 BigDecimal prePrice = order.getBondAmount(); Long memberId = order.getMemberId(); MemberWalletContractEntity wallet; if (order.getPositionType() == ContractEntrustOrderEntity.POSITION_TYPE_ADD) { wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, "USDT"); } else { wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeConvert.convertContractTypeToCoin(order.getSymbol())); } MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeEnum.USDT.name()); if (wallet != null) { // 历史订单 @@ -290,12 +286,8 @@ // 本次需要退回的预付款 BigDecimal prePrice = order.getBondAmount(); Long memberId = order.getMemberId(); MemberWalletContractEntity wallet; if (order.getPositionType() == ContractEntrustOrderEntity.POSITION_TYPE_ADD) { wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, "USDT"); } else { wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeConvert.convertContractTypeToCoin(order.getSymbol())); } MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeEnum.USDT.name()); if (wallet != null) { // 历史订单 ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(order); @@ -395,12 +387,7 @@ Long memberId = order.getMemberId(); // 本次需要退回的预付款 BigDecimal prePrice = order.getBondAmount(); MemberWalletContractEntity wallet; if (order.getPositionType() == ContractEntrustOrderEntity.POSITION_TYPE_ADD) { wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, "USDT"); } else { wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeConvert.convertContractTypeToCoin(order.getSymbol())); } MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeEnum.USDT.name()); if (wallet != null) { // 历史订单 @@ -497,12 +484,7 @@ Long memberId = order.getMemberId(); // 本次需要退回的预付款 BigDecimal prePrice = order.getBondAmount(); MemberWalletContractEntity wallet; if (order.getPositionType() == ContractEntrustOrderEntity.POSITION_TYPE_ADD) { wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, "USDT"); } else { wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeConvert.convertContractTypeToCoin(order.getSymbol())); } MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeEnum.USDT.name()); if (wallet != null) { // 历史订单 @@ -686,7 +668,7 @@ } i++; } MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(entrustOrder.getMemberId(), CoinTypeConvert.convertContractTypeToCoin(entrustOrder.getSymbol())); MemberWalletContractEntity wallet = memberWalletContractService.findWalletContractByMemberIdAndSymbol(entrustOrder.getMemberId(), CoinTypeEnum.USDT.name()); PlatformTradeSettingEntity tradeSettingEntity = cacheSettingUtils.getTradeSetting(); MemberEntity member = memberService.getById(entrustOrder.getMemberId()); src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java
@@ -259,7 +259,7 @@ MemberEntity memberEntity = memberDao.selectById(holdOrderEntity.getMemberId()); MemberWalletContractEntity walletContract = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(holdOrderEntity.getMemberId(), CoinTypeConvert.convertContractTypeToCoin(symbol)); MemberWalletContractEntity walletContract = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(holdOrderEntity.getMemberId(), CoinTypeEnum.USDT.name()); if (walletContract != null) { BigDecimal lotNumber = cacheSettingUtils.getSymbolSku(symbol); // 盈亏 @@ -380,7 +380,7 @@ String symbol = entrustOrder.getSymbol(); MemberEntity memberEntity = memberDao.selectById(memberId); MemberWalletContractEntity walletContract = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeConvert.convertContractTypeToCoin(symbol)); MemberWalletContractEntity walletContract = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeEnum.USDT.name()); BigDecimal lotNumber = cacheSettingUtils.getSymbolSku(symbol); src/main/java/com/xcong/excoin/utils/CalculateUtil.java
@@ -6,7 +6,6 @@ import com.xcong.excoin.common.enumerates.CoinTypeEnum; import com.xcong.excoin.common.enumerates.RabbitPriceTypeEnum; import com.xcong.excoin.common.exception.GlobalException; import com.xcong.excoin.common.response.Result; import com.xcong.excoin.modules.contract.dao.ContractHoldOrderDao; import com.xcong.excoin.modules.contract.entity.ContractHoldOrderEntity; import com.xcong.excoin.modules.member.dao.MemberWalletContractDao; @@ -22,7 +21,6 @@ import javax.validation.constraints.NotNull; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; import java.util.List; /** @@ -85,142 +83,92 @@ /** * 全仓模式 -- 预估强平价 * 面值*(多单张数*多单开仓价-空单张数*空单开仓价)-余额-已实现盈亏 / 面值*(多单张数-空单张数)-(维持保证金率+TAKER手续费)*面值*(开多张数+开空张数) * 开仓价 - (权益 - 其他币种成本)/当前币种成本 * (开仓价 * 杠杆) */ public static void getForceSetPriceForWhole(@NotNull String symbol, @NotNull MemberEntity memberEntity) { public static void getForceSetPriceForWhole(@NotNull String aa, @NotNull MemberEntity memberEntity) { ContractHoldOrderDao holdOrderDao = SpringContextHolder.getBean(ContractHoldOrderDao.class); MemberWalletContractDao walletContractDao = SpringContextHolder.getBean(MemberWalletContractDao.class); Long memberId = memberEntity.getId(); MemberWalletContractEntity walletContract = walletContractDao.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeConvert.convertContractTypeToCoin(symbol)); List<ContractHoldOrderEntity> holdOrderEntities = holdOrderDao.selectHoldOrderListForWholeByMemberIdAndSymbol(memberId, symbol); MemberWalletContractEntity walletContract = walletContractDao.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeEnum.USDT.name()); List<ContractHoldOrderEntity> holdOrderEntities = holdOrderDao.selectHoldOrderListForWholeByMemberIdAndSymbol(memberId, null); List<String> symbols = holdOrderDao.selectWholeHoldOrderSymbolsByMemberId(memberId); if (CollUtil.isNotEmpty(holdOrderEntities)) { int maxCnt = 0; int subCnt = 0; BigDecimal openPrice = BigDecimal.ZERO; int type = 1; BigDecimal bondAmount = BigDecimal.ZERO; BigDecimal sku = BigDecimal.ZERO; Long id = 0L; int operateNo = 0; for (ContractHoldOrderEntity holdOrderEntity : holdOrderEntities) { if (holdOrderEntity.getSymbolCntSale() >= maxCnt) { int temp = maxCnt; maxCnt = holdOrderEntity.getSymbolCntSale(); subCnt = holdOrderEntity.getSymbolCntSale() - temp; openPrice = holdOrderEntity.getOpeningPrice(); type = holdOrderEntity.getOpeningType(); for (String symbol : symbols) { // 其他币种成本 BigDecimal totalBondAmount = BigDecimal.ZERO; // 当前币种手续费 BigDecimal symbolFeeAmount = BigDecimal.ZERO; // 当前币种保证金 BigDecimal symbolBondAmount = BigDecimal.ZERO; id = holdOrderEntity.getId(); operateNo = holdOrderEntity.getOperateNo() + 1; } else { subCnt = maxCnt - holdOrderEntity.getSymbolCntSale(); // 开仓均价 BigDecimal openPrice = BigDecimal.ZERO; // 总盈亏 BigDecimal profitOrLoss = BigDecimal.ZERO; // 杠杆 int leverRatio = 0; for (ContractHoldOrderEntity holdOrderEntity : holdOrderEntities) { BigDecimal bondAmount = holdOrderEntity.getBondAmount().subtract(holdOrderEntity.getOpeningFeeAmount()); if (symbol.equalsIgnoreCase(holdOrderEntity.getSymbol())) { symbolFeeAmount = symbolFeeAmount.add(holdOrderEntity.getOpeningFeeAmount()); symbolBondAmount = symbolBondAmount.add(bondAmount); if (openPrice.compareTo(BigDecimal.ZERO) == 0) { openPrice = holdOrderEntity.getOpeningPrice(); } else { openPrice = openPrice.add(holdOrderEntity.getOpeningPrice()).divide(BigDecimal.valueOf(2), 8, BigDecimal.ROUND_DOWN); } leverRatio = holdOrderEntity.getLeverRatio(); } else { totalBondAmount = totalBondAmount.add(holdOrderEntity.getBondAmount()); } profitOrLoss = profitOrLoss.add(calProfitOrLoss(holdOrderEntity, memberEntity)); } bondAmount = bondAmount.add(holdOrderEntity.getBondAmount().subtract(holdOrderEntity.getOpeningFeeAmount())); sku = holdOrderEntity.getSymbolSku(); } BigDecimal forceSetPrice = BigDecimal.ZERO; if (subCnt != 0) { log.info("---->{}, {}", walletContract.getAvailableBalance(), bondAmount); forceSetPrice = getForceSetPrice(walletContract.getAvailableBalance().add(bondAmount), openPrice, subCnt, sku, type, memberEntity); } log.info("{}, {}, {}, {}, {}, {}", totalBondAmount, symbolFeeAmount, symbolFeeAmount, openPrice, profitOrLoss, leverRatio); BigDecimal sub = walletContract.getTotalBalance().add(profitOrLoss).subtract(symbolFeeAmount).subtract(totalBondAmount); log.info("sub -- {}", sub); BigDecimal divide = sub.divide(symbolBondAmount, 8, BigDecimal.ROUND_DOWN); log.info("divide -- {}", divide); BigDecimal divide2 = openPrice.divide(BigDecimal.valueOf(leverRatio), 8, BigDecimal.ROUND_DOWN); log.info("divide2 -- {}", divide2); log.info("强平价:{}", forceSetPrice); for (ContractHoldOrderEntity updateHoldOrder : holdOrderEntities) { updateHoldOrder.setForceClosingPrice(forceSetPrice); updateHoldOrder.setIsCanClosing(ContractHoldOrderEntity.ORDER_CAN_CLOSING_Y); updateHoldOrder.setOperateNo(operateNo); holdOrderDao.updateById(updateHoldOrder); } if (forceSetPrice.compareTo(BigDecimal.ZERO) > 0) { log.info("id:{}, type:{}, forceSetPrice:{}, symbol:{}, operateNo:{}", id, type, forceSetPrice, symbol, operateNo); sendOrderBombMsg(id, type, forceSetPrice, symbol, operateNo, memberEntity.getId()); BigDecimal forcePrice = openPrice.subtract(divide.multiply(divide2)); log.info("forcePrice -- {}", forcePrice); } } } /* BigDecimal totalSetPrice = BigDecimal.ZERO; int totalCnt = 0; private static BigDecimal calProfitOrLoss(ContractHoldOrderEntity holdOrderEntity, MemberEntity memberEntity) { CacheSettingUtils cacheSettingUtils = SpringContextHolder.getBean(CacheSettingUtils.class); RedisUtils redisUtils = SpringContextHolder.getBean(RedisUtils.class); BigDecimal lotNumber = cacheSettingUtils.getSymbolSku(holdOrderEntity.getSymbol()); BigDecimal newPrice = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey(holdOrderEntity.getSymbol()))); for (ContractHoldOrderEntity holdOrderEntity : holdOrderEntities) { BigDecimal forceSetPrice = getForceSetPrice(walletContract.getTotalBalance().subtract(holdOrderEntity.getOpeningFeeAmount()), holdOrderEntity.getOpeningPrice(), holdOrderEntity.getSymbolCntSale(), holdOrderEntity.getSymbolSku(), holdOrderEntity.getOpeningType(), memberEntity); log.info("订单强平价 : {}, 订单ID : {}, {}", forceSetPrice, holdOrderEntity.getId(), holdOrderEntity.getSymbolCntSale()); totalSetPrice = totalSetPrice.add(forceSetPrice.multiply(BigDecimal.valueOf(holdOrderEntity.getSymbolCntSale()))); totalCnt += holdOrderEntity.getSymbolCntSale(); log.info("-->{}", totalCnt); // 盈亏 BigDecimal rewardRatio = BigDecimal.ZERO; // 开多 if (ContractHoldOrderEntity.OPENING_TYPE_MORE == holdOrderEntity.getOpeningType()) { // (最新价-开仓价)*规格*张数 rewardRatio = newPrice.subtract(holdOrderEntity.getOpeningPrice()).multiply(lotNumber).multiply(new BigDecimal(holdOrderEntity.getSymbolCntSale())); // 开空 } else { // (开仓价-最新价)*规格*张数 rewardRatio = holdOrderEntity.getOpeningPrice().subtract(newPrice).multiply(lotNumber).multiply(new BigDecimal(holdOrderEntity.getSymbolCntSale())); } 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())); } } BigDecimal forceSetPrice = totalSetPrice.divide(BigDecimal.valueOf(totalCnt), 8, BigDecimal.ROUND_DOWN); log.info("强平价 : {}", forceSetPrice); for (ContractHoldOrderEntity updateHoldOrder : holdOrderEntities) { updateHoldOrder.setForceClosingPrice(forceSetPrice); updateHoldOrder.setIsCanClosing(ContractHoldOrderEntity.ORDER_CAN_CLOSING_Y); holdOrderDao.updateById(updateHoldOrder); if (forceSetPrice.compareTo(BigDecimal.ZERO) >= 0) { sendOrderBombMsg(updateHoldOrder.getId(), updateHoldOrder.getOpeningType(), forceSetPrice, updateHoldOrder.getSymbol(), updateHoldOrder.getOperateNo()); } } */ /* // 多单开仓价 BigDecimal moreOpenPrice = BigDecimal.ZERO; // 多单张数 int moreCnt = 0; // 空单开仓价 BigDecimal lessOpenPrice = BigDecimal.ZERO; // 空单张数 int lessCnt = 0; // 已实现盈亏 BigDecimal rewardAmount = BigDecimal.ZERO; for (ContractHoldOrderEntity holdOrderEntity : holdOrderEntities) { if (holdOrderEntity.getOpeningType() == ContractHoldOrderEntity.OPENING_TYPE_MORE) { moreOpenPrice = holdOrderEntity.getOpeningPrice(); moreCnt = holdOrderEntity.getSymbolCntSale(); } else { lessOpenPrice = holdOrderEntity.getOpeningPrice(); lessCnt = holdOrderEntity.getSymbolCntSale(); } rewardAmount = rewardAmount.add(holdOrderEntity.getRewardAmount() == null ? BigDecimal.ZERO : holdOrderEntity.getRewardAmount()); log.info("rewardAmount : {}", rewardAmount); } // 多单张数*多单开仓价-空单张数*空单开仓价 BigDecimal allOrderPrice = moreOpenPrice.multiply(BigDecimal.valueOf(moreCnt)).subtract(lessOpenPrice.multiply(BigDecimal.valueOf(lessCnt))); log.info("allOrderPrice : {}", allOrderPrice); // 除数 -- 面值*(多单张数*多单开仓价-空单张数*空单开仓价)-余额-已实现盈亏 BigDecimal divisor = lotNumber.multiply(allOrderPrice).subtract(walletContract.getAvailableBalance()).subtract(rewardAmount); log.info("divisor : {}", divisor); // 面值*(多单张数-空单张数) BigDecimal dividendOne = lotNumber.multiply(BigDecimal.valueOf(moreCnt + lessCnt)); log.info("dividendOne : {}", dividendOne); // (维持保证金率+TAKER手续费)*面值*(开多张数+开空张数) BigDecimal dividendTwo = tradeSettingEntity.getFeeRatio().multiply(lotNumber).multiply(BigDecimal.valueOf(moreCnt + lessCnt)); log.info("dividendTwo : {}", dividendTwo); BigDecimal forceSetPrice = divisor.divide(dividendOne.subtract(dividendTwo), 8, BigDecimal.ROUND_DOWN); log.info("forceSetPrice : {}", forceSetPrice); for (ContractHoldOrderEntity updateHoldOrder : holdOrderEntities) { updateHoldOrder.setForceClosingPrice(forceSetPrice); updateHoldOrder.setIsCanClosing(ContractHoldOrderEntity.ORDER_CAN_CLOSING_Y); holdOrderDao.updateById(updateHoldOrder); if (forceSetPrice.compareTo(BigDecimal.ZERO) >= 0) { sendOrderBombMsg(updateHoldOrder.getId(), updateHoldOrder.getOpeningType(), forceSetPrice, updateHoldOrder.getSymbol(), updateHoldOrder.getOperateNo()); } } */ return rewardRatio; } private static void sendOrderBombMsg(Long id, int type, BigDecimal forceClosingPrice, String symbol, int operateNo, Long memberId) { OrderModel model = null; src/main/resources/mapper/contract/ContractHoldOrderDao.xml
@@ -61,7 +61,9 @@ <select id="selectHoldOrderListForWholeByMemberIdAndSymbol" resultType="com.xcong.excoin.modules.contract.entity.ContractHoldOrderEntity"> select * from contract_hold_order where member_id=#{memberId} and symbol=#{symbol} <if test="symbol != null and symbol != ''"> and symbol=#{symbol} </if> and position_type=2 order by create_time desc </select> @@ -74,4 +76,10 @@ where position_type=2 group by member_id, symbol </select> <select id="selectWholeHoldOrderSymbolsByMemberId" resultType="java.lang.String"> select distinct symbol from contract_hold_order where position_type=2 and member_id=#{memberId} </select> </mapper>