Administrator
8 days ago b6b63e31d3f25784a4f4e0add7045a3d724d22fb
src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategy.java
@@ -200,7 +200,7 @@
        }else  if ( operation == OperationType.close.name()){
            analyzeClose(historicalPrices);
            signal = analyzeClose(historicalPrices);
        }
        // 根据信号和当前持仓状态生成交易指令
@@ -240,13 +240,18 @@
        // 4. 波动率过滤(必须在合理范围内)
        boolean volatilityFilter = isVolatilityInRange(volatility);
        
        if (macdPositive && volatilityFilter && isMacdFavorable) {
            log.info("多头信号形成, MACD有利状态: {}, 柱状线为正: {}, 波动率过滤: {}",
                    isMacdFavorable, macdPositive, volatilityFilter);
        }
        // 5. 底背离检查(增强多头信号可靠性)
        boolean isBottomDivergence = MACDCalculator.isBottomDivergence(closePrices, macdResult);
        
        // 所有条件必须同时满足
        return macdPositive && volatilityFilter && isMacdFavorable;
        boolean result = macdPositive && volatilityFilter && (isMacdFavorable || isBottomDivergence);
        if (result) {
            log.info("多头信号形成, MACD有利状态: {}, 柱状线为正: {}, 波动率过滤: {}, 底背离: {}",
                    isMacdFavorable, macdPositive, volatilityFilter, isBottomDivergence);
        }
        return result;
    }
    /**
@@ -267,13 +272,18 @@
        // 4. 波动率过滤(必须在合理范围内)
        boolean volatilityFilter = isVolatilityInRange(volatility);
        
        if (macdNegative && volatilityFilter && isMacdFavorable) {
            log.info("空头信号形成, MACD有利状态: {}, 柱状线为负: {}, 波动率过滤: {}",
                    isMacdFavorable, macdNegative, volatilityFilter);
        }
        // 5. 顶背离检查(增强空头信号可靠性)
        boolean isTopDivergence = MACDCalculator.isTopDivergence(closePrices, macdResult);
        
        // 所有条件必须同时满足
        return macdNegative && volatilityFilter && isMacdFavorable;
        boolean result = macdNegative && volatilityFilter && (isMacdFavorable || isTopDivergence);
        if (result) {
            log.info("空头信号形成, MACD有利状态: {}, 柱状线为负: {}, 波动率过滤: {}, 顶背离: {}",
                    isMacdFavorable, macdNegative, volatilityFilter, isTopDivergence);
        }
        return result;
    }
    
    /**
@@ -346,13 +356,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 +388,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 +411,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;
    }
    
    /**