| | |
| | | public static List<BigDecimal> calculateEMA(List<BigDecimal> prices, int period) { |
| | | return calculateEMA(prices, period, true); |
| | | } |
| | | |
| | | /** |
| | | * 计算单个EMA值(递归计算方式) |
| | | * |
| | | * @param currentPrice 当前价格 |
| | | * @param prevEMA 前一个EMA值 |
| | | * @param period EMA周期 |
| | | * @return 当前EMA值 |
| | | */ |
| | | public static BigDecimal calculateSingleEMA(BigDecimal currentPrice, BigDecimal prevEMA, int period) { |
| | | // 计算权重因子alpha = 2 / (period + 1) |
| | | BigDecimal alpha = BigDecimal.valueOf(2.0).divide(BigDecimal.valueOf(period + 1), 10, RoundingMode.HALF_UP); |
| | | |
| | | // EMA(today) = Price(today) * alpha + EMA(yesterday) * (1 - alpha) |
| | | return currentPrice.multiply(alpha) |
| | | .add(prevEMA.multiply(BigDecimal.ONE.subtract(alpha))) |
| | | .setScale(10, RoundingMode.HALF_UP); |
| | | } |
| | | } |