1
zj
2024-07-12 bc9801d6adf582325e8213df11f597f82deda973
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,31 @@
   /**
    * 盈亏计算
    *
    *
    * @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());
      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)));
      /**
       * 多次平仓价格不对,后续修
       */
@@ -161,6 +166,7 @@
          * 收益
          */
         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 +174,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 +184,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 +195,9 @@
                           break;
                        }
                        ThreadUtils.sleep(500);
                     }
                  } catch (Exception e) {
                     logger.error("error:", e);
                  } finally {
@@ -207,8 +216,11 @@
             * 低于系统默认平仓线,进行强平
             */
            this.contractOrderService.saveClose(order.getPartyId().toString(), order.getOrder_no());
            return;
         }
      }
   }
   public void setDataService(DataService dataService) {
      this.dataService = dataService;