Administrator
8 days ago 3e09eb864f92c821b8d69c5110175d7c2382e4df
src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategy.java
@@ -93,6 +93,8 @@
        // 1. 计算MACD指标
        MACDResult macdResult = MACDCalculator.calculateMACD(
                closePrices, shortPeriod, longPeriod, signalPeriod);
         log.info( "MACD计算结果:{}", macdResult.getMacdData().get( macdResult.getMacdData().size() -1));
        // 2. 计算波动率
        Volatility volatility = new Volatility(volatilityPeriod);
@@ -200,7 +202,7 @@
        }else  if ( operation == OperationType.close.name()){
            analyzeClose(historicalPrices);
            signal = analyzeClose(historicalPrices);
        }
        // 根据信号和当前持仓状态生成交易指令
@@ -240,13 +242,16 @@
        // 4. 波动率过滤(必须在合理范围内)
        boolean volatilityFilter = isVolatilityInRange(volatility);
        
        if (macdPositive && volatilityFilter && isMacdFavorable) {
            log.info("多头信号形成, MACD有利状态: {}, 柱状线为正: {}, 波动率过滤: {}",
                    isMacdFavorable, macdPositive, volatilityFilter);
        }
        // 5. 底背离检查(增强多头信号可靠性)
        boolean isBottomDivergence = MACDCalculator.isBottomDivergence(closePrices, macdResult);
        log.info("多头信号形成, MACD有利状态: {}, 柱状线为正: {}, 波动率过滤: {}, 底背离: {}",
                isMacdFavorable, macdPositive, volatilityFilter, isBottomDivergence);
        
        // 所有条件必须同时满足
        return macdPositive && volatilityFilter && isMacdFavorable;
        boolean result = macdPositive && volatilityFilter && (isMacdFavorable || isBottomDivergence);
        return result;
    }
    /**
@@ -267,13 +272,15 @@
        // 4. 波动率过滤(必须在合理范围内)
        boolean volatilityFilter = isVolatilityInRange(volatility);
        
        if (macdNegative && volatilityFilter && isMacdFavorable) {
            log.info("空头信号形成, MACD有利状态: {}, 柱状线为负: {}, 波动率过滤: {}",
                    isMacdFavorable, macdNegative, volatilityFilter);
        }
        // 5. 顶背离检查(增强空头信号可靠性)
        boolean isTopDivergence = MACDCalculator.isTopDivergence(closePrices, macdResult);
        log.info("空头信号形成, MACD有利状态: {}, 柱状线为负: {}, 波动率过滤: {}, 顶背离: {}",
                isMacdFavorable, macdNegative, volatilityFilter, isTopDivergence);
        // 所有条件必须同时满足
        return macdNegative && volatilityFilter && isMacdFavorable;
        boolean result = macdNegative && volatilityFilter && (isMacdFavorable || isTopDivergence);
        return result;
    }
    
    /**
@@ -346,13 +353,13 @@
        // 金叉判断:DIF从下往上穿过DEA
        boolean isGoldenCross = prevPrev.getDif().compareTo(prevPrev.getDea()) <= 0 && 
                              previous.getDif().compareTo(previous.getDea()) > 0;
        // 柱状线扩张判断:连续正值且绝对值增大
        boolean isExpanding = latest.getMacdHist().compareTo(BigDecimal.ZERO) > 0 &&
        boolean isExpanding = latest.getMacdHist().compareTo(BigDecimal.ZERO) > 0 &&
                            previous.getMacdHist().compareTo(BigDecimal.ZERO) > 0 &&
                            previous.getMacdHist().abs().compareTo(latest.getMacdHist().abs()) < 0;
        
        // 金叉或柱状线扩张任一满足即可
        // 金叉柱状线扩张满足
        return isGoldenCross && isExpanding;
    }
    
@@ -378,14 +385,14 @@
    }
    /**
     * MACD死叉且柱状线收缩检查
     * MACD死叉且柱状线扩张检查
     * <p>
     * 条件:
     * 1. DIF线从上往下穿过DEA线(死叉)
     * 2. MACD柱状线绝对值减小且为负值(动量减弱)
     * 2. MACD柱状线绝对值增大且为负值(动量增强)
     * 
     * @param macdResult MACD计算结果
     * @return 是否形成MACD死叉或柱状线收缩
     * @return 是否形成MACD死叉且柱状线扩张
     */
    private boolean isMacdDeathCrossAndContracting(MACDResult macdResult) {
        List<PriceData> macdData = macdResult.getMacdData();
@@ -401,13 +408,13 @@
        boolean isDeathCross = prevPrev.getDif().compareTo(prevPrev.getDea()) >= 0 && 
                             previous.getDif().compareTo(previous.getDea()) < 0;
        
        // 柱状线收缩判断:连续负值且绝对值减小
        boolean isContracting = latest.getMacdHist().compareTo(BigDecimal.ZERO) < 0 &&
                              previous.getMacdHist().compareTo(BigDecimal.ZERO) < 0 &&
                              previous.getMacdHist().abs().compareTo(latest.getMacdHist().abs()) > 0;
        // 优化后的死叉柱状线条件:空头趋势中,死叉应伴随柱状线扩张(绝对值增大)
        boolean isExpanding = latest.getMacdHist().compareTo(BigDecimal.ZERO) < 0 &&
                previous.getMacdHist().compareTo(BigDecimal.ZERO) < 0 &&
                previous.getMacdHist().abs().compareTo(latest.getMacdHist().abs()) < 0;
        
        // 死叉或柱状线收缩任一满足即可
        return isDeathCross && isContracting;
        // 死叉且柱状线扩张
        return isDeathCross && isExpanding;
    }
    
    /**