| | |
| | | package project.contract.job; |
| | | |
| | | import java.text.DecimalFormat; |
| | | import java.util.List; |
| | | |
| | | import org.slf4j.Logger; |
| | |
| | | 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%) |
| | | */ |
| | |
| | | /* |
| | | * 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); |
| | | } |
| | |
| | | |
| | | /** |
| | | * 盈亏计算 |
| | | * |
| | | * |
| | | * @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))); |
| | | |
| | | /** |
| | | * 多次平仓价格不对,后续修 |
| | | */ |
| | |
| | | * 收益 |
| | | */ |
| | | 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); |
| | |
| | | } |
| | | Wallet wallet = this.walletService.saveWalletByPartyId(order.getPartyId().toString()); |
| | | double totleMoney = wallet.getMoney(); |
| | | if (Arith.add(profit, totleMoney) <= 0) { |
| | | if (Arith.add(profit,totleMoney) <= 0) { |
| | | /** |
| | | * 触发全仓强平 |
| | | */ |
| | |
| | | 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(), |
| | |
| | | break; |
| | | } |
| | | ThreadUtils.sleep(500); |
| | | |
| | | } |
| | | |
| | | } catch (Exception e) { |
| | | logger.error("error:", e); |
| | | } finally { |
| | |
| | | * 低于系统默认平仓线,进行强平 |
| | | */ |
| | | this.contractOrderService.saveClose(order.getPartyId().toString(), order.getOrder_no()); |
| | | return; |
| | | } |
| | | |
| | | } |
| | | |
| | | } |
| | | public void setDataService(DataService dataService) { |
| | | this.dataService = dataService; |