Количественная торговая стратегия с использованием динамического параметра RSI и пересечения нескольких скользящих средних

RSI MA SMA EMA WMA SMMA RMA
Дата создания: 2025-01-17 16:14:38 Последнее изменение: 2025-01-17 16:14:38
Копировать: 1 Количество просмотров: 410
1
Подписаться
1617
Подписчики

Количественная торговая стратегия с использованием динамического параметра RSI и пересечения нескольких скользящих средних

Обзор

Это количественная торговая стратегия, которая сочетает индекс относительной силы (RSI) с несколькими скользящими средними. Эта стратегия в основном определяет рыночный тренд, отслеживая сигналы пересечения различных типов скользящих средних (включая SMA, EMA, WMA и SMMA) на индикаторе RSI, и объединяет диапазоны перекупленности и перепроданности самого индикатора RSI в качестве вспомогательной основы для суждение, чтобы определить рыночную тенденцию. Время торговли.

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

Стратегия в основном включает в себя следующие ключевые этапы расчета:

  1. Рассчитайте 14-периодный индикатор RSI, установите зону перекупленности на 70, а зону перепроданности на 30.
  2. Рассчитайте три скользящие средние с разными параметрами на кривой RSI:
    • MA1: 20 периодов, опционально SMA/EMA/WMA/SMMA
    • MA2: период 50, опционально SMA/EMA/WMA/SMMA
    • MA3: период 100, опционально SMA/EMA/WMA/SMMA
  3. Правила формирования торговых сигналов:
    • Сигнал на покупку: когда MA2 пересекает MA3 снизу вверх.
    • Сигнал на продажу: когда MA2 пересекает MA3 сверху вниз.
  4. В то же время, определите отклонение индикатора RSI, чтобы предоставить вспомогательную информацию для принятия торговых решений.

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

  1. Перекрестная проверка нескольких технических индикаторов для повышения надежности торговых сигналов
  2. Тип и параметры скользящей средней настраиваются, что обеспечивает большую гибкость.
  3. Функция обнаружения расхождения RSI может помочь заранее определить поворотные моменты рынка
  4. Используйте управление процентной позицией для эффективного контроля рисков
  5. Превосходный эффект визуализации, легко анализировать и тестировать на исторических данных

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

  1. Пересечения скользящих средних могут иметь запаздывающий эффект
  2. На боковых рынках могут возникать частые ложные сигналы
  3. Искажение индикатора RSI в определенных рыночных условиях
  4. Неправильный выбор параметров может привести к слишком большому или слишком малому количеству торговых сигналов. Обходной путь:
  • Рекомендуется объединять рыночные тенденции и объем торгов для перекрестной проверки.
  • Частоту торговли можно оптимизировать, настроив параметры скользящей средней.
  • Установите стоп-лосс и тейк-профит для контроля риска

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

  1. Оптимизация фильтрации сигнала:
  • Добавить индикаторы подтверждения тренда
  • Добавить анализ объема
  1. Динамическая оптимизация параметров:
  • Автоматически настраивайте параметры RSI и MA в соответствии с волатильностью рынка
  • Представляем адаптивный метод расчета цикла
  1. Оптимизация контроля рисков:
  • Разработать динамический механизм стоп-лосса и тейк-профита
  • Разработать динамическую систему управления складом

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

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

