O recurso está a ser carregado... Carregamento...

Estratégia de negociação quantitativa RSI dinâmica com cruzamento de médias móveis múltiplas

Autora:ChaoZhang, Data: 2025-01-17 16:14:38
Tags:RSIMASMAEMAWMASMMARMA

 Dynamic RSI Quantitative Trading Strategy with Multiple Moving Average Crossover

Resumo

Esta é uma estratégia quantitativa de negociação que combina o Índice de Força Relativa (RSI) com múltiplas médias móveis. A estratégia identifica principalmente as tendências do mercado monitorando sinais cruzados entre diferentes tipos de médias móveis (incluindo SMA, EMA, WMA e SMMA) no indicador RSI, usando as zonas de sobrecompra e sobrevenda do RSI como critérios de decisão suplementares.

Princípios de estratégia

A estratégia inclui várias etapas-chave de cálculo: 1. Calcule o RSI de 14 períodos com nível de sobrecompra em 70 e nível de sobrevenda em 30 Calcule três médias móveis diferentes na curva RSI: - MA1: período de 20 anos, escolha de SMA/EMA/WMA/SMMA - MA2: período de 50 anos, escolha de SMA/EMA/WMA/SMMA - MA3: período de 100 anos, escolha de SMA/EMA/WMA/SMMA Regras de geração de sinais comerciais: - sinal de compra: quando o MA2 cruza acima do MA3 - sinal de venda: quando o MA2 cruza abaixo do MA3 4. Detectar simultaneamente as divergências do RSI para referência adicional

Vantagens da estratégia

  1. A validação cruzada de múltiplos indicadores técnicos melhora a fiabilidade do sinal
  2. Tipos e parâmetros de médias móveis flexíveis
  3. A detecção da divergência do RSI ajuda a identificar precocemente os pontos de virada do mercado
  4. Gestão de posições baseada em percentagem para um controlo eficaz dos riscos
  5. Excelente visualização para análise e backtesting

Riscos estratégicos

  1. Os crossovers da média móvel podem ter efeitos de atraso
  2. Podem ocorrer sinais falsos em mercados variados
  3. Distorção do RSI em determinadas condições de mercado
  4. A escolha incorreta dos parâmetros pode conduzir a sinais de negociação excessivos ou insuficientes Mitigação dos riscos:
  • Recomendar a validação cruzada com as tendências e o volume do mercado
  • Otimizar a frequência de negociação através do ajuste dos parâmetros da média móvel
  • Fixar níveis de stop-loss e take-profit para controlo do risco

Orientações para a otimização da estratégia

  1. Optimização de filtragem de sinal:
  • Adicionar indicadores de confirmação da tendência
  • Incorporar análise de volume
  1. Optimização dinâmica de parâmetros:
  • Ajustar automaticamente os parâmetros RSI e MA com base na volatilidade do mercado
  • Introdução de métodos de cálculo do período adaptativo
  1. Optimização do controlo dos riscos:
  • Desenvolver mecanismos dinâmicos de stop-loss e take-profit
  • Projeto de um sistema dinâmico de gestão da posição

Resumo

A estratégia constrói um sistema de negociação adaptável, combinando RSI e múltiplas médias móveis. Suas principais vantagens estão na validação cruzada de múltiplos indicadores técnicos e configuração de parâmetros flexíveis, enquanto a atenção deve ser dada ao atraso da média móvel e aos impactos das condições do mercado no desempenho da estratégia. Através da otimização contínua e controle de riscos, essa estratégia mostra promessa de desempenho estável na negociação real.


/*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 -----


Relacionados

Mais.