From 11bb86a81c99672e5e51ca7289f49a57346739e8 Mon Sep 17 00:00:00 2001
From: zj <1772600164@qq.com>
Date: Mon, 12 Aug 2024 23:23:37 +0800
Subject: [PATCH] 1

---
 src/main/java/project/contract/job/ContractOrderCalculationServiceImpl.java |   52 +++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 37 insertions(+), 15 deletions(-)

diff --git a/src/main/java/project/contract/job/ContractOrderCalculationServiceImpl.java b/src/main/java/project/contract/job/ContractOrderCalculationServiceImpl.java
index 1cfbda1..95b8ade 100644
--- a/src/main/java/project/contract/job/ContractOrderCalculationServiceImpl.java
+++ b/src/main/java/project/contract/job/ContractOrderCalculationServiceImpl.java
@@ -1,5 +1,6 @@
 package project.contract.job;
 
+import java.text.DecimalFormat;
 import java.util.List;
 
 import org.slf4j.Logger;
@@ -21,6 +22,8 @@
 	private ContractOrderService contractOrderService;
 	private DataService dataService;
 	private WalletService walletService;
+	public final static String STATE_SUBMITTED = "submitted";
+	public final static String STATE_CREATED = "created";
 	/**
 	 * 平仓线 110%(订金价值 /收益=110%)
 	 */
@@ -53,6 +56,7 @@
 				/*
 				 * 0 买涨
 				 */
+				logger.info("当前价格:"+close+"---------价格:"+Arith.add(order.getTrade_avg_price(), order.getPips()));
 				if (close >= Arith.add(order.getTrade_avg_price(), order.getPips())) {
 					settle(order, "profit", close);
 				}
@@ -80,30 +84,36 @@
 
 	/**
 	 * 盈亏计算
-	 * 
+	 *
 	 * @param profit_loss  profit 盈 loss亏
 	 * @param currentPrice 当前点位
 	 */
 	public void settle(ContractOrder order, String profit_loss, double currentPrice) {
-
-		/**
-		 * 偏差点位
-		 */
-		double point = Arith.div(Math.abs(Arith.sub(currentPrice, order.getTrade_avg_price())), order.getPips());
-		
-		/*
-		 * 根据偏 差点数和手数算出盈亏金额
-		 */
-		double amount = Arith.mul(Arith.mul(order.getPips_amount(), point), order.getVolume());
-		
+//		(保证金*杠杆)= 仓位总价
+//		(仓位总价/开仓价格)= 数量
+//		(当前价格-开仓价格)* 数量 = 盈亏
+//		(盈亏/保证金)*100 = 盈亏率
+		logger.info("---------进入盈亏计算----------------");
+		logger.info("---------order_close_line_type----------------"+order_close_line_type);
+		double mul = Arith.mul(order.getDeposit_open(), order.getLever_rate());//仓位
+		double div = Arith.div(mul, order.getTrade_avg_price());//持有币的数量
+		double amount = Arith.mul(div, Arith.sub(currentPrice, order.getTrade_avg_price()));
+		logger.info("---------盈亏金额:"+amount);
+		logger.info("---------盈亏:"+profit_loss);
 		if ("profit".equals(profit_loss)) {
 			/**
 			 * 盈 正数
 			 */
-			order.setProfit(Arith.add(0.0D, amount));
+			order.setProfit(Arith.add(0.0D, Math.abs(amount)));
 		} else if ("loss".equals(profit_loss)) {
-			order.setProfit(Arith.sub(0.0D, amount));
+			order.setProfit(Arith.sub(0.0D,Math.abs(amount) ));
 		}
+
+		double changeRatio;
+		changeRatio = Arith.mul(Arith.div(order.getProfit(), order.getDeposit_open()), 100);
+		DecimalFormat df = new DecimalFormat("#.##");
+		order.setChange_ratio(Double.valueOf(df.format(changeRatio)));
+
 		/**
 		 * 多次平仓价格不对,后续修
 		 */
@@ -156,11 +166,13 @@
 				return;
 			}
 		}
+		logger.info("order_close_line_type:"+order_close_line_type);
 		if (order_close_line_type == 1) {
 			/**
 			 * 收益
 			 */
 			double profit = 0;
+
 			List<ContractOrder> list = contractOrderService.findSubmitted(order.getPartyId().toString(), null, null);
 			for (int i = 0; i < list.size(); i++) {
 				ContractOrder close_line = list.get(i);
@@ -168,7 +180,7 @@
 			}
 			Wallet wallet = this.walletService.saveWalletByPartyId(order.getPartyId().toString());
 			double totleMoney = wallet.getMoney();
-			if (Arith.add(profit, totleMoney) <= 0) {
+			if (Arith.add(profit,totleMoney) <= 0) {
 				/**
 				 * 触发全仓强平
 				 */
@@ -178,6 +190,7 @@
 					ContractOrder close_line = list.get(i);
 					if (!order.getOrder_no().equals(close_line.getOrder_no())) {
 						try {
+
 							while (true) {
 								if (ContractLock.add(close_line.getOrder_no())) {
 									this.contractOrderService.saveClose(close_line.getPartyId().toString(),
@@ -188,7 +201,9 @@
 									break;
 								}
 								ThreadUtils.sleep(500);
+
 							}
+
 						} catch (Exception e) {
 							logger.error("error:", e);
 						} finally {
@@ -201,14 +216,21 @@
 
 			}
 		} else {
+			logger.info("---------进入单个持仓----------------");
+			logger.info("---------order.getProfit()----------------"+order.getProfit());
+			logger.info("---------order.getDeposit()----------------"+order.getDeposit());
+			logger.info("---------order_close_line----------------"+order_close_line);
 			if (order.getProfit() < 0 && (Arith.div(order.getDeposit(), Math.abs(order.getProfit())) <= Arith
 					.div(order_close_line, 100))) {
+				logger.info("---------进入强平了----------------");
 				/**
 				 * 低于系统默认平仓线,进行强平
 				 */
 				this.contractOrderService.saveClose(order.getPartyId().toString(), order.getOrder_no());
+				return;
 			}
 		}
+
 	}
 	public void setDataService(DataService dataService) {
 		this.dataService = dataService;

--
Gitblit v1.9.3