| | |
| | | * @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; |
| | | |
| | | // 4. 波动率过滤检查(0.5% ~ 5%) |
| | | boolean volatilityFilter = isVolatilityInRange(volatility); |
| | | // 3. 简化的波动率检查 |
| | | boolean volatilityFilter = volatility.compareTo(BigDecimal.ZERO) > 0; |
| | | |
| | | // 所有条件必须同时满足 |
| | | return emaGoldenCross && macdGoldenCross && priceBreakout && volatilityFilter; |
| | | // 只需要EMA短期在长期上方、MACD柱状线为正且波动率大于0 |
| | | return emaGoldenCross && emaShortAboveLong && macdPositive && volatilityFilter; |
| | | } |
| | | |
| | | /** |
| | |
| | | * @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 && |