From 05c74ca131add20dbcf23dc109e63c21b3e2be29 Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Wed, 24 Feb 2021 18:11:57 +0800
Subject: [PATCH] Merge branch 'whole_new_trc20' into whole_new
---
src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java | 95 +++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 90 insertions(+), 5 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 9598533..e8c1396 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,6 +1,7 @@
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;
@@ -214,7 +215,7 @@
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()));
+ LogRecordUtils.insertFollowerNotice(memberEntity.getId(), NoticeConstant.CLOSE_ORDER_TITLE, StrUtil.format(NoticeConstant.CLOSE_ORDER_CONTENT, contractOrderEntity.getSymbol(), contractOrderEntity.getClosingPrice(), profitOrLoss.setScale(8, BigDecimal.ROUND_DOWN), traderInfoEntity.getNickname()));
}
}
}
@@ -485,12 +486,16 @@
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.setForceClosingPrice(getForceSetPrice(wholePriceData, holdOrderEntity, holdOrderDataModel.getSymbol()));
contractHoldOrderDao.deleteById(holdOrderDataModel.getId());
ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(holdOrderEntity);
@@ -503,9 +508,9 @@
BigDecimal rewardRatio = holdOrderDataModel.getRewardAmount().divide(holdOrderEntity.getBondAmount().subtract(holdOrderEntity.getOpeningFeeAmount()), 8, BigDecimal.ROUND_DOWN);
contractOrderEntity.setRewardRatio(rewardRatio);
- contractOrderEntity.setRewardAmount(holdOrderDataModel.getRewardAmount().add(contractOrderEntity.getBondAmount().subtract(contractOrderEntity.getOpeningFeeAmount()).negate()));
+ contractOrderEntity.setRewardAmount(holdOrderDataModel.getRewardAmount().add(contractOrderEntity.getHoldBond().negate()));
contractOrderEntity.setClosingPrice(holdOrderDataModel.getClosingPrice());
- contractOrderEntity.setForceClosingPrice(CalculateUtil.getForceSetPriceForWhole(holdOrderDataModel.getSymbol(), memberEntity));
+ contractOrderEntity.setForceClosingPrice(holdOrderDataModel.getClosingPrice());
// 订单状态转换
if (ContractOrderEntity.ORDER_TYPE_OPEN_MORE == contractOrderEntity.getOrderType()) {
@@ -514,7 +519,7 @@
contractOrderEntity.setOrderType(ContractOrderEntity.ORDER_TYPE_CLOSE_LESS);
}
contractOrderEntity.setClosingTime(new Date());
-
+ contractOrderEntity.setBatchNo(batchNo);
contractOrderDao.insert(contractOrderEntity);
}
@@ -522,11 +527,15 @@
BigDecimal totalAmount = BigDecimal.ZERO;
if (CollUtil.isNotEmpty(entrustOrder)) {
for (ContractEntrustOrderEntity contractEntrustOrderEntity : entrustOrder) {
- totalAmount.add(contractEntrustOrderEntity.getEntrustAmount());
+ 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());
}
}
@@ -599,4 +608,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