Administrator
8 days ago 2968d8cf5bf5437728467e010e6f3292f495a9ed
src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategy.java
@@ -93,28 +93,22 @@
        // 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);
        for (int i = Math.max(0, closePrices.size() - volatilityPeriod);
             i < closePrices.size(); i++) {
            volatility.addPrice(closePrices.get(i));
        }
        volatility.calculate();
        // 最新收盘价
        BigDecimal latestPrice = closePrices.get(closePrices.size() - 1);
        // 3. 检查开平仓条件
        // 多头开仓条件检查
        if (isLongEntryCondition(macdResult, closePrices, volatility.getValue())) {
        if (isLongEntryCondition(macdResult, closePrices)) {
            // 执行开多
            log.info( "多头开仓信号,价格:{}", latestPrice);
            return PositionType.LONG_BUY;
        }
        // 空头开仓条件检查
        if (isShortEntryCondition(macdResult, closePrices, volatility.getValue())) {
        if (isShortEntryCondition(macdResult, closePrices)) {
            // 执行开空
             log.info( "空头开仓信号,价格:{}", latestPrice);
            return PositionType.SHORT_SELL;
@@ -226,10 +220,9 @@
     *
     * @param macdResult MACD计算结果
     * @param closePrices 收盘价序列
     * @param volatility 当前波动率
     * @return 是否满足多头开仓条件
     */
    private boolean isLongEntryCondition(MACDResult macdResult, List<BigDecimal> closePrices, BigDecimal volatility) {
    private boolean isLongEntryCondition(MACDResult macdResult, List<BigDecimal> closePrices) {
        // 2. MACD金叉且柱状线扩张检查
        boolean isMacdFavorable = isMacdGoldenCrossAndExpanding(macdResult);
@@ -237,19 +230,14 @@
        // 3. MACD柱状线必须为正
        boolean macdPositive = isMacdPositive(macdResult);
        
        // 4. 波动率过滤(必须在合理范围内)
        boolean volatilityFilter = isVolatilityInRange(volatility);
        // 5. 底背离检查(增强多头信号可靠性)
        boolean isBottomDivergence = MACDCalculator.isBottomDivergence(closePrices, macdResult);
        log.info("多头信号形成, MACD有利状态: {}, 柱状线为正: {}, 底背离: {}",
                isMacdFavorable, macdPositive, isBottomDivergence);
        
        // 所有条件必须同时满足
        boolean result = macdPositive && volatilityFilter && (isMacdFavorable || isBottomDivergence);
        if (result) {
            log.info("多头信号形成, MACD有利状态: {}, 柱状线为正: {}, 波动率过滤: {}, 底背离: {}",
                    isMacdFavorable, macdPositive, volatilityFilter, isBottomDivergence);
        }
        boolean result = macdPositive && (isMacdFavorable || isBottomDivergence);
        
        return result;
    }
@@ -259,29 +247,22 @@
     * 
     * @param macdResult MACD计算结果
     * @param closePrices 收盘价序列
     * @param volatility 当前波动率
     * @return 是否满足空头开仓条件
     */
    private boolean isShortEntryCondition(MACDResult macdResult, List<BigDecimal> closePrices, BigDecimal volatility) {
    private boolean isShortEntryCondition(MACDResult macdResult, List<BigDecimal> closePrices) {
        // 2. MACD死叉且柱状线收缩检查
        boolean isMacdFavorable = isMacdDeathCrossAndContracting(macdResult);
        
        // 3. MACD柱状线必须为负
        boolean macdNegative = isMacdNegative(macdResult);
        
        // 4. 波动率过滤(必须在合理范围内)
        boolean volatilityFilter = isVolatilityInRange(volatility);
        // 5. 顶背离检查(增强空头信号可靠性)
        boolean isTopDivergence = MACDCalculator.isTopDivergence(closePrices, macdResult);
        log.info("空头信号形成, MACD有利状态: {}, 柱状线为负: {}, 顶背离: {}",
                isMacdFavorable, macdNegative, isTopDivergence);
        // 所有条件必须同时满足
        boolean result = macdNegative && volatilityFilter && (isMacdFavorable || isTopDivergence);
        if (result) {
            log.info("空头信号形成, MACD有利状态: {}, 柱状线为负: {}, 波动率过滤: {}, 顶背离: {}",
                    isMacdFavorable, macdNegative, volatilityFilter, isTopDivergence);
        }
        boolean result = macdNegative && (isMacdFavorable || isTopDivergence);
        
        return result;
    }