1
zj
2025-05-25 370c0e6d54be9222fcaa416fdd605f09e3c49e8a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package db.util;
 
import java.math.BigDecimal;
import java.math.RoundingMode;
 
/**
 * @program: xinbi-new
 * @description:
 * @create: 2025-04-10 15:25
 **/
public class QpUtil {
 
    public static double faceValue = 0.01; // 合约面值(固定面值不能调整)
    public static double maintenanceMarginRate = 0.004; // 维持保证金率(固定不变)
 
    /**
     * 多仓强平价格计算 多仓预估强平价 =(保证金余额-面值 *|张数|*开仓均价)/(面值*张数|*(维持保证金率+手续费率 -1));
     * @param marginBalance 保证金余额
     * @param contractQuantity 合约张数
     * @param openingPrice 开仓均价
     * @param feeRate 手续费率
     * @return
     */
    public static double calculateLiquidationPrice(double marginBalance, double contractQuantity,
                                                   double openingPrice, double feeRate){
        // 计算分子部分
        double numerator = marginBalance - (faceValue * contractQuantity * openingPrice);
 
        // 计算分母部分
        double denominator = faceValue * contractQuantity * (maintenanceMarginRate + feeRate - 1);
 
        // 计算强平价
        double result = numerator / denominator;
        if (result < 0) {
            return 0;
        }
        return new BigDecimal(result).setScale(2, RoundingMode.HALF_UP).doubleValue();
    }
 
 
    /**
     *  空仓强平价格计算   空仓预估强平价 =(保证金余额+面值 *|张数|*开仓均价)/(面值*|张数|*(维持金率+王续费率 +1))
     * @param marginBalance 保证金余额
     * @param contractQuantity 合约张数
     * @param openingPrice 开仓均价
     * @param feeRate 手续费率
     * @return
     */
    public static double calculateEmptyLiquidationPrice (double marginBalance,  double contractQuantity,
                                                  double openingPrice,  double feeRate){
        // 计算分子部分
        double numerator = marginBalance + (faceValue * contractQuantity * openingPrice);
 
        // 计算分母部分
        double denominator = faceValue * contractQuantity * (maintenanceMarginRate + feeRate + 1);
 
        // 计算空仓预估强平价
        double result = numerator / denominator;
        if (result < 0) {
            return 0;
        }
        return new BigDecimal(result).setScale(2, RoundingMode.HALF_UP).doubleValue();
    }
 
    /**
     *
     * @param earnestMoney 保证金
     * @param level 杠杆
     * @param recentQuotation 最新价格
     * @return 合约张数  张数=可用保证金*杠杆倍数/(面值*最新成交价)
     */
    public static double countSheets(double earnestMoney, int level, double recentQuotation){
        double result = earnestMoney * level / (faceValue * recentQuotation);
 
        BigDecimal bd = new BigDecimal(result).setScale(2, RoundingMode.DOWN);
 
        return bd.doubleValue();
    }
 
}