RSI в сочетании с полосами Боллинджера и динамической стратегией поддержки/сопротивления

Автор:Чао Чжан, Дата: 2024-01-24 15:19:22
Тэги:

img

Обзор

Эта стратегия использует индикатор RSI для оценки уровней перекупленности/перепроданности на рынке, в сочетании с полосами Боллинджера для определения диапазона колебаний цен. Кроме того, динамическая поддержка/сопротивление генерируется на основе высоких/низких цен для запуска ордеров покупки/продажи только тогда, когда цена близка к уровням поддержки/сопротивления. Пользователи могут установить условие фильтра тренда, такое как простая скользящая средняя, чтобы гарантировать, что тенденция цен согласовывается с направлениями торговли. Эта стратегия интегрирует несколько технических индикаторов для надежной точности сигналов и эффективно захватывает рыночные возможности.

Логика стратегии

Стратегия состоит из трех ключевых компонентов RSI, Bollinger Bands и Dynamic S/R.

Компонент RSI оценивает уровни перекупленности/перепроданности. Падение RSI ниже 30 означает перепроданность и запускает сигнал покупки. Повышение RSI выше 70 означает перекупленность и запускает сигнал продажи.

Болинджерские полосы - это верхние/нижние полосы, рассчитанные на основе скользящей средней цены и стандартного отклонения, чтобы определить, вышла ли цена из нормального диапазона колебаний.

Компонент S / R использует динамический метод расчета для генерации ключевых уровней S / R на основе исторических высоких / низких цен (или закрытых / открытых цен) в течение определенных периодов обратного отсчета и процентных диапазонов, а также исторических точек переворота цен. Он запускает сигнал продажи, когда цена поднимается до ключевых уровней сопротивления, и сигнал покупки, когда цена падает до уровня поддержки.

В целом, эта стратегия инициирует покупку/продажу только тогда, когда RSI перекуплен/перепродан, цена выходит из полос Боллинджера, а также близость к динамическим уровням S/R.

Преимущества

  1. Фундаментальный индикатор RSI в сочетании с индикатором технического анализа Bollinger Bands. RSI основно оценивает уровни перекупа/перепродажи, а Bollinger Bands определяет технические ценовые модели.

  2. Динамический расчет S/R более близко к фактическому S/R, который регулирует движение цен.

  3. Добавление фильтра тренда еще больше улучшает точность сигнала, отфильтровывая шум в сочетании с RSI и полосами Боллинджера.

Риски

  1. Неправильное настройка параметров RSI может привести к ошибке в оценке. Слишком короткая длина RSI увеличивает шум. Неправильная установка порога перекупа / перепродажи также приводит к ошибкам.

  2. Неверные параметры полос Боллинджера, такие как длина, множитель StdDev влияют на точность суждения.

  3. Dynamic S/R опирается на исторические высокие/низкие цены, поэтому имеет тенденцию отставать.

  4. Эта стратегия имеет относительно сложную логику с несколькими показателями, потенциально вызывающими помехи. Пользователи должны тестировать параметры для уменьшения конфликта. Упрощение критериев входа также помогает минимизировать ошибки.

Руководство по оптимизации

  1. Проверка и оптимизация параметров RSI, включая длину, пороги перекупа/перепродажи.

  2. Тестируйте и оптимизируйте параметры полос Боллинджера, включая длину и множитель StdDev.

  3. Оптимизировать динамические параметры S/R, чтобы соответствовать уровням S/R ближе к цене, например, использовать более короткие периоды обратной связи или меньше исторических высоких/низких цен.

  4. Испытать дополнительные вспомогательные индикаторы в сочетании с RSI, такие как KDJ, MACD и т.д., для повышения точности.

  5. Испытать и оптимизировать параметры трендового фильтра, в частности длину фильтра, чтобы продлить период хранения и уменьшить ненужные обратные заказы.

Заключение

Эта стратегия использует сильные стороны нескольких индикаторов, таких как 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)

Больше