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


Дата создания: 2024-01-24 15:19:22 Последнее изменение: 2024-01-24 15:19:22
Копировать: 1 Количество просмотров: 709
1
Подписаться
1617
Подписчики

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

Обзор

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

Стратегический принцип

Стратегия состоит из трех частей: индикатор RSI, ленты Бринга и динамическое сопротивление поддержки.

Часть RSI используется для определения перекупа и перепродажи. RSI ниже 30 является зоной перепродажи, в это время будет выпущен сигнал о покупке.

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

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

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

Стратегические преимущества

  1. Основные показатели в сочетании с техническими показателями. RSI определяет, что основные показатели перекупают и перепродают, а также используют технические формы для определения цены.

  2. Динамические устойчивые устойчивости, которые ближе к реальным устойчивостям движения цены.

  3. Пользователь может добавить фильтр тренда, который работает в сочетании с RSI и лентой Бринга, что значительно улучшает суждение и отфильтровывает большую часть шумовых сигналов.

Стратегический риск

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

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

  3. Динамическая поддержка и сопротивление задерживаются из-за вычисления исторических максимумов и минимумов. Пользователь должен надлежащим образом оптимизировать параметры поддержки и сопротивления, чтобы уровень поддержки и сопротивления был ближе к текущей цене.

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

Направление оптимизации стратегии

  1. Тестирование параметров RSI, оптимизация длины RSI, перекуп и перепродажа.

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

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

  4. Добавление или тестирование других вспомогательных показателей, таких как KDJ, MACD и т. Д., в сочетании с RSI, повышает точность суждения.

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

Подвести итог

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

Исходный код стратегии
/*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)