Количественная стратегия динамической дивергенции RSI

RSI ATR SL/TP risk management DIVERGENCE Pivot
Дата создания: 2025-04-25 14:57:31 Последнее изменение: 2025-04-25 14:57:31
Копировать: 0 Количество просмотров: 455
2
Подписаться
319
Подписчики

Количественная стратегия динамической дивергенции RSI Количественная стратегия динамической дивергенции RSI

Обзор

RSI Double Axis Deviation Quantification - это высокотехнологичная торговая стратегия, которая использует автоматизированный алгоритм обнаружения центральных точек, который сочетает два различных метода управления остановкой / остановкой, чтобы автоматически создавать позиции при подтверждении отклонения. В основе стратегии лежит точная математическая проверка отклонения между ценой и индикатором RSI и использование динамических механизмов управления риском, чтобы гарантировать, что каждая сделка следует заданному риску и отдаче.

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

  1. Модуль расчета RSI: 14 циклов RSI с использованием Wilder Smooth Method, с использованием цены закрытия в качестве источника ввода по умолчанию.
  2. Обнаружение опорных точек:
    • Используйте скользящее окно с 5 циклами (сменяемое) для обнаружения локальных максимумов и минимумов RSI
    • Функция ta.barssince обеспечивает интервал между центральными точками на 5-60 K-линий (регулируемая область)
  3. Вместо того, чтобы прислушиваться к логике подтверждения:
    • “Вернувшийся” наблюдатель: цены вновь находятся на низком уровне, а RSI формирует более высокие низкие точки
    • Понижение отступает: цены создают высокие, а RSI формирует более низкие высоты
  4. Система исполнения сделок:
    • Двухмодовый механизм остановки: основанный на последних 20 циклах (настраиваемых) точек колебания или ATR колебаний
    • Расчет динамического стоп-хауса: рисково-доходное соотношение, основанное на сумме риска, умноженное на предварительно заданную сумму риска (по умолчанию 2: 1)
  5. Система визуализации: на графике отмечаются все эффективные отклонения и в реальном времени отображается горизонтальная линия с остановкой (красный) и остановкой (зеленый) текущих позиций.

Анализ преимуществ

  1. Механизм многомерной проверки: требуется, чтобы цены и RSI должны одновременно удовлетворять определенным формам, а временные интервалы в пределах заданного значения значительно снижают вероятность ложного сигнала.
  2. Самостоятельное управление рисками:
    • Модель волатильных точек подходит для трендовых рынков и позволяет эффективно улавливать тенденции в диапазоне
    • ATR-модуль подходит для рынка волатильности, автоматически корректируя остановку в зависимости от волатильности
  3. Высокая конфигурация параметров: все ключевые параметры (цикл RSI, диапазон диагностики, коэффициент возврата риска и т. Д.) могут быть скорректированы в зависимости от особенностей рынка.
  4. Научное управление капиталом: по умолчанию используется 10%-ная пропорция позиций, чтобы предотвратить чрезмерное рискованное воздействие на одну сделку.
  5. Визуальная обратная связь в режиме реального времени: обеспечивает интуитивно понятную поддержку принятия решений о сделке с помощью графических знаков и динамических стоп-линий.

Анализ рисков

  1. Риск отставания: RSI как отсталый индикатор, который может создавать задержанный сигнал в условиях сильной односторонней ситуации. Способы смягчения: в сочетании с трендовым фильтром или сокращением цикла RSI.
  2. Риск рыночных потрясений: может возникать последовательное ложное сигнализирование при отсутствии четкой тенденции. Способы смягчения: включить режим ATR и увеличить множитель или добавить фильтр колебаний.
  3. Опасность пересочетания параметров: конкретные комбинации параметров могут хорошо работать в исторических данных, но не работать на реальном диске. Схема смягчения: проведение многоциклических многовидовых стресс-тестов.
  4. Риск экстремальных ситуаций: прорыв может привести к падению эффективности сдерживания убытков. Схемы смягчения: избегание торговли до и после крупных экономических событий или использование опционов для хеджирования.
  5. Зависимость от временных рамок: значительная разница в производительности в разных временных периодах. Схема смягчения: полное отслеживание и оптимизация в целевых временных рамах.

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

  1. Проверка комплексных показателей: добавление MACD или показателя объема передачи в качестве второго подтверждения, улучшение качества сигнала.
  2. Динамическая коррекция параметров: автоматическая коррекция циклов RSI и ATR в зависимости от рыночных колебаний.
  3. Оптимизация машинного обучения: оптимизация ключевых комбинаций с использованием генетических алгоритмов.
  4. Анализ нескольких временных рамок: фильтрация тенденций в более высоких временных рамках.
  5. Динамическое управление позициями: изменение размеров позиций в зависимости от волатильности для достижения баланса риска.
  6. Фильтр событий: интеграция данных экономического календаря, чтобы избежать транзакций до и после публикации важных данных.

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

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

Исходный код стратегии
/*backtest
start: 2024-04-25 00:00:00
end: 2025-04-23 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"DOGE_USDT"}]
*/

//@version=6
strategy("RSI Divergence Strategy - AliferCrypto", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=10)

// === RSI Settings ===
rsiLength      = input.int(14, minval=1, title="RSI Length", group="RSI Settings", tooltip="Number of periods for RSI calculation")
rsiSource      = input.source(close, title="RSI Source", group="RSI Settings", tooltip="Price source used for RSI calculation")

