| | |
| | | * @return 是否为震荡市场 |
| | | */ |
| | | private boolean isRangeMarket(List<BigDecimal> prices) { |
| | | // 强化的震荡市场判断条件 |
| | | // 优化的震荡市场判断条件,放宽标准以减少RANGING信号频率 |
| | | |
| | | // 1. 高级MA三线收敛(小于2%) |
| | | boolean isMaConverged = advancedMA.calculatePercent().compareTo(new BigDecimal(2)) < 0; |
| | | // 1. 高级MA三线收敛(小于3%,放宽条件) |
| | | boolean isMaConverged = advancedMA.calculatePercent().compareTo(new BigDecimal(3)) < 0; |
| | | |
| | | // 2. RSI中性区间(40-60) |
| | | boolean isRsiNeutral = rsi.getRsi().compareTo(new BigDecimal(40)) > 0 && |
| | | rsi.getRsi().compareTo(new BigDecimal(60)) < 0; |
| | | // 2. RSI中性区间(35-65,放宽条件) |
| | | boolean isRsiNeutral = rsi.getRsi().compareTo(new BigDecimal(35)) > 0 && |
| | | rsi.getRsi().compareTo(new BigDecimal(65)) < 0; |
| | | |
| | | // 3. BOLL带宽收窄(小于0.05) |
| | | boolean isBollNarrow = boll.calculateBandWidth().compareTo(new BigDecimal(0.05)) < 0; |
| | | // 3. BOLL带宽收窄(小于0.06,放宽条件) |
| | | boolean isBollNarrow = boll.calculateBandWidth().compareTo(new BigDecimal(0.06)) < 0; |
| | | |
| | | // 4. MACD柱状图趋近于0(多空力量平衡) |
| | | boolean isMacdBalanced = macd.getMacdBar().abs().compareTo(new BigDecimal(0.01)) < 0; |
| | | // 4. MACD柱状图趋近于0(多空力量平衡,放宽条件) |
| | | boolean isMacdBalanced = macd.getMacdBar().abs().compareTo(new BigDecimal(0.02)) < 0; |
| | | |
| | | // 5. KDJ在中间区域波动(30-70) |
| | | boolean isKdjNeutral = kdj.getK().compareTo(new BigDecimal(30)) > 0 && |
| | | kdj.getK().compareTo(new BigDecimal(70)) < 0 && |
| | | kdj.getD().compareTo(new BigDecimal(30)) > 0 && |
| | | kdj.getD().compareTo(new BigDecimal(70)) < 0 && |
| | | kdj.getJ().compareTo(new BigDecimal(30)) > 0 && |
| | | kdj.getJ().compareTo(new BigDecimal(70)) < 0; |
| | | // 5. KDJ在中间区域波动(25-75,放宽条件) |
| | | boolean isKdjNeutral = kdj.getK().compareTo(new BigDecimal(25)) > 0 && |
| | | kdj.getK().compareTo(new BigDecimal(75)) < 0 && |
| | | kdj.getD().compareTo(new BigDecimal(25)) > 0 && |
| | | kdj.getD().compareTo(new BigDecimal(75)) < 0 && |
| | | kdj.getJ().compareTo(new BigDecimal(20)) > 0 && |
| | | kdj.getJ().compareTo(new BigDecimal(80)) < 0; |
| | | |
| | | // 6. 价格波动范围较小(最近20根K线最高价与最低价的比值小于1.05) |
| | | boolean isPriceVolatilityLow = calculatePriceVolatility(prices).compareTo(new BigDecimal(1.05)) < 0; |
| | | // 6. 价格波动范围较小(最近20根K线最高价与最低价的比值小于1.06,放宽条件) |
| | | boolean isPriceVolatilityLow = calculatePriceVolatility(prices).compareTo(new BigDecimal(1.06)) < 0; |
| | | |
| | | // 综合判断:需要满足大部分条件 |
| | | return isMaConverged && isRsiNeutral && isBollNarrow && |
| | | (isMacdBalanced || isKdjNeutral || isPriceVolatilityLow); |
| | | // 综合判断:只需要满足部分条件即可,增加趋势信号的机会 |
| | | int rangeConditionsMet = 0; |
| | | if (isMaConverged) { |
| | | rangeConditionsMet++; |
| | | } |
| | | if (isRsiNeutral) { |
| | | rangeConditionsMet++; |
| | | } |
| | | if (isBollNarrow) { |
| | | rangeConditionsMet++; |
| | | } |
| | | if (isMacdBalanced) { |
| | | rangeConditionsMet++; |
| | | } |
| | | if (isKdjNeutral) { |
| | | rangeConditionsMet++; |
| | | } |
| | | if (isPriceVolatilityLow) { |
| | | rangeConditionsMet++; |
| | | } |
| | | |
| | | // 只有满足4个或以上条件才判定为震荡市场 |
| | | return rangeConditionsMet >= 4; |
| | | } |
| | | |
| | | /** |