Эта стратегия использует индикатор RSI для оценки уровней перекупленности/перепроданности на рынке, в сочетании с полосами Боллинджера для определения диапазона колебаний цен. Кроме того, динамическая поддержка/сопротивление генерируется на основе высоких/низких цен для запуска ордеров покупки/продажи только тогда, когда цена близка к уровням поддержки/сопротивления. Пользователи могут установить условие фильтра тренда, такое как простая скользящая средняя, чтобы гарантировать, что тенденция цен согласовывается с направлениями торговли. Эта стратегия интегрирует несколько технических индикаторов для надежной точности сигналов и эффективно захватывает рыночные возможности.
Стратегия состоит из трех ключевых компонентов
Компонент RSI оценивает уровни перекупленности/перепроданности. Падение RSI ниже 30 означает перепроданность и запускает сигнал покупки. Повышение RSI выше 70 означает перекупленность и запускает сигнал продажи.
Болинджерские полосы - это верхние/нижние полосы, рассчитанные на основе скользящей средней цены и стандартного отклонения, чтобы определить, вышла ли цена из нормального диапазона колебаний.
Компонент S / R использует динамический метод расчета для генерации ключевых уровней S / R на основе исторических высоких / низких цен (или закрытых / открытых цен) в течение определенных периодов обратного отсчета и процентных диапазонов, а также исторических точек переворота цен. Он запускает сигнал продажи, когда цена поднимается до ключевых уровней сопротивления, и сигнал покупки, когда цена падает до уровня поддержки.
В целом, эта стратегия инициирует покупку/продажу только тогда, когда RSI перекуплен/перепродан, цена выходит из полос Боллинджера, а также близость к динамическим уровням S/R.
Фундаментальный индикатор RSI в сочетании с индикатором технического анализа Bollinger Bands. RSI основно оценивает уровни перекупа/перепродажи, а Bollinger Bands определяет технические ценовые модели.
Динамический расчет S/R более близко к фактическому S/R, который регулирует движение цен.
Добавление фильтра тренда еще больше улучшает точность сигнала, отфильтровывая шум в сочетании с RSI и полосами Боллинджера.
Неправильное настройка параметров RSI может привести к ошибке в оценке. Слишком короткая длина RSI увеличивает шум. Неправильная установка порога перекупа / перепродажи также приводит к ошибкам.
Неверные параметры полос Боллинджера, такие как длина, множитель StdDev влияют на точность суждения.
Dynamic S/R опирается на исторические высокие/низкие цены, поэтому имеет тенденцию отставать.
Эта стратегия имеет относительно сложную логику с несколькими показателями, потенциально вызывающими помехи. Пользователи должны тестировать параметры для уменьшения конфликта. Упрощение критериев входа также помогает минимизировать ошибки.
Проверка и оптимизация параметров RSI, включая длину, пороги перекупа/перепродажи.
Тестируйте и оптимизируйте параметры полос Боллинджера, включая длину и множитель StdDev.
Оптимизировать динамические параметры S/R, чтобы соответствовать уровням S/R ближе к цене, например, использовать более короткие периоды обратной связи или меньше исторических высоких/низких цен.
Испытать дополнительные вспомогательные индикаторы в сочетании с RSI, такие как KDJ, MACD и т.д., для повышения точности.
Испытать и оптимизировать параметры трендового фильтра, в частности длину фильтра, чтобы продлить период хранения и уменьшить ненужные обратные заказы.
Эта стратегия использует сильные стороны нескольких индикаторов, таких как RSI, Bollinger Bands и Dynamic S / R, с обширной перекрестной проверкой для надежной точности сигнала. Добавление фильтра тренда еще больше снижает шум. Благодаря гибкой настройке параметров пользователи могут оптимизировать эту стратегию, чтобы наилучшим образом удовлетворить свои потребности. Правильное тестирование и оптимизация параметров приведут к более выраженной производительности. Это очень многообещающая количественная стратегия.
/*backtest start: 2023-01-17 00:00:00 end: 2024-01-23 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("RSI + BB + S/R Strategy with Trend Filter", shorttitle="RSI + BB + S/R + Trend Filter", overlay=true) // RSI Settings rsi_length = input.int(14, title="RSI Length") overbought = input.int(70, title="Overbought Level") oversold = input.int(30, title="Oversold Level") // Bollinger Bands Settings bb_length = input.int(20, title="BB Length") bb_deviation = input.float(2.0, title="BB Deviation") // Dynamic Support/Resistance Settings pivot_period = input.int(10, title="Pivot Period") pivot_source = input.string("High/Low", title="Pivot Source", options=["High/Low", "Close/Open"]) max_pivots = input.int(20, title="Maximum Number of Pivot", minval=5, maxval=100) channel_width = input.int(10, title="Maximum Channel Width %", minval=1) max_sr_levels = input.int(5, title="Maximum Number of S/R Levels", minval=1, maxval=10) min_strength = input.int(2, title="Minimum Strength", minval=1, maxval=10) // Trend Filter Settings use_trend_filter = input.bool(false, title="Use Trend Filter") trend_filter_length = input.int(50, title="Trend Filter Length") // Calculate RSI and Bollinger Bands rsi = ta.rsi(close, rsi_length) basis = ta.sma(close, bb_length) deviation = ta.stdev(close, bb_length) upper_band = basis + bb_deviation * deviation lower_band = basis - bb_deviation * deviation // Plot Bollinger Bands on the chart plot(upper_band, color=color.blue, title="Upper Bollinger Band") plot(lower_band, color=color.red, title="Lower Bollinger Band") // Dynamic Support/Resistance Calculation float src1 = pivot_source == "High/Low" ? high : math.max(close, open) float src2 = pivot_source == "High/Low" ? low : math.min(close, open) float ph = ta.pivothigh(src1, pivot_period, pivot_period) float pl = ta.pivotlow(src2, pivot_period, pivot_period) // Calculate maximum S/R channel zone width prdhighest = ta.highest(300) prdlowest = ta.lowest(300) cwidth = (prdhighest - prdlowest) * channel_width / 100 var pivotvals = array.new_float(0) if ph or pl array.unshift(pivotvals, ph ? ph : pl) if array.size(pivotvals) > max_pivots array.pop(pivotvals) get_sr_vals(ind) => float lo = array.get(pivotvals, ind) float hi = lo int numpp = 0 for y = 0 to array.size(pivotvals) - 1 by 1 float cpp = array.get(pivotvals, y) float wdth = cpp <= lo ? hi - cpp : cpp - lo if wdth <= cwidth if cpp <= hi lo := math.min(lo, cpp) else hi := math.max(hi, cpp) numpp += 1 [hi, lo, numpp] var sr_up_level = array.new_float(0) var sr_dn_level = array.new_float(0) sr_strength = array.new_float(0) find_loc(strength) => ret = array.size(sr_strength) for i = ret > 0 ? array.size(sr_strength) - 1 : na to 0 by 1 if strength <= array.get(sr_strength, i) break ret := i ret check_sr(hi, lo, strength) => ret = true for i = 0 to array.size(sr_up_level) > 0 ? array.size(sr_up_level) - 1 : na by 1 if array.get(sr_up_level, i) >= lo and array.get(sr_up_level, i) <= hi or array.get(sr_dn_level, i) >= lo and array.get(sr_dn_level, i) <= hi if strength >= array.get(sr_strength, i) array.remove(sr_strength, i) array.remove(sr_up_level, i) array.remove(sr_dn_level, i) else ret := false break ret if ph or pl array.clear(sr_up_level) array.clear(sr_dn_level) array.clear(sr_strength) for x = 0 to array.size(pivotvals) - 1 by 1 [hi, lo, strength] = get_sr_vals(x) if check_sr(hi, lo, strength) loc = find_loc(strength) if loc < max_sr_levels and strength >= min_strength array.insert(sr_strength, loc, strength) array.insert(sr_up_level, loc, hi) array.insert(sr_dn_level, loc, lo) if array.size(sr_strength) > max_sr_levels array.pop(sr_strength) array.pop(sr_up_level) array.pop(sr_dn_level) // Calculate the Trend Filter trend_filter = use_trend_filter ? ta.sma(close, trend_filter_length) : close // Buy Condition (RSI + Proximity to Support + Trend Filter) buy_condition = ta.crossover(rsi, oversold) and close <= ta.highest(high, max_sr_levels) and close >= ta.lowest(low, max_sr_levels) and (not use_trend_filter or close > trend_filter) // Sell Condition (RSI + Proximity to Resistance + Trend Filter) sell_condition = ta.crossunder(rsi, overbought) and close >= ta.lowest(low, max_sr_levels) and close <= ta.highest(high, max_sr_levels) and (not use_trend_filter or close < trend_filter) // Strategy Orders strategy.entry("Buy", strategy.long, when = buy_condition) strategy.entry("Sell", strategy.short, when = sell_condition)