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