java 写 macd, 使用 BigDecimal
时间: 2024-03-15 18:19:22 浏览: 66
BigDecimal使用
MACD 是一种技术分析指标,用于衡量股票价格趋势的强弱和转折点。在 Java 中使用 BigDecimal 类来实现 MACD 指标的计算可以提高精度,避免浮点数计算带来的误差。
以下是一个使用 BigDecimal 实现 MACD 指标计算的示例代码:
```java
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
public class MACD {
private List<BigDecimal> closePriceList;
private int shortPeriod;
private int longPeriod;
private int signalPeriod;
public MACD(List<BigDecimal> closePriceList, int shortPeriod, int longPeriod, int signalPeriod) {
this.closePriceList = closePriceList;
this.shortPeriod = shortPeriod;
this.longPeriod = longPeriod;
this.signalPeriod = signalPeriod;
}
public BigDecimal[] calculate() {
BigDecimal[] result = new BigDecimal[3];
List<BigDecimal> shortEMAList = calculateEMA(closePriceList, shortPeriod);
List<BigDecimal> longEMAList = calculateEMA(closePriceList, longPeriod);
BigDecimal shortEMA = shortEMAList.get(shortEMAList.size() - 1);
BigDecimal longEMA = longEMAList.get(longEMAList.size() - 1);
BigDecimal macd = shortEMA.subtract(longEMA);
List<BigDecimal> signalEMAList = calculateEMA(getSubList(shortEMAList, signalPeriod), signalPeriod);
BigDecimal signalEMA = signalEMAList.get(signalEMAList.size() - 1);
BigDecimal histogram = macd.subtract(signalEMA);
result[0] = macd;
result[1] = signalEMA;
result[2] = histogram;
return result;
}
private List<BigDecimal> calculateEMA(List<BigDecimal> priceList, int period) {
List<BigDecimal> emaList = new ArrayList<>();
BigDecimal multiplier = BigDecimal.valueOf(2).divide(BigDecimal.valueOf(period + 1), 10, BigDecimal.ROUND_HALF_UP);
BigDecimal ema = priceList.get(0);
emaList.add(ema);
for (int i = 1; i < priceList.size(); i++) {
ema = priceList.get(i).subtract(ema).multiply(multiplier).add(ema);
emaList.add(ema);
}
return emaList;
}
private List<BigDecimal> getSubList(List<BigDecimal> list, int size) {
int start = list.size() - size;
if (start < 0) {
start = 0;
}
return list.subList(start, list.size());
}
}
```
在这个示例代码中,MACD 类接收一个由 BigDecimal 类型的收盘价组成的列表,以及三个整数类型的参数:shortPeriod,longPeriod 和 signalPeriod。计算过程分为三个步骤:
1. 计算短期和长期指数平均线(EMA);
2. 计算 MACD 值和信号线;
3. 计算直方图。
在计算 EMA 时,使用 BigDecimal 类型的 multiplier 变量来避免浮点数计算误差。在计算 MACD 和直方图时,用 subtract() 方法减去 BigDecimal 类型的数值,避免浮点数计算误差。
为了避免计算过程中产生的不必要的精度误差,建议在计算过程中使用尽可能多的 BigDecimal 对象。
阅读全文