From 3ea1ad735be11d1d4b1629064916dac476fdd5c1 Mon Sep 17 00:00:00 2001
From: xiaoyong931011 <15274802129@163.com>
Date: Mon, 17 May 2021 18:08:04 +0800
Subject: [PATCH] 20210517 云顶
---
src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java | 236 +++++++++++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 204 insertions(+), 32 deletions(-)
diff --git a/src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java b/src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java
index 0113a35..1d8078e 100644
--- a/src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java
+++ b/src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java
@@ -1,13 +1,16 @@
package com.xcong.excoin.modules.contract.service.impl;
import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.xcong.excoin.common.contants.AppContants;
import com.xcong.excoin.common.enumerates.CoinTypeEnum;
+import com.xcong.excoin.common.enumerates.MemberWalletCoinEnum;
import com.xcong.excoin.common.enumerates.OrderClosingTypeEnum;
import com.xcong.excoin.common.system.service.CommonService;
import com.xcong.excoin.modules.coin.entity.MemberAccountFlowEntity;
+import com.xcong.excoin.modules.coin.entity.MemberAccountMoneyChange;
import com.xcong.excoin.modules.contract.dao.ContractEntrustOrderDao;
import com.xcong.excoin.modules.contract.dao.ContractHoldOrderDao;
import com.xcong.excoin.modules.contract.dao.ContractOrderDao;
@@ -35,6 +38,8 @@
import com.xcong.excoin.modules.member.entity.MemberWalletContractEntity;
import com.xcong.excoin.modules.platform.entity.PlatformTradeSettingEntity;
import com.xcong.excoin.rabbit.pricequeue.OrderModel;
+import com.xcong.excoin.rabbit.pricequeue.whole.HoldOrderDataModel;
+import com.xcong.excoin.rabbit.pricequeue.whole.WholePriceDataModel;
import com.xcong.excoin.utils.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -94,24 +99,36 @@
if (ids.size() == 1) {
ContractHoldOrderEntity holdOrderEntity = contractHoldOrderDao.selectById(ids.get(0));
- // 判断仓位类型是否逐仓
- if (holdOrderEntity.getPositionType() == ContractEntrustOrderEntity.POSITION_TYPE_ADD) {
- // 逐仓平仓
- cancelHoldOrderMethod(holdOrderEntity);
+ if (holdOrderEntity != null) {
+ // 判断仓位类型是否逐仓
+ if (holdOrderEntity.getPositionType() == ContractEntrustOrderEntity.POSITION_TYPE_ADD) {
+ // 逐仓平仓
+ cancelHoldOrderMethod(holdOrderEntity);
+ } else {
+ // 全仓模式平仓
+ closingWholeOrder(holdOrderEntity);
+ }
} else {
- // 全仓模式平仓
- closingWholeOrder(holdOrderEntity);
+ log.info("持仓订单为空: {}", ids.get(0));
}
} else {
List<ContractHoldOrderEntity> holdOrderEntities = contractHoldOrderDao.selectBatchIds(ids);
if (CollUtil.isNotEmpty(holdOrderEntities)) {
for (ContractHoldOrderEntity holdOrder : holdOrderEntities) {
- cancelHoldOrderMethod(holdOrder);
+ // 判断仓位类型是否逐仓
+ if (holdOrder.getPositionType() == ContractEntrustOrderEntity.POSITION_TYPE_ADD) {
+ // 逐仓平仓
+ cancelHoldOrderMethod(holdOrder);
+ } else {
+ // 全仓模式平仓
+ closingWholeOrder(holdOrder);
+ }
}
}
}
} catch (Exception e) {
log.error("平仓异常", e);
+ throw e;
}
}
@@ -165,12 +182,12 @@
// 盈亏比例(回报率)
BigDecimal rewardRatio = profitOrLoss.divide(holdOrderEntity.getBondAmount().subtract(holdOrderEntity.getOpeningFeeAmount()), 8, BigDecimal.ROUND_DOWN);
- FollowTraderInfoEntity traderInfoEntity = null;
+ FollowTraderInfoEntity traderInfoEntity = followTraderInfoDao.selectTraderInfoByOrderId(holdOrderEntity.getId());
// 判断当前订单是否为跟单
if (ContractOrderEntity.CONTRACTTYPE_DOCUMENTARY == holdOrderEntity.getContractType()) {
- // 若不为交易员,则计算跟随者订单返利
- if (!MemberEntity.IS_TRADER_Y.equals(memberEntity.getIsTrader())) {
- traderInfoEntity = followTraderInfoDao.selectTraderInfoByOrderId(holdOrderEntity.getId());
+ // 若不为交易员且不是测试账号,则计算跟随者订单返利
+ if (!MemberEntity.IS_TRADER_Y.equals(memberEntity.getIsTrader()) &&
+ !MemberEntity.ACCOUNT_TYPE_TEST.equals(memberEntity.getAccountType())) {
if (profitOrLoss.compareTo(BigDecimal.ZERO) > 0) {
// 计算需返利给交易员的金额
BigDecimal returnMoney = profitOrLoss.multiply(traderInfoEntity.getProfitRatio());
@@ -178,6 +195,25 @@
MemberWalletContractEntity traderWallet = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(traderInfoEntity.getMemberId(), CoinTypeEnum.USDT.name());
memberWalletContractDao.increaseWalletContractBalanceById(returnMoney, returnMoney, null, traderWallet.getId());
insertReturnProfitDetail(traderInfoEntity.getMemberId(), memberEntity.getId(), returnMoney, holdOrderEntity.getOrderNo());
+ //增加返佣提醒
+// String orderNo = holdOrderEntity.getOrderNo();
+// LogRecordUtils.insertFollowerNotice(traderInfoEntity.getMemberId(),
+// NoticeConstant.RETURN_MONEY_TITLE,
+// StrUtil.format(NoticeConstant.RETURN_MONEY_CONTENT,
+// orderNo,
+// holdOrderEntity.getSymbol(),
+// returnMoney.setScale(2, BigDecimal.ROUND_HALF_UP).toString()));
+// //带单返利的记录要在资产页面的其他记录
+// LogRecordUtils.insertMemberAccountMoneyChange(
+// traderInfoEntity.getMemberId(),
+// StrUtil.format(NoticeConstant.RETURN_MONEY_CONTENT_MAMC,
+// orderNo,
+// holdOrderEntity.getSymbol(),
+// returnMoney.setScale(2, BigDecimal.ROUND_HALF_UP).toString()),
+// returnMoney.setScale(2, BigDecimal.ROUND_HALF_UP),
+// MemberWalletCoinEnum.WALLETCOINCODE.getValue(),
+// MemberAccountMoneyChange.STATUS_SUCCESS_INTEGER,
+// MemberAccountMoneyChange.TYPE_WALLET_AGENT);
}
}
}
@@ -211,8 +247,8 @@
if (MemberEntity.IS_TRADER_Y.equals(memberEntity.getIsTrader())) {
followOrderOperationService.closingFollowOrders(holdOrderEntity.getOrderNo());
} else {
- followFollowerProfitDao.updateFollowerProfitByTradeMemberId(holdOrderEntity.getBondAmount().subtract(holdOrderEntity.getOpeningFeeAmount()), profitOrLoss, traderInfoEntity.getMemberId(), memberEntity.getId());
- LogRecordUtils.insertFollowerNotice(memberEntity.getId(), NoticeConstant.CLOSE_ORDER_TITLE, StrUtil.format(NoticeConstant.CLOSE_ORDER_CONTENT, contractOrderEntity.getSymbol(), contractOrderEntity.getClosingPrice(), profitOrLoss, traderInfoEntity.getNickname()));
+ //followFollowerProfitDao.updateFollowerProfitByTradeMemberId(holdOrderEntity.getBondAmount(), profitOrLoss, traderInfoEntity.getMemberId(), memberEntity.getId());
+ LogRecordUtils.insertFollowerNotice(memberEntity.getId(), NoticeConstant.CLOSE_ORDER_TITLE, StrUtil.format(NoticeConstant.CLOSE_ORDER_CONTENT, contractOrderEntity.getSymbol(), contractOrderEntity.getClosingPrice().setScale(2, BigDecimal.ROUND_HALF_UP).toString(), profitOrLoss.setScale(2, BigDecimal.ROUND_HALF_UP).toString(), traderInfoEntity.getNickname()));
}
}
}
@@ -271,6 +307,11 @@
// 获取平仓张数
Integer closeCnt = (Integer) redisUtils.get(AppContants.CLOSING_ORDER_PREFIX + holdOrderEntity.getId());
+ // 无法从redis中获取平仓张数,说明来自一键平仓
+ if (closeCnt == null) {
+ closeCnt = holdOrderEntity.getSymbolCntSale();
+ holdOrderEntity.setSymbolCntSale(0);
+ }
MemberSettingEntity memberSettingEntity = memberSettingDao.selectMemberSettingByMemberId(memberEntity.getId());
// 开多
@@ -299,6 +340,7 @@
}
log.info("profitOrLoss:{}", profitOrLoss);
+ BigDecimal rewardRatio = profitOrLoss.divide(holdOrderEntity.getBondAmount().subtract(holdOrderEntity.getOpeningFeeAmount()), 4, BigDecimal.ROUND_DOWN);
// 保证金
BigDecimal bondAmount = CalculateUtil.getBondAmount(holdOrderEntity.getOpeningPrice(), lotNumber, closeCnt, holdOrderEntity.getLeverRatio());
@@ -320,6 +362,7 @@
contractOrderEntity.setClosingType(closingType);
contractOrderEntity.setSymbolCnt(closeCnt);
contractOrderEntity.setRewardAmount(profitOrLoss);
+ contractOrderEntity.setRewardRatio(rewardRatio);
contractOrderEntity.setBondAmount(bondAmount.add(fee));
contractOrderEntity.setClosingFeeAmount(fee);
contractOrderEntity.setClosingTime(new Date());
@@ -350,6 +393,8 @@
log.info("totalMoney : {}", total);
memberWalletContractDao.increaseWalletContractBalanceById(changeAmount, total, null, walletContract.getId());
+
+ ThreadPoolUtils.sendWholePrice(memberEntity.getId());
ThreadPoolUtils.sendWholeForceClosingPrice(holdOrderEntity.getSymbol(), memberEntity);
// 计算佣金
@@ -440,11 +485,13 @@
contractOrderEntity.setEntrustOpeningPrice(newPrice);
contractOrderEntity.setEntrustTime(new Date());
contractOrderEntity.setClosingPrice(newPrice);
- contractOrderEntity.setOrderType(orderType);
+ contractOrderEntity.setTradeType(ContractOrderEntity.TRADE_TYPE_LIMIT_PRICE);
+ contractOrderEntity.setOrderType(entrustOrder.getEntrustType());
contractOrderEntity.setClosingType(closingType);
contractOrderEntity.setSymbolCnt(closeCnt);
contractOrderEntity.setRewardAmount(profitOrLoss);
contractOrderEntity.setBondAmount(bondAmount);
+ contractOrderEntity.setClosingTime(new Date());
contractOrderEntity.setClosingFeeAmount(fee);
contractOrderDao.insert(contractOrderEntity);
@@ -466,11 +513,73 @@
memberWalletContractDao.increaseWalletContractBalanceById(changeAmount, total, null, walletContract.getId());
contractEntrustOrderDao.deleteById(entrustOrder.getId());
+
+ ThreadPoolUtils.sendWholePrice(memberEntity.getId());
+
ThreadPoolUtils.sendWholeForceClosingPrice(holdOrderEntity.getSymbol(), memberEntity);
// 计算佣金
ThreadPoolUtils.calReturnMoney(memberEntity.getId(), fee, contractOrderEntity, AgentReturnEntity.ORDER_TYPE_CLOSE);
}
+ @Transactional(rollbackFor = Exception.class)
+ @Override
+ public void wholeBombOrder(WholePriceDataModel wholePriceData) {
+ MemberWalletContractEntity wallet = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(wholePriceData.getMemberId(), CoinTypeEnum.USDT.name());
+ MemberEntity memberEntity = memberDao.selectById(wholePriceData.getMemberId());
+ List<HoldOrderDataModel> list = wholePriceData.getList();
+ if (CollUtil.isNotEmpty(list)) {
+ String batchNo = IdUtil.randomUUID();
+ for (HoldOrderDataModel holdOrderDataModel : list) {
+ ContractHoldOrderEntity holdOrderEntity = contractHoldOrderDao.selectById(holdOrderDataModel.getId());
+ if (holdOrderEntity == null) {
+ log.info("持仓不存在:{}", holdOrderDataModel.getId());
+ redisUtils.del(AppContants.WHOLE_BOMB_PREFIX + wholePriceData.getMemberId());
+ continue;
+ }
+
+ holdOrderEntity.setStopLossPrice(CalculateUtil.calWholePriceTwo(memberEntity, holdOrderEntity, 2));
+ contractHoldOrderDao.deleteById(holdOrderDataModel.getId());
+
+ ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(holdOrderEntity);
+
+ if (holdOrderEntity.getOpeningType() == ContractHoldOrderEntity.OPENING_TYPE_MORE) {
+ contractOrderEntity.setClosingType(4);
+ } else {
+ contractOrderEntity.setClosingType(5);
+ }
+
+ BigDecimal rewardRatio = holdOrderDataModel.getRewardAmount().divide(holdOrderEntity.getBondAmount().subtract(holdOrderEntity.getOpeningFeeAmount()), 8, BigDecimal.ROUND_DOWN);
+ contractOrderEntity.setRewardRatio(rewardRatio);
+ contractOrderEntity.setRewardAmount(holdOrderDataModel.getRewardAmount().add(contractOrderEntity.getHoldBond().negate()));
+ contractOrderEntity.setClosingPrice(holdOrderDataModel.getClosingPrice());
+ contractOrderEntity.setForceClosingPrice(holdOrderDataModel.getClosingPrice());
+
+ // 订单状态转换
+ if (ContractOrderEntity.ORDER_TYPE_OPEN_MORE == contractOrderEntity.getOrderType()) {
+ contractOrderEntity.setOrderType(ContractOrderEntity.ORDER_TYPE_CLOSE_MORE);
+ } else {
+ contractOrderEntity.setOrderType(ContractOrderEntity.ORDER_TYPE_CLOSE_LESS);
+ }
+ contractOrderEntity.setClosingTime(new Date());
+ contractOrderEntity.setBatchNo(batchNo);
+ contractOrderDao.insert(contractOrderEntity);
+ }
+
+ List<ContractEntrustOrderEntity> entrustOrder = contractEntrustOrderDao.selectEntrustOrderListByMemberId(wholePriceData.getMemberId());
+ BigDecimal totalAmount = BigDecimal.ZERO;
+ if (CollUtil.isNotEmpty(entrustOrder)) {
+ for (ContractEntrustOrderEntity contractEntrustOrderEntity : entrustOrder) {
+ totalAmount = totalAmount.add(contractEntrustOrderEntity.getEntrustAmount());
+ }
+ }
+
+ memberWalletContractDao.increaseWalletContractBalanceById(wallet.getAvailableBalance().negate(), wallet.getTotalBalance().subtract(totalAmount).negate(), null, wallet.getId());
+
+ redisUtils.del(AppContants.WHOLE_BOMB_PREFIX + wholePriceData.getMemberId());
+ } else {
+ log.info("参数有误:{}", memberEntity.getId());
+ }
+ }
@Transactional(rollbackFor = Exception.class)
@Override
@@ -483,7 +592,9 @@
Map<Object, Object> value = redisUtils.hmget(AppContants.WHOLE_BOMB_PREFIX + memberId);
if (CollUtil.isNotEmpty(holdOrderEntities)) {
- PlatformTradeSettingEntity tradeSetting = cacheSettingUtils.getTradeSetting();
+ BigDecimal maxLess = BigDecimal.ZERO;
+ ContractOrderEntity maxLessEntity = null;
+ BigDecimal totalProfitOrLess = BigDecimal.ZERO;
for (ContractHoldOrderEntity holdOrderEntity : holdOrderEntities) {
// 删除次仓订单
contractHoldOrderDao.deleteById(holdOrderEntity.getId());
@@ -491,23 +602,7 @@
String symbolPrice = (String) value.get(holdOrderEntity.getSymbol());
log.info("symbolPrice : {}, symbol : {}", symbolPrice, holdOrderEntity.getSymbol());
BigDecimal currentPrice = new BigDecimal(symbolPrice);
- // 单个订单盈利
-// BigDecimal profitOrLess = BigDecimal.ZERO;
-// // 开多
-// if (ContractHoldOrderEntity.OPENING_TYPE_MORE == holdOrderEntity.getOpeningType()) {
-// profitOrLess = currentPrice.subtract(holdOrderEntity.getOpeningPrice()).multiply(new BigDecimal(holdOrderEntity.getSymbolCntSale())).multiply(lotNumber);
-// // 开空
-// } else {
-// profitOrLess = holdOrderEntity.getOpeningPrice().subtract(currentPrice).multiply(new BigDecimal(holdOrderEntity.getSymbolCntSale())).multiply(lotNumber);
-// }
-//
-// if (MemberEntity.IS_PROFIT_Y == memberEntity.getIsProfit()) {
-// if (profitOrLess.compareTo(BigDecimal.ZERO) > 0) {
-// profitOrLess = profitOrLess.multiply(BigDecimal.ONE.subtract(tradeSetting.getForceParam()));
-// } else {
-// profitOrLess = profitOrLess.multiply(BigDecimal.ONE.add(tradeSetting.getForceParam()));
-// }
-// }
+
BigDecimal profitOrLess = CalculateUtil.calOrderProfitOrLess(holdOrderEntity.getOpeningType(), currentPrice, holdOrderEntity.getOpeningPrice(), lotNumber, holdOrderEntity.getSymbolCntSale(), memberEntity.getIsProfit());
log.info("profitOrLess ---> {}", profitOrLess);
ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(holdOrderEntity);
@@ -525,6 +620,7 @@
contractOrderEntity.setRewardRatio(rewardRatio);
contractOrderEntity.setRewardAmount(profitOrLess);
contractOrderEntity.setClosingPrice(currentPrice);
+ contractOrderEntity.setForceClosingPrice(currentPrice);
// 订单状态转换
if (ContractOrderEntity.ORDER_TYPE_OPEN_MORE == contractOrderEntity.getOrderType()) {
@@ -554,4 +650,80 @@
}
}
}
+
+ /**
+ * 1 2 3
+ * 开仓价 - (权益 - 其他币种成本)/当前币种成本 * (开仓价 * 1/杠杆)
+ *
+ * @param dataModel
+ * @param holdOrder
+ * @return
+ */
+ private BigDecimal getForceSetPrice(WholePriceDataModel dataModel, ContractHoldOrderEntity holdOrder, String currentSymbol) {
+ Long memberId = holdOrder.getMemberId();
+ List<ContractHoldOrderEntity> holdOrderEntities = contractHoldOrderDao.selectHoldOrderListForWholeByMemberIdAndSymbol(memberId, null);
+ List<String> symbols = contractHoldOrderDao.selectWholeHoldOrderSymbolsByMemberId(memberId);
+
+ BigDecimal result = BigDecimal.ZERO;
+ if (CollUtil.isNotEmpty(holdOrderEntities)) {
+
+ for (String symbol : symbols) {
+ // 其他币种成本
+ BigDecimal totalBondAmount = BigDecimal.ZERO;
+ // 当前币种保证金
+ BigDecimal symbolBondAmount = BigDecimal.ZERO;
+
+ // 开仓均价
+ BigDecimal openPrice = BigDecimal.ZERO;
+ // 杠杆
+ int leverRatio = 0;
+ boolean isAloneLess = true;
+ for (ContractHoldOrderEntity holdOrderEntity : holdOrderEntities) {
+ BigDecimal bondAmount = holdOrderEntity.getBondAmount().subtract(holdOrderEntity.getOpeningFeeAmount());
+
+ if (symbol.equalsIgnoreCase(holdOrderEntity.getSymbol())) {
+ if (holdOrderEntity.getOpeningType() == ContractHoldOrderEntity.OPENING_TYPE_MORE) {
+ isAloneLess = false;
+ }
+ symbolBondAmount = symbolBondAmount.add(bondAmount.subtract(holdOrderEntity.getOpeningFeeAmount()));
+
+ 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().subtract(holdOrderEntity.getOpeningFeeAmount()));
+ }
+
+ }
+
+ BigDecimal equity = dataModel.getEquity();
+ BigDecimal sub = equity.subtract(totalBondAmount);
+
+ if (sub.compareTo(symbolBondAmount) <= 0) {
+ BigDecimal multi = BigDecimal.valueOf(10);
+ BigDecimal divide = equity.divide(equity.add(multi), 8, BigDecimal.ROUND_DOWN);
+ sub = symbolBondAmount.multiply(divide);
+ }
+
+ BigDecimal divide = sub.divide(symbolBondAmount, 8, BigDecimal.ROUND_DOWN);
+ BigDecimal divide2 = openPrice.divide(BigDecimal.valueOf(leverRatio), 8, BigDecimal.ROUND_DOWN);
+
+ BigDecimal forcePrice = BigDecimal.ZERO;
+ if (isAloneLess) {
+ forcePrice = openPrice.add(divide.multiply(divide2));
+ } else {
+ forcePrice = openPrice.subtract(divide.multiply(divide2));
+ }
+
+ if (symbol.equalsIgnoreCase(currentSymbol)) {
+ result = forcePrice;
+ }
+ }
+ }
+
+ return result;
+ }
}
--
Gitblit v1.9.1