Исходный код стратегии
/*backtest
start: 2024-01-17 00:00:00
end: 2025-01-16 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/

//@version=6
strategy(title="Relative Strength Index with MA Strategy", shorttitle="RSI-MA Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=200)

// RSI Inputs
rsiLengthInput = input.int(14, minval=1, title="RSI Length", group="RSI Settings")
rsiSourceInput = input.source(close, "Source", group="RSI Settings")
calculateDivergence = input.bool(false, title="Calculate Divergence", group="RSI Settings", tooltip="Calculating divergences is needed in order for divergence alerts to fire.")

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

// RSI Plot
plot(rsi, "RSI", color=#7E57C2)
hline(70, "RSI Upper Band", color=#787B86)
hline(50, "RSI Middle Band", color=color.new(#787B86, 50))
hline(30, "RSI Lower Band", color=#787B86)
fill(hline(70), hline(30), color=color.rgb(126, 87, 194, 90), title="RSI Background Fill")

// RSI-based MA Inputs
grpRSIMovingAverages = "RSI Moving Averages"
ma1Length = input.int(20, title="MA1 Length", group=grpRSIMovingAverages)
ma2Length = input.int(50, title="MA2 Length", group=grpRSIMovingAverages)
ma3Length = input.int(100, title="MA3 Length", group=grpRSIMovingAverages)
ma1Type = input.string("SMA", title="MA1 Type", options=["SMA", "EMA", "WMA", "SMMA"], group=grpRSIMovingAverages)
ma2Type = input.string("EMA", title="MA2 Type", options=["SMA", "EMA", "WMA", "SMMA"], group=grpRSIMovingAverages)
ma3Type = input.string("WMA", title="MA3 Type", options=["SMA", "EMA", "WMA", "SMMA"], group=grpRSIMovingAverages)

// MA Calculation Function
calcMA(source, length, type) =>
    switch type
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "WMA" => ta.wma(source, length)
        "SMMA" => ta.rma(source, length)

// MA Calculations
ma1 = calcMA(rsi, ma1Length, ma1Type)
ma2 = calcMA(rsi, ma2Length, ma2Type)
ma3 = calcMA(rsi, ma3Length, ma3Type)

// MA Plots
plot(ma1, title="RSI MA1", color=color.blue)
plot(ma2, title="RSI MA2", color=color.green)
plot(ma3, title="RSI MA3", color=color.red)

// Divergence (Retained from original script)
lookbackRight = 5
lookbackLeft = 5
rangeUpper = 60
rangeLower = 5
bearColor = color.red
bullColor = color.green
textColor = color.white
noneColor = color.new(color.white, 100)

_inRange(bool cond) =>
    bars = ta.barssince(cond)
    rangeLower <= bars and bars <= rangeUpper

plFound = false
phFound = false

bullCond = false
bearCond = false

rsiLBR = rsi[lookbackRight]

if calculateDivergence
    // Regular Bullish
    plFound := not na(ta.pivotlow(rsi, lookbackLeft, lookbackRight))    
    rsiHL = rsiLBR > ta.valuewhen(plFound, rsiLBR, 1) and _inRange(plFound[1])
    lowLBR = low[lookbackRight]
    priceLL = lowLBR < ta.valuewhen(plFound, lowLBR, 1)
    bullCond := priceLL and rsiHL and plFound

    // Regular Bearish
    phFound := not na(ta.pivothigh(rsi, lookbackLeft, lookbackRight))
    rsiLH = rsiLBR < ta.valuewhen(phFound, rsiLBR, 1) and _inRange(phFound[1])
    highLBR = high[lookbackRight]
    priceHH = highLBR > ta.valuewhen(phFound, highLBR, 1)
    bearCond := priceHH and rsiLH and phFound

// plot(
//      plFound ? rsiLBR : na,
//      offset=-lookbackRight,
//      title="Regular Bullish",
//      linewidth=2,
//      color=(bullCond ? bullColor : noneColor),
//      display = display.pane
//      )

plotshape(
     bullCond ? rsiLBR : na,
     offset=-lookbackRight,
     title="Regular Bullish Label",
     text=" Bull ",
     style=shape.labelup,
     location=location.absolute,
     color=bullColor,
     textcolor=textColor
     )

// plot(
//      phFound ? rsiLBR : na,
//      offset=-lookbackRight,
//      title="Regular Bearish",
//      linewidth=2,
//      color=(bearCond ? bearColor : noneColor),
//      display = display.pane
//      )

plotshape(
     bearCond ? rsiLBR : na,
     offset=-lookbackRight,
     title="Regular Bearish Label",
     text=" Bear ",
     style=shape.labeldown,
     location=location.absolute,
     color=bearColor,
     textcolor=textColor
     )

alertcondition(bullCond, title='Regular Bullish Divergence', message="Found a new Regular Bullish Divergence, `Pivot Lookback Right` number of bars to the left of the current bar.")
alertcondition(bearCond, title='Regular Bearish Divergence', message='Found a new Regular Bearish Divergence, `Pivot Lookback Right` number of bars to the left of the current bar.')

// ----- MUA/BÁN -----

// Điều kiện Mua: MA2 cắt lên MA3 và MA3 < 55
buyCondition = ta.crossover(ma2, ma3) 

// Điều kiện Bán: MA2 cắt xuống MA3 và MA3 > 40
sellCondition = ta.crossunder(ma2, ma3)

// Thực hiện lệnh Mua/Bán
if (buyCondition)
    strategy.entry("Buy", strategy.long, comment="Buy Signal")

if (sellCondition)
    strategy.close("Buy", comment="Sell Signal")



// ----- KẾT THÚC -----