Administrator
2025-12-25 5755881472e2060832dc7f626109a68aa71fce90
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
package com.xcong.excoin.modules.okxNewPrice.indicator.macdAndMatrategy;
 
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;
 
/**
 * 移动平均线(Moving Average)指标实现类
 * 
 * 移动平均线是一种趋势跟随型技术指标,通过计算一段时间内价格的平均值,
 * 来平滑价格波动并识别趋势方向。本类实现了简单移动平均线(SMA)的计算。
 * 
 * 【核心功能】
 * 1. 计算指定周期的移动平均线
 * 2. 支持高精度BigDecimal计算,避免浮点数精度损失
 * 3. 提供获取最新计算结果的接口
 * 
 * 【使用场景】
 * - 在MACD+MA策略中,用于判断市场长期趋势(200日MA)和中短期支撑/阻力(50日MA)
 * - 适用于各种时间周期的价格数据
 */
public class MovingAverage {
    /**
     * 移动平均线的计算周期
     */
    private final int period;
    
    /**
     * 移动平均线的最新计算结果
     */
    private BigDecimal ma = BigDecimal.ZERO;
 
    /**
     * 构造方法
     * 
     * @param period 移动平均线的计算周期
     */
    public MovingAverage(int period) {
        this.period = period;
    }
 
    /**
     * 计算移动平均线
     * 
     * @param prices 历史价格数据列表
     */
    public void calculate(List<BigDecimal> prices) {
        // 如果价格数据不足计算周期,不进行计算
        if (prices.size() < period) {
            return;
        }
 
        // 计算最近period个价格的总和
        BigDecimal sum = BigDecimal.ZERO;
        for (int i = prices.size()-period; i < prices.size(); i++) {
            sum = sum.add(prices.get(i));
        }
 
        // 计算平均值,保留8位小数,四舍五入
        ma = sum.divide(new BigDecimal(period), 8, RoundingMode.HALF_UP);
    }
 
    /**
     * 获取最新计算的移动平均线值
     *
     * @return 移动平均线值
     */
    public BigDecimal getMa() {
        return ma;
    }
}