From d0d0306f30ffcf22afda2da15c13df2b3a6060ee Mon Sep 17 00:00:00 2001
From: xiaoyong931011 <15274802129@163.com>
Date: Fri, 09 Apr 2021 16:01:49 +0800
Subject: [PATCH] Merge branch 'activity' of http://120.27.238.55:7000/r/exchange into activity
---
src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java | 2
src/test/java/com/xcong/excoin/WholeTest.java | 39 ++++++++++++-
src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java | 10 +-
src/test/java/com/xcong/excoin/LocalTest.java | 21 +++----
src/main/java/com/xcong/excoin/utils/CalculateUtil.java | 66 +++++++++++++++++++---
5 files changed, 108 insertions(+), 30 deletions(-)
diff --git a/src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java b/src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java
index a87efc9..70940c6 100644
--- a/src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java
+++ b/src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java
@@ -531,7 +531,7 @@
holdOrderListVo.setReturnRate(returnRate);
holdOrderListVo.setProfitOrLoss(rewardRatio);
if (ContractEntrustOrderEntity.POSITION_TYPE_ALL == memberEntity.getContractPositionType()) {
- BigDecimal forcePrice = CalculateUtil.calWholePriceTwo(memberEntity, holdOrderEntity);
+ BigDecimal forcePrice = CalculateUtil.calWholePriceTwo(memberEntity, holdOrderEntity, 1);
// contractHoldOrderDao.updateForcePriceBySymbolAndMemberId(forcePrice, memberEntity.getId(), holdOrderEntity.getSymbol());
holdOrderListVo.setForceClosingPrice(forcePrice);
}
@@ -1169,10 +1169,10 @@
// 发送爆仓消息
sendOrderBombMsg(holdOrderEntity.getId(), holdOrderEntity.getOpeningType(), newForcePrice, holdOrderEntity.getSymbol(), holdOrderEntity.getOperateNo(), holdOrderEntity.getMemberId());
} else {
- holdOrderEntity.setHoldAmount(holdAmount);
- contractHoldOrderDao.updateById(holdOrderEntity);
- memberWalletContractDao.increaseWalletContractBalanceById(thisTimeHold.negate(), thisTimeHold.negate(), null, wallet.getId());
- ThreadPoolUtils.sendWholePrice(holdOrderEntity.getMemberId());
+// holdOrderEntity.setHoldAmount(holdAmount);
+// contractHoldOrderDao.updateById(holdOrderEntity);
+// memberWalletContractDao.increaseWalletContractBalanceById(thisTimeHold.negate(), thisTimeHold.negate(), null, wallet.getId());
+// ThreadPoolUtils.sendWholePrice(holdOrderEntity.getMemberId());
}
}
}
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 6116938..9ff4d66 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
@@ -536,7 +536,7 @@
continue;
}
- holdOrderEntity.setStopLossPrice(CalculateUtil.calWholePriceTwo(memberEntity, holdOrderEntity));
+ holdOrderEntity.setStopLossPrice(CalculateUtil.calWholePriceTwo(memberEntity, holdOrderEntity, 2));
contractHoldOrderDao.deleteById(holdOrderDataModel.getId());
ContractOrderEntity contractOrderEntity = ContractHoldOrderEntityMapper.INSTANCE.holdOrderToOrder(holdOrderEntity);
diff --git a/src/main/java/com/xcong/excoin/utils/CalculateUtil.java b/src/main/java/com/xcong/excoin/utils/CalculateUtil.java
index 3e7a722..b3ba2b4 100644
--- a/src/main/java/com/xcong/excoin/utils/CalculateUtil.java
+++ b/src/main/java/com/xcong/excoin/utils/CalculateUtil.java
@@ -204,11 +204,18 @@
return forcePrice;
}
- public static BigDecimal calWholePriceTwo(MemberEntity memberEntity, ContractHoldOrderEntity contractHoldOrderEntity) {
+ /**
+ * 权益-维持保证金+开仓价*张数*规格-开仓价*费率-(总账户-维持保证金) / 规格*张数
+ *
+ * @param memberEntity
+ * @param contractHoldOrderEntity
+ * @return
+ */
+ public static BigDecimal calWholePriceTwo(MemberEntity memberEntity, ContractHoldOrderEntity contractHoldOrderEntity, int type) {
ContractHoldOrderDao holdOrderDao = SpringContextHolder.getBean(ContractHoldOrderDao.class);
MemberWalletContractDao walletContractDao = SpringContextHolder.getBean(MemberWalletContractDao.class);
+ CacheSettingUtils cacheSettingUtils = SpringContextHolder.getBean(CacheSettingUtils.class);
RedisUtils redisUtils = SpringContextHolder.getBean(RedisUtils.class);
- BigDecimal newPrice = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey(contractHoldOrderEntity.getSymbol())));
Long memberId = memberEntity.getId();
MemberWalletContractEntity walletContract = walletContractDao.findWalletContractByMemberIdAndSymbol(memberId, CoinTypeEnum.USDT.name());
@@ -223,26 +230,67 @@
} else {
totalBondAmount = totalBondAmount.add(holdOrderEntity.getBondAmount());
}
- totalProfitOrLoss = totalProfitOrLoss.add(calProfitOrLoss(holdOrderEntity, memberEntity));
+
+
+ BigDecimal newPrice = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey(contractHoldOrderEntity.getSymbol())));
+ if (type == 2) {
+ log.info("newPrice : {}", newPrice);
+ }
+ // 盈亏
+ BigDecimal rewardRatio = BigDecimal.ZERO;
+ // 开多
+ if (ContractHoldOrderEntity.OPENING_TYPE_MORE == holdOrderEntity.getOpeningType()) {
+ // (最新价-开仓价)*规格*张数
+ rewardRatio = newPrice.subtract(holdOrderEntity.getOpeningPrice()).multiply(contractHoldOrderEntity.getSymbolSku()).multiply(new BigDecimal(holdOrderEntity.getSymbolCntSale()));
+ // 开空
+ } else {
+ // (开仓价-最新价)*规格*张数
+ rewardRatio = holdOrderEntity.getOpeningPrice().subtract(newPrice).multiply(contractHoldOrderEntity.getSymbolSku()).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()));
+ }
+ }
+
+ totalProfitOrLoss = totalProfitOrLoss.add(rewardRatio);
}
+ // 维持保证金
BigDecimal holdBond = contractHoldOrderEntity.getHoldBond();
// 成本 数量*面值*开仓价
BigDecimal cost = contractHoldOrderEntity.getSymbolSku().multiply(contractHoldOrderEntity.getOpeningPrice()).multiply(new BigDecimal(contractHoldOrderEntity.getSymbolCntSale()));
// 费率
- BigDecimal ratio = newPrice.multiply(new BigDecimal("0.015"));
- // 权益
- BigDecimal qy = walletContract.getTotalBalance().add(totalProfitOrLoss).add(walletContract.getTotalBalance());
+ BigDecimal ratio = contractHoldOrderEntity.getOpeningPrice().multiply(new BigDecimal("0.005"));
+ // 总账户 - 维持保证金
+ BigDecimal orderProfitOrLoss = walletContract.getTotalBalance().subtract(holdBond);
+ // 权益 - 维持保证金
+ BigDecimal qy = walletContract.getTotalBalance().add(totalProfitOrLoss).subtract(holdBond);
+// BigDecimal qy = BigDecimal.ZERO;
+
+ BigDecimal prefix = cost.subtract(totalBondAmount);
BigDecimal divideChild;
if (ContractHoldOrderEntity.OPENING_TYPE_MORE == contractHoldOrderEntity.getOpeningType()) {
- divideChild = holdBond.negate().subtract(cost).add(ratio).add(qy);
+ divideChild = prefix.subtract(orderProfitOrLoss).subtract(qy);
} else {
- divideChild = holdBond.negate().subtract(cost).add(ratio).subtract(qy);
+ divideChild = prefix.add(orderProfitOrLoss).add(qy);
}
// BigDecimal divideChild = walletContract.getTotalBalance().add(totalProfitOrLoss).subtract(holdBond).subtract(cost).add(newPrice.multiply(new BigDecimal("0.005")));
BigDecimal divideParent = contractHoldOrderEntity.getSymbolSku().multiply(new BigDecimal(contractHoldOrderEntity.getSymbolCntSale()));
- forcePrice = divideChild.divide(divideParent, 8, BigDecimal.ROUND_DOWN).negate();
+ forcePrice = divideChild.divide(divideParent, 8, BigDecimal.ROUND_DOWN);
+ if (type == 2) {
+ log.info("=======全仓爆仓=======");
+ log.info("holdBond : {}", holdBond);
+ log.info("cost : {}", cost);
+ log.info("ratio : {}", ratio);
+ log.info("orderProfitOrLoss : {}", orderProfitOrLoss);
+ log.info("total : {}", walletContract.getTotalBalance());
+ log.info("totalProfitOrLoss : {}", totalProfitOrLoss);
+ log.info("qy : {}", qy);
+ }
}
return forcePrice;
}
diff --git a/src/test/java/com/xcong/excoin/LocalTest.java b/src/test/java/com/xcong/excoin/LocalTest.java
index adfa401..a40bfba 100644
--- a/src/test/java/com/xcong/excoin/LocalTest.java
+++ b/src/test/java/com/xcong/excoin/LocalTest.java
@@ -55,7 +55,7 @@
@Slf4j
@SpringBootTest
public class LocalTest {
-
+
@Resource
private MemberDao memberDao;
@Resource
@@ -90,7 +90,7 @@
private FollowTraderLabelDao followTraderLabelDao;
@Resource
private MemberSettingDao memberSettingDao;
-
+//
// @Test
// public void traderProfitUpdate() {
// log.info("交易员定时任务执行");
@@ -134,16 +134,13 @@
// List<ContractOrderEntity> orders = contractOrderDao.selectFollowOrderListByMemberId(tradeMemberId);
// traderInfoProfit.setTotalOrderCnt(CollUtil.isNotEmpty(orders) ? orders.size() : 0);
// // 近三周胜率
-// BigDecimal winCnt = contractOrderDao.selectFollowOrderCntForWinRate(tradeMemberId, 1);
-// winCnt = (winCnt == null?BigDecimal.ZERO:winCnt.setScale(2, BigDecimal.ROUND_DOWN));
-// BigDecimal allCnt = contractOrderDao.selectFollowOrderCntForWinRate(tradeMemberId, null);
-// allCnt = (allCnt == null?BigDecimal.ZERO:allCnt.setScale(2, BigDecimal.ROUND_DOWN));
-// BigDecimal winRate = BigDecimal.ZERO.setScale(2, BigDecimal.ROUND_DOWN);
-// if (allCnt.compareTo(BigDecimal.ZERO) > 0) {
-// winRate = winCnt.divide(allCnt, 2, BigDecimal.ROUND_DOWN).setScale(2, BigDecimal.ROUND_DOWN);
-// }
-// traderInfoProfit.setWinRate(winRate);
+// Integer winCnt = contractOrderDao.selectFollowOrderCntForWinRate(tradeMemberId, 1);
+// Integer allCnt = contractOrderDao.selectFollowOrderCntForWinRate(tradeMemberId, null);
//
+// if (winCnt != null && allCnt != null && allCnt!=0) {
+// BigDecimal winRate = BigDecimal.valueOf(winCnt).divide(BigDecimal.valueOf(allCnt), 4, BigDecimal.ROUND_DOWN);
+// traderInfoProfit.setWinRate(winRate);
+// }
// Date date = new Date();
// DateTime offsetDay = DateUtil.offsetDay(new Date(), -30);
// //30天胜率(30天盈利总单数/30平仓总单数)
@@ -151,7 +148,7 @@
// BigDecimal thirtyWinCnt = contractOrderDao.selectThirtyWinCntByMemberId(tradeMemberId,date,offsetDay);
// BigDecimal thirtyTotalCntRatio = (thirtyTotalCnt == null?BigDecimal.ZERO:thirtyTotalCnt.setScale(2, BigDecimal.ROUND_DOWN));
// BigDecimal thirtyWinCntRatio = (thirtyWinCnt == null?BigDecimal.ZERO:thirtyWinCnt.setScale(2, BigDecimal.ROUND_DOWN));
-// BigDecimal thirtyProfitRatio = BigDecimal.ZERO.setScale(2, BigDecimal.ROUND_DOWN);
+// BigDecimal thirtyProfitRatio = BigDecimal.ZERO.setScale(2, BigDecimal.ROUND_DOWN);;
// if(thirtyTotalCnt.compareTo(BigDecimal.ZERO) > 0) {
// thirtyProfitRatio = thirtyWinCntRatio.divide(thirtyTotalCntRatio, 2, BigDecimal.ROUND_DOWN).setScale(2, BigDecimal.ROUND_DOWN);
// }
diff --git a/src/test/java/com/xcong/excoin/WholeTest.java b/src/test/java/com/xcong/excoin/WholeTest.java
index 1123b19..da62aa7 100644
--- a/src/test/java/com/xcong/excoin/WholeTest.java
+++ b/src/test/java/com/xcong/excoin/WholeTest.java
@@ -17,6 +17,7 @@
import com.xcong.excoin.rabbit.pricequeue.WebsocketPriceService;
import com.xcong.excoin.rabbit.producer.OrderProducer;
import com.xcong.excoin.utils.CalculateUtil;
+import com.xcong.excoin.utils.CoinTypeConvert;
import com.xcong.excoin.utils.RedisUtils;
import com.xcong.excoin.utils.ThreadPoolUtils;
import lombok.SneakyThrows;
@@ -200,10 +201,42 @@
@Test
public void wholeForceNewTest() {
- MemberEntity memberEntity = memberDao.selectById(15L);
- ContractHoldOrderEntity holdOrder = contractHoldOrderDao.selectById(400L);
+ BigDecimal newPrice = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey("BTC/USDT")));
- System.out.println(CalculateUtil.calForcePriceForWhole(memberEntity, holdOrder));
+ MemberEntity memberEntity = memberDao.selectById(16L);
+ ContractHoldOrderEntity holdOrder = contractHoldOrderDao.selectById(769L);
+
+ System.out.println(CalculateUtil.calWholePriceTwo(memberEntity, holdOrder, 2));
+ }
+
+ @Test
+ public void wholeForceNewTest2() {
+ BigDecimal holdBond = new BigDecimal("1161.8951");
+
+ BigDecimal sku = new BigDecimal("0.1");
+ BigDecimal openPrice = new BigDecimal("58094.75");
+ int cnt = 50;
+ BigDecimal total = new BigDecimal("9866.3820");
+ // 成本 数量*面值*开仓价
+ BigDecimal cost = sku.multiply(openPrice).multiply(new BigDecimal(cnt));
+ // 费率
+ BigDecimal ratio = openPrice.multiply(new BigDecimal("0.005"));
+ // 总账户 - 维持保证金
+ BigDecimal orderProfitOrLoss = total.subtract(holdBond);
+ // 权益
+ BigDecimal qy = BigDecimal.ZERO;
+
+ BigDecimal prefix = cost.subtract(ratio);
+ BigDecimal divideChild;
+// if (ContractHoldOrderEntity.OPENING_TYPE_MORE == contractHoldOrderEntity.getOpeningType()) {
+ divideChild = prefix.subtract(orderProfitOrLoss).subtract(qy);
+// } else {
+// divideChild = prefix.add(orderProfitOrLoss).add(qy);
+// }
+// BigDecimal divideChild = walletContract.getTotalBalance().add(totalProfitOrLoss).subtract(holdBond).subtract(cost).add(newPrice.multiply(new BigDecimal("0.005")));
+ BigDecimal divideParent = sku.multiply(new BigDecimal(cnt));
+
+ System.out.println(divideChild.divide(divideParent, 8, BigDecimal.ROUND_DOWN));
}
}
--
Gitblit v1.9.1