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;
|
}
|
}
|