Стратегия торговли на основе RSI MA Crossover Swing с системой трейлинг-стопа

RSI MA CROSSOVER TRAILING SL Swing Trading risk management
Дата создания: 2025-04-24 16:51:14 Последнее изменение: 2025-04-24 16:51:14
Копировать: 4 Количество просмотров: 349
2
Подписаться
319
Подписчики

Стратегия торговли на основе RSI MA Crossover Swing с системой трейлинг-стопа Стратегия торговли на основе RSI MA Crossover Swing с системой трейлинг-стопа

Обзор

Стратегия представляет собой подвижную торговую стратегию, основанную на RSI (относительно сильный индекс) и его пересечении с подвижной средней (MA), разработанную специально для 4-часового графика. Стратегия генерирует торговые сигналы через золотые и мертвые форки RSI и MA и сочетает в себе несколько инструментов управления рисками, включая фиксированный стоп/стоп, отслеживание стоп-порогов и механизм обратного выхода.

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

  1. Ограничение временных рамокСтратегия работает только на 4-часовом графике, гарантируя, что торговые сигналы соответствуют рассчитанным временным периодам.
  2. Расчет показателя: использует RSI ((дифолтная длина 14) и его скользящую среднюю ((SMA или EMA, дифолтная длина 14) для генерации сигнала.
    • “Золотой форк” (MA на RSI) вызывает сигнал “купить” (Make More).
    • Смертный форк ((RSI под прорывом MA) вызывает сигнал продажи ((поза).
  3. Управление позицией: размер позиции рассчитывается на основе распределения капитала по каждой сделке и текущей цены.
  4. Механизм выхода
    • Фиксированная остановка / остановкаСтоп-лост (по умолчанию 1.5%) и стоп-стоп (по умолчанию 2.5%) на основе процентной настройки.
    • Отслеживание остановки: вывод запускается, когда цена отступает от максимума в указанном количестве пунктов (запасной - 10).
    • Выход“Все, что я делаю, это пытаюсь быть честным с другими.
  5. Контроль риска
    • Приостановка торговли после двух последовательных убытков, пересчет убытков в 9:15 ежедневно.

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

  1. Проверка многомерного сигналаДвойная фильтрация в сочетании с RSI и MA уменьшает ложные сигналы.
  2. Динамическое управление рисками: отслеживание стоп-локинга прибыли, фиксированный стоп-локинга ограничения убытков.
  3. Строгое управление деньгамиПозиции, основанные на распределении капитала, избегают чрезмерного леверинга.
  4. Дисциплинарный контрольНапример, в Китае, в Китае, в Китае, в Китае, в Китае, в Китае, в Китае.
  5. Визуализация знаков: Четкие графические маркировки помогают быстро распознавать сигналы и точки выхода.

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

  1. Параметр ЧувствительностьДлина RSI и MA влияет на качество сигнала и требует оптимизации для адаптации к рыночным колебаниям.
  2. Тенденционные рыночные показателиПри сильных тенденциях RSI может быть длительно перекуплен/перепродан, что задерживает сигнал.
  3. Ограничение временных рамок: применяется только для 4-часового диаграмма, другие периоды требуют повторной проверки.
  4. Продолжающийся риск убытков“Все, что мы делаем, - это пытаемся отвлечься от этого, чтобы не потерять потенциальную прибыль”.
    Решение проблемы
  • Параметры оптимизации с помощью исторической обратной связи.
  • Фильтрационный сигнал в сочетании с трендовым индикатором (например, ADX).
  • Настройка динамического счета убытков

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

  1. Слияние нескольких показателей: введение MACD или подтверждение усиленного сигнала по Бринской полосе.
  2. Изменение динамических параметровRSI длины и Stop Loss Ratio адаптируются к рыночным колебаниям.
  3. Расширение временных рамок: Тестирование стратегии на более высокий или более низкий период (например, солнечный свет / час).
  4. Оптимизация машинного обучения: Оптимизация условий входа и выхода с использованием модели обучения с историческими данными.
  5. Улучшение управления финансамиВ зависимости от динамики чистой стоимости аккаунта корректируйте пропорцию капитала для каждой сделки.

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

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

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

//@version=5
strategy("📈 RX Swing ", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=1)


// === INPUTS ===
rsiLength     = input.int(14, title="RSI Length")
maLength      = input.int(14, title="RSI MA Length")
maType        = input.string("SMA", options=["SMA", "EMA"], title="MA Type for RSI")
sl_pct        = input.float(1.5, title="Stop Loss %", minval=0.0)
tp_pct        = input.float(2.5, title="Take Profit %", minval=0.0)
capitalPerTrade = input.float(15000, title="Capital Per Trade (INR)", minval=1)
lotSize       = input.int(50, title="Lot Size (Nifty Options Lot)", minval=1)
trail_points  = input.float(10, title="Trailing SL Points", minval=0.1)

// === CALCULATIONS ===
rsi    = ta.rsi(close, rsiLength)
rsiMA  = maType == "SMA" ? ta.sma(rsi, maLength) : ta.ema(rsi, maLength)

longSignal  = ta.crossover(rsi, rsiMA)
shortSignal = ta.crossunder(rsi, rsiMA)

// === TRADING WINDOW ===
canTrade = true
exitTime = false

// === STATE VARIABLES ===
var float entryPrice = na
var bool inTrade = false
var string tradeDir = ""
var int lossCount = 0
var float trailHigh = na
var float trailLow = na

// === EXIT TRIGGER ===
exitNow = false
exitReason = ""

// === POSITION SIZE BASED ON CAPITAL ===
positionSize = (capitalPerTrade / close) * lotSize

// === ENTRY LOGIC (AFTER CLOSE OF CANDLE) ===
if (canTrade and lossCount < 2)
    if (longSignal and not inTrade and barstate.isconfirmed)  // Ensure the signal happens after candle close
        strategy.entry("Buy Call", strategy.long, qty=positionSize)
        entryPrice := close
        trailHigh := close
        inTrade := true
        tradeDir := "CALL"

    else if (shortSignal and not inTrade and barstate.isconfirmed)  // Ensure the signal happens after candle close
        strategy.entry("Buy Put", strategy.short, qty=positionSize)
        entryPrice := close
        trailLow := close
        inTrade := true
        tradeDir := "PUT"

// === TRAILING STOP-LOSS LOGIC ===
if (inTrade)
    if (tradeDir == "CALL")
        trailHigh := math.max(trailHigh, close)
        if (close <= trailHigh - trail_points)
            strategy.close("Buy Call", comment="CALL Trailing SL Hit")
            exitNow := true
            exitReason := "Trail SL"
            inTrade := false
            lossCount := lossCount + 1

    if (tradeDir == "PUT")
        trailLow := math.min(trailLow, close)
        if (close >= trailLow + trail_points)
            strategy.close("Buy Put", comment="PUT Trailing SL Hit")
            exitNow := true
            exitReason := "Trail SL"
            inTrade := false
            lossCount := lossCount + 1

// === REVERSAL EXIT LOGIC ===
if (inTrade)
    if (tradeDir == "CALL" and shortSignal)
        strategy.close("Buy Call", comment="CALL Exit on Reversal")
        exitNow := true
        exitReason := "Reversal"
        inTrade := false
        if (strategy.position_size < 0)
            lossCount := lossCount + 1

    if (tradeDir == "PUT" and longSignal)
        strategy.close("Buy Put", comment="PUT Exit on Reversal")
        exitNow := true
        exitReason := "Reversal"
        inTrade := false
        if (strategy.position_size > 0)
            lossCount := lossCount + 1

// === TP/SL EXIT LOGIC ===
if (inTrade)
    tpLevel = entryPrice * (1 + tp_pct / 100)
    slLevel = entryPrice * (1 - sl_pct / 100)

    if (strategy.position_size > 0)
        if (close >= tpLevel)
            strategy.close("Buy Call", comment="CALL TP Hit")
            exitNow := true
            exitReason := "TP"
            inTrade := false
        else if (close <= slLevel)
            strategy.close("Buy Call", comment="CALL SL Hit")
            exitNow := true
            exitReason := "SL"
            inTrade := false
            lossCount := lossCount + 1

    if (strategy.position_size < 0)
        tpLevel = entryPrice * (1 - tp_pct / 100)
        slLevel = entryPrice * (1 + sl_pct / 100)

        if (close <= tpLevel)
            strategy.close("Buy Put", comment="PUT TP Hit")
            exitNow := true
            exitReason := "TP"
            inTrade := false
        else if (close >= slLevel)
            strategy.close("Buy Put", comment="PUT SL Hit")
            exitNow := true
            exitReason := "SL"
            inTrade := false
            lossCount := lossCount + 1

// === RESET LOSS COUNT ON NEW DAY ===
if (hour == 9 and minute == 15)
    lossCount := 0

// === MARKUPS ===
plotshape(longSignal and canTrade and lossCount < 2 and barstate.isconfirmed, title="📗 CALL Entry", location=location.belowbar, style=shape.triangleup, color=color.green, size=size.small, text="CALL")
plotshape(shortSignal and canTrade and lossCount < 2 and barstate.isconfirmed, title="📕 PUT Entry", location=location.abovebar, style=shape.triangledown, color=color.red, size=size.small, text="PUT")
plotshape(exitNow and exitReason == "TP", location=location.belowbar, style=shape.xcross, color=color.green, size=size.tiny, title="✅ TP Exit", text="TP")
plotshape(exitNow and exitReason == "SL", location=location.abovebar, style=shape.xcross, color=color.red, size=size.tiny, title="❌ SL Exit", text="SL")
plotshape(exitNow and exitReason == "Reversal", location=location.abovebar, style=shape.circle, color=color.fuchsia, size=size.tiny, title="🔁 Reversal Exit", text="REV")
plotshape(exitNow and exitReason == "Trail SL", location=location.abovebar, style=shape.square, color=color.yellow, size=size.tiny, title="🔂 Trailing SL Exit", text="Trail")