From 68167e4454f0ab5143f2100554cf797804b98cfc Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Thu, 25 Dec 2025 12:57:52 +0800
Subject: [PATCH] ``` fix(indicator): 修复MACD指标计算逻辑和空指针异常
---
src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/MACD.java | 32 ++++++++++++++++++++++++++++----
1 files changed, 28 insertions(+), 4 deletions(-)
diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/MACD.java b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/MACD.java
index 0cd2a15..0be9fea 100644
--- a/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/MACD.java
+++ b/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柱状图
--
Gitblit v1.9.1