Administrator
2025-12-25 68167e4454f0ab5143f2100554cf797804b98cfc
src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/MACD.java
@@ -7,6 +7,7 @@
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
@@ -63,6 +64,10 @@
    private BigDecimal prevFastEMA = null;
    private BigDecimal prevSlowEMA = null;
    private BigDecimal prevDea = null;
    // 用于保存历史DIF值,用于计算DEA
    private List<BigDecimal> difHistory = new ArrayList<>();
    // 最大保存的DIF历史值数量,至少为signalPeriod
    private static final int MAX_DIF_HISTORY = 30;
    // 构造函数使用默认周期
    public MACD() {
@@ -103,10 +108,29 @@
        // 计算DIF
        dif = prevFastEMA.subtract(prevSlowEMA).setScale(8, RoundingMode.HALF_UP);
        
        // 计算DEA
        List<BigDecimal> difList = new ArrayList<>();
        difList.add(dif);
        prevDea = calculateEMA(difList, signalPeriod, prevDea);
        // 将新的DIF值添加到历史记录
        difHistory.add(dif);
        // 保持历史记录在合理范围内
        if (difHistory.size() > MAX_DIF_HISTORY) {
            difHistory.remove(0);
        }
        // 计算DEA:使用足够数量的历史DIF值
        // 如果历史DIF值不足,使用当前可用的所有值
        int difCount = difHistory.size();
        List<BigDecimal> deaCalculationList;
        if (difCount >= signalPeriod) {
            // 使用最近的signalPeriod个DIF值
            deaCalculationList = difHistory.subList(difCount - signalPeriod, difCount);
        } else if (difCount > 0) {
            // 使用所有可用的DIF值
            deaCalculationList = new ArrayList<>(difHistory);
        } else {
            // 没有DIF历史值,使用当前DIF
            deaCalculationList = Collections.singletonList(dif);
        }
        prevDea = calculateEMA(deaCalculationList, signalPeriod, prevDea);
        dea = prevDea.setScale(8, RoundingMode.HALF_UP);
        
        // 计算MACD柱状图