В процессе загрузки ресурсов... загрузка...

Динамическая стратегия количественной торговли с множественным перекрестным перемещением скользящих средних

Автор:Чао Чжан, Дата: 2025-01-17 16:14:38
Тэги:РСИМ.А.SMAЕМАWMAСММАRMA

 Dynamic RSI Quantitative Trading Strategy with Multiple Moving Average Crossover

Обзор

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

Принципы стратегии

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

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

  1. Взаимная проверка нескольких технических показателей повышает надежность сигнала
  2. Типы и параметры гибких скользящих средних
  3. Выявление дивергенции РСИ помогает ранне определить поворотные моменты на рынке
  4. Управление позициями на основе процентов для эффективного контроля рисков
  5. Отличная визуализация для анализа и обратного тестирования

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

  1. Пересечение скользящих средних может иметь эффект задержки
  2. На различных рынках могут возникать ложные сигналы
  3. Извращение РСИ при определенных рыночных условиях
  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 -----


Связанные

Больше