// === Divergence Settings ===
lookLeft       = input.int(5, minval=1, title="Pivot Lookback Left", group="Divergence Settings", tooltip="Bars to the left for pivot detection")
lookRight      = input.int(5, minval=1, title="Pivot Lookback Right", group="Divergence Settings", tooltip="Bars to the right for pivot detection")
rangeLower     = input.int(5, minval=1, title="Min Bars Between Pivots", group="Divergence Settings", tooltip="Minimum bars between pivots to validate divergence")
rangeUpper     = input.int(60, minval=1, title="Max Bars Between Pivots", group="Divergence Settings", tooltip="Maximum bars between pivots to validate divergence")

// === SL/TP Method ===
method         = input.string("Swing", title="SL/TP Method", options=["Swing", "ATR"], group="SL/TP Settings", tooltip="Choose between swing-based or ATR-based stop and target")

// === Swing Settings ===
swingLook      = input.int(20, minval=1, title="Swing Lookback (bars)", group="Swing Settings", tooltip="Bars to look back for swing high/low")
swingMarginPct = input.float(1.0, minval=0.0, title="Swing Margin (%)", group="Swing Settings", tooltip="Margin around swing levels as percentage of price")
rrSwing        = input.float(2.0, title="R/R Ratio (Swing)", group="Swing Settings", tooltip="Risk/reward ratio when using swing-based method")

// === ATR Settings ===
atrLen         = input.int(14, minval=1, title="ATR Length", group="ATR Settings", tooltip="Number of periods for ATR calculation")
atrMult        = input.float(1.5, minval=0.1, title="ATR SL Multiplier", group="ATR Settings", tooltip="Multiplier for ATR-based stop loss calculation")
rrAtr          = input.float(2.0, title="R/R Ratio (ATR)", group="ATR Settings", tooltip="Risk/reward ratio when using ATR-based method")

// === RSI Calculation ===
_d    = ta.change(rsiSource)
up    = ta.rma(math.max(_d, 0), rsiLength)
down  = ta.rma(-math.min(_d, 0), rsiLength)
rsi   = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))

// === Divergence Detection ===
defPl      = not na(ta.pivotlow(rsi, lookLeft, lookRight))
defPh      = not na(ta.pivothigh(rsi, lookLeft, lookRight))
rsiAtRR   = rsi[lookRight]
barsPl    = ta.barssince(defPl)
barsPl1   = barsPl[1]
inRangePL = barsPl1 >= rangeLower and barsPl1 <= rangeUpper
barsPh    = ta.barssince(defPh)
barsPh1   = barsPh[1]
inRangePH = barsPh1 >= rangeLower and barsPh1 <= rangeUpper
prevPlRsi   = ta.valuewhen(defPl, rsiAtRR, 1)
prevPhRsi   = ta.valuewhen(defPh, rsiAtRR, 1)
prevPlPrice = ta.valuewhen(defPl, low[lookRight], 1)
prevPhPrice = ta.valuewhen(defPh, high[lookRight], 1)
bullCond    = defPl and low[lookRight] < prevPlPrice and rsiAtRR > prevPlRsi and inRangePL
bearCond    = defPh and high[lookRight] > prevPhPrice and rsiAtRR < prevPhRsi and inRangePH

plotshape(bullCond, title="Bullish Divergence", style=shape.triangleup, location=location.belowbar, color=color.green, size=size.tiny)
plotshape(bearCond, title="Bearish Divergence", style=shape.triangledown, location=location.abovebar, color=color.red, size=size.tiny)

// === Entries ===
if bullCond
    strategy.entry("Long", strategy.long)
if bearCond
    strategy.entry("Short", strategy.short)

// === Pre-calculate SL/TP components ===
swingLow    = ta.lowest(low, swingLook)
swingHigh   = ta.highest(high, swingLook)
atrValue    = ta.atr(atrLen)

// === SL/TP Calculation & Exits ===
var float slPrice = na
var float tpPrice = na
var float rr      = na

// Long exits
if strategy.position_size > 0
    entryPrice = strategy.position_avg_price
    if method == "Swing"
        slPrice := swingLow * (1 - swingMarginPct / 100)
        rr      := rrSwing
    else
        slPrice := entryPrice - atrValue * atrMult
        rr      := rrAtr
    risk     = entryPrice - slPrice
    tpPrice  := entryPrice + risk * rr
    strategy.exit("Exit Long", from_entry="Long", stop=slPrice, limit=tpPrice)

// Short exits
if strategy.position_size < 0
    entryPrice = strategy.position_avg_price
    if method == "Swing"
        slPrice := swingHigh * (1 + swingMarginPct / 100)
        rr      := rrSwing
    else
        slPrice := entryPrice + atrValue * atrMult
        rr      := rrAtr
    risk     = slPrice - entryPrice
    tpPrice  := entryPrice - risk * rr
    strategy.exit("Exit Short", from_entry="Short", stop=slPrice, limit=tpPrice)

// === Plot SL/TP Levels ===
plot(strategy.position_size != 0 ? slPrice : na, title="Stop Loss", style=plot.style_linebr, color=color.red)
plot(strategy.position_size != 0 ? tpPrice : na, title="Take Profit", style=plot.style_linebr, color=color.green)

// === Alerts ===
alertcondition(bullCond, title="Bull RSI Divergence", message="Bullish RSI divergence detected")
alertcondition(bearCond, title="Bear RSI Divergence", message="Bearish RSI divergence detected")