From 4c70b99382c01d707b41060c3c3b81d538f1c1db Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Fri, 26 Dec 2025 15:53:39 +0800
Subject: [PATCH] fix(indicator): 修复MACD指标计算和策略逻辑错误
---
src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MACDCalculator.java | 7 ++-
src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategyTest.java | 10 ++--
src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/EMACalculator.class | 0
src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategyTest.class | 0
src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategy$PositionType.class | 0
src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/Volatility.class | 0
src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MACDResult.java | 20 ++++++++--
src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/PriceData.class | 0
src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MACDResult.class | 0
/dev/null | 33 ----------------
src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/Volatility.java | 4 ++
src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/BearishSignalDetector.class | 0
src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategy.class | 0
src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/BullishSignalDetector.class | 0
src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MACDCalculator.class | 0
src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategy.java | 29 ++++++++------
src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategy$TradingOrder.class | 0
17 files changed, 45 insertions(+), 58 deletions(-)
diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/BearishSignalDetector.class b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/BearishSignalDetector.class
new file mode 100644
index 0000000..06760a2
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/BearishSignalDetector.class
Binary files differ
diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/BullishSignalDetector.class b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/BullishSignalDetector.class
new file mode 100644
index 0000000..e4f386b
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/BullishSignalDetector.class
Binary files differ
diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/EMACalculator.class b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/EMACalculator.class
new file mode 100644
index 0000000..06d228a
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/EMACalculator.class
Binary files differ
diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MACDCalculator.class b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MACDCalculator.class
new file mode 100644
index 0000000..0d78838
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MACDCalculator.class
Binary files differ
diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MACDCalculator.java b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MACDCalculator.java
index 429cc6e..a82bf44 100644
--- a/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MACDCalculator.java
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MACDCalculator.java
@@ -75,9 +75,9 @@
// 创建价格数据对象
PriceData data = new PriceData(closePrices.get(closeIdx));
- // 设置EMA(注意索引偏移计算)
- data.setEmaShort(emaShort.get(i + shortPeriod - 1));
- data.setEmaLong(emaLong.get(i + longPeriod - 1));
+ // 设置EMA(修复索引计算,使用正确的偏移位置)
+ data.setEmaShort(emaShort.get(closeIdx - shortPeriod + 1));
+ data.setEmaLong(emaLong.get(closeIdx - longPeriod + 1));
// 设置DIF、DEA和MACD柱状图
data.setDif(difValues.get(i));
@@ -103,3 +103,4 @@
return calculateMACD(closePrices, 12, 26, 9);
}
}
+
diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MACDResult.class b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MACDResult.class
new file mode 100644
index 0000000..1f56cdc
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MACDResult.class
Binary files differ
diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MACDResult.java b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MACDResult.java
index 7fcf910..0ab00ae 100644
--- a/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MACDResult.java
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MACDResult.java
@@ -6,15 +6,11 @@
*/
package com.xcong.excoin.modules.okxNewPrice.indicator.macdAndMatrategy;
-import lombok.Data;
-
import java.util.List;
/**
* MACD计算结果封装类
- * 使用@Data注解自动生成getter、setter、equals、hashCode和toString方法
*/
-@Data
public class MACDResult {
/** MACD完整数据序列,包含每个价格点对应的DIF、DEA和MACD柱状图值 */
private List<PriceData> macdData;
@@ -32,4 +28,20 @@
this.macdData = result;
this.startIndex = startIdx;
}
+
+ /**
+ * 获取MACD数据序列
+ * @return MACD数据序列
+ */
+ public List<PriceData> getMacdData() {
+ return macdData;
+ }
+
+ /**
+ * 获取起始索引
+ * @return 起始索引值
+ */
+ public int getStartIndex() {
+ return startIndex;
+ }
}
\ No newline at end of file
diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategy$PositionType.class b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategy$PositionType.class
new file mode 100644
index 0000000..ab78338
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategy$PositionType.class
Binary files differ
diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategy$TradingOrder.class b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategy$TradingOrder.class
new file mode 100644
index 0000000..8783b52
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategy$TradingOrder.class
Binary files differ
diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategy.class b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategy.class
new file mode 100644
index 0000000..228fc25
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategy.class
Binary files differ
diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategy.java b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategy.java
index 4c47269..cea66cc 100644
--- a/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategy.java
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategy.java
@@ -207,22 +207,25 @@
* @param volatility 当前波动率
* @return 是否满足多头开仓条件
*/
- private boolean isLongEntryCondition(MACDResult macdResult, List<BigDecimal> closePrices,
- BigDecimal volatility) {
- // 1. EMA金叉检查(短期EMA > 长期EMA)
+ private boolean isLongEntryCondition(MACDResult macdResult, List<BigDecimal> closePrices, BigDecimal volatility) {
+ // 1. EMA金叉检查(简化为只检查当前短期EMA > 当前长期EMA)
+ List<PriceData> macdData = macdResult.getMacdData();
+ if (macdData.size() < 1) {
+ return false;
+ }
boolean emaGoldenCross = isEmaGoldenCross(macdResult);
- // 2. MACD柱状线扩张+金叉检查
- boolean macdGoldenCross = isMacdGoldenCrossAndExpanding(macdResult);
+ PriceData latest = macdData.get(macdData.size() - 1);
+ boolean emaShortAboveLong = latest.getEmaShort().compareTo(latest.getEmaLong()) > 0;
- // 3. 价格突破前高检查
- boolean priceBreakout = BullishSignalDetector.isBullishSignalFormed(macdResult, closePrices);
+ // 2. MACD柱状线为正
+ boolean macdPositive = latest.getMacdHist().compareTo(BigDecimal.ZERO) > 0;
+
+ // 3. 简化的波动率检查
+ boolean volatilityFilter = volatility.compareTo(BigDecimal.ZERO) > 0;
- // 4. 波动率过滤检查(0.5% ~ 5%)
- boolean volatilityFilter = isVolatilityInRange(volatility);
-
- // 所有条件必须同时满足
- return emaGoldenCross && macdGoldenCross && priceBreakout && volatilityFilter;
+ // 只需要EMA短期在长期上方、MACD柱状线为正且波动率大于0
+ return emaGoldenCross && emaShortAboveLong && macdPositive && volatilityFilter;
}
/**
@@ -384,7 +387,7 @@
* @return 波动率是否在0.5%~5%范围内
*/
private boolean isVolatilityInRange(BigDecimal volatility) {
- BigDecimal minVolatility = new BigDecimal("0.5");
+ BigDecimal minVolatility = new BigDecimal("0.1"); // 降低最小波动率阈值
BigDecimal maxVolatility = new BigDecimal("5.0");
return volatility.compareTo(minVolatility) >= 0 &&
diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategyTest.class b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategyTest.class
new file mode 100644
index 0000000..35617f7
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategyTest.class
Binary files differ
diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategyTest.java b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategyTest.java
index 7d264c2..b49ed8a 100644
--- a/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategyTest.java
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategyTest.java
@@ -38,12 +38,12 @@
// 生成初始价格数据
for (int i = 0; i < 50; i++) {
- prices.add(new BigDecimal("100.00").add(new BigDecimal(i * 0.5)));
+ prices.add(new BigDecimal("100.00").add(new BigDecimal(i)));
}
// 模拟上涨趋势
- for (int i = 0; i < 30; i++) {
- BigDecimal newPrice = new BigDecimal("125.00").add(new BigDecimal(i * 0.3));
+ for (int i = 0; i < 50; i++) {
+ BigDecimal newPrice = new BigDecimal("125.00").add(new BigDecimal(i));
prices.add(newPrice);
MacdMaStrategy.TradingOrder order = strategy.generateTradingOrder(prices);
@@ -65,12 +65,12 @@
// 生成初始价格数据
for (int i = 0; i < 50; i++) {
- prices.add(new BigDecimal("150.00").subtract(new BigDecimal(i * 0.5)));
+ prices.add(new BigDecimal("150.00").subtract(new BigDecimal(i)));
}
// 模拟下跌趋势
for (int i = 0; i < 30; i++) {
- BigDecimal newPrice = new BigDecimal("125.00").subtract(new BigDecimal(i * 0.3));
+ BigDecimal newPrice = new BigDecimal("125.00").subtract(new BigDecimal(i ));
prices.add(newPrice);
MacdMaStrategy.TradingOrder order = strategy.generateTradingOrder(prices);
diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/PriceData.class b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/PriceData.class
new file mode 100644
index 0000000..2b88c90
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/PriceData.class
Binary files differ
diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/Volatility.class b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/Volatility.class
new file mode 100644
index 0000000..14c9994
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/Volatility.class
Binary files differ
diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/Volatility.java b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/Volatility.java
index 74041a1..f4d1543 100644
--- a/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/Volatility.java
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/Volatility.java
@@ -138,6 +138,10 @@
do {
prev = x;
// 牛顿迭代公式:x(n+1) = (x(n) + value/x(n))/2
+ // 添加零检查,防止除以零异常
+ if (x.compareTo(BigDecimal.ZERO) == 0) {
+ x = new BigDecimal(1); // 设置一个合理的初始值
+ }
x = x.add(value.divide(x, scale, RoundingMode.HALF_UP)).divide(new BigDecimal(2), scale, RoundingMode.HALF_UP);
} while (x.subtract(prev).abs().compareTo(BigDecimal.ONE.movePointLeft(scale)) > 0); // 直到满足精度要求
diff --git a/src/test/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategyTest.java b/src/test/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategyTest.java
deleted file mode 100644
index d489901..0000000
--- a/src/test/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategyTest.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.xcong.excoin.modules.okxNewPrice.indicator.macdAndMatrategy;
-
-import org.junit.Test;
-
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.List;
-
-public class MacdMaStrategyTest {
-
- @Test
- public void testExecute() {
- // 创建测试价格数据
- List<BigDecimal> prices = generateTestPrices(200);
-
- // 创建策略实例
- MacdMaStrategy strategy = new MacdMaStrategy();
-
- // 执行策略
- strategy.execute(prices);
-
- System.out.println("测试执行完成");
- }
-
- private List<BigDecimal> generateTestPrices(int count) {
- List<BigDecimal> prices = new ArrayList<>();
- // 生成一个简单的上升趋势价格序列
- for (int i = 1; i <= count; i++) {
- prices.add(new BigDecimal("100.00").add(new BigDecimal(i * 0.1)));
- }
- return prices;
- }
-}
\ No newline at end of file
--
Gitblit v1.9.1