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/MacdMaStrategy.java |   29 ++++++++++++++++-------------
 1 files changed, 16 insertions(+), 13 deletions(-)

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 &&

--
Gitblit v1.9.1