From c4aabe264e8f2a6002116a20b3f0b27db99c0afd Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Tue, 02 Feb 2021 18:46:40 +0800
Subject: [PATCH] modify
---
src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java | 72 +++++++++++++++++++++++++++++++++---
src/main/java/com/xcong/excoin/rabbit/pricequeue/whole/WholePriceDataModel.java | 4 +
src/main/java/com/xcong/excoin/rabbit/pricequeue/WebsocketPriceService.java | 1
3 files changed, 70 insertions(+), 7 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 42b23da..4663014 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
@@ -492,7 +492,7 @@
continue;
}
- holdOrderEntity.setForceClosingPrice(getForceSetPrice(wholePriceData, holdOrderEntity));
+ holdOrderEntity.setForceClosingPrice(getForceSetPrice(wholePriceData, holdOrderEntity, holdOrderDataModel.getSymbol()));
contractHoldOrderDao.deleteById(holdOrderDataModel.getId());
ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(holdOrderEntity);
@@ -611,11 +611,71 @@
* @param holdOrder
* @return
*/
- private BigDecimal getForceSetPrice(WholePriceDataModel dataModel, ContractHoldOrderEntity holdOrder) {
- if (holdOrder.getOpeningType() == ContractOrderEntity.ORDER_TYPE_OPEN_MORE) {
- return holdOrder.getOpeningPrice().subtract(holdOrder.getOpeningPrice().multiply(BigDecimal.ONE.divide(new BigDecimal(holdOrder.getLeverRatio()), 8, BigDecimal.ROUND_DOWN)));
- } else {
- return holdOrder.getOpeningPrice().add(holdOrder.getOpeningPrice().multiply(BigDecimal.ONE.divide(new BigDecimal(holdOrder.getLeverRatio()), 8, BigDecimal.ROUND_DOWN)));
+ 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;
}
}
diff --git a/src/main/java/com/xcong/excoin/rabbit/pricequeue/WebsocketPriceService.java b/src/main/java/com/xcong/excoin/rabbit/pricequeue/WebsocketPriceService.java
index afb362e..5eb283a 100644
--- a/src/main/java/com/xcong/excoin/rabbit/pricequeue/WebsocketPriceService.java
+++ b/src/main/java/com/xcong/excoin/rabbit/pricequeue/WebsocketPriceService.java
@@ -342,6 +342,7 @@
synchronized (this) {
if (entry.getKey() != null) {
dataModelMap.remove(entry.getKey());
+ wholePriceData.setEquity(wholePriceData.getBalance().add(totalProfitOrLoss));
redisUtils.set(AppContants.WHOLE_BOMB_MAP, JSONObject.toJSONString(dataModelMap));
log.info("全仓爆仓触发:{}", JSONObject.toJSONString(wholePriceData));
wholePriceData.setPrices(prices);
diff --git a/src/main/java/com/xcong/excoin/rabbit/pricequeue/whole/WholePriceDataModel.java b/src/main/java/com/xcong/excoin/rabbit/pricequeue/whole/WholePriceDataModel.java
index 6ea6437..fab88d7 100644
--- a/src/main/java/com/xcong/excoin/rabbit/pricequeue/whole/WholePriceDataModel.java
+++ b/src/main/java/com/xcong/excoin/rabbit/pricequeue/whole/WholePriceDataModel.java
@@ -33,10 +33,12 @@
private BigDecimal holdBond;
/**
- * 权益
+ * 总金额
*/
private BigDecimal balance;
+ private BigDecimal equity;
+
/**
* 爆仓时,各币种价格
*/
--
Gitblit v1.9.1