Estratégia de negociação quantitativa de parâmetros dinâmicos RSI assistida por cruzamento de médias móveis múltiplas

RSI MA SMA EMA WMA SMMA RMA
Data de criação: 2025-01-17 16:14:38 última modificação: 2025-01-17 16:14:38
cópia: 1 Cliques: 410
1
focar em
1617
Seguidores

Estratégia de negociação quantitativa de parâmetros dinâmicos RSI assistida por cruzamento de médias móveis múltiplas

Visão geral

Esta é uma estratégia de negociação quantitativa que combina o Índice de Força Relativa (RSI) com múltiplas médias móveis. Esta estratégia determina principalmente a tendência do mercado monitorando os sinais de cruzamento de diferentes tipos de médias móveis (incluindo SMA, EMA, WMA e SMMA) no indicador RSI e combina as faixas de sobrecompra e sobrevenda do próprio indicador RSI como uma base auxiliar para julgamento, para determinar a tendência do mercado. Momento de negociação.

Princípio da estratégia

A estratégia inclui principalmente as seguintes etapas principais de cálculo:

  1. Calcule o indicador RSI de 14 períodos, defina a área de sobrecompra em 70 e a área de sobrevenda em 30
  2. Calcule três médias móveis com parâmetros diferentes na curva RSI:
    • MA1: 20 períodos, SMA/EMA/WMA/SMMA opcional
    • MA2: 50 períodos, SMA/EMA/WMA/SMMA opcional
    • MA3: 100 períodos, SMA/EMA/WMA/SMMA opcional
  3. Regras de geração de sinais de negociação:
    • Sinal de compra: Quando MA2 cruza MA3 para cima
    • Sinal de venda: Quando MA2 cruza MA3 para baixo
  4. Ao mesmo tempo, detecte o desvio do indicador RSI para fornecer referência auxiliar para decisões de negociação

Vantagens estratégicas

  1. Vários indicadores técnicos são validados de forma cruzada para melhorar a confiabilidade dos sinais de negociação
  2. O tipo e os parâmetros da média móvel são ajustáveis, o que proporciona grande flexibilidade
  3. A função de detecção de divergência RSI pode ajudar a detectar pontos de virada do mercado com antecedência
  4. Use o gerenciamento de posição percentual para controlar riscos de forma eficaz
  5. Excelente efeito de visualização, fácil de analisar e testar

Risco estratégico

  1. Os cruzamentos de média móvel podem ter um efeito de atraso
  2. Sinais falsos frequentes podem ocorrer em mercados laterais
  3. Distorção do indicador RSI em certas condições de mercado
  4. A seleção inadequada de parâmetros pode resultar em muitos ou poucos sinais de negociação Solução alternativa:
  • É recomendável combinar tendências de mercado e volume de negociação para validação cruzada
  • A frequência de negociação pode ser otimizada ajustando os parâmetros da média móvel
  • Defina stop loss e take profit para controlar o risco

Direção de otimização da estratégia

  1. Otimização da filtragem de sinal:
  • Adicionar indicadores de confirmação de tendência
  • Adicionar análise de volume
  1. Otimização dinâmica de parâmetros:
  • Ajuste automaticamente os parâmetros RSI e MA de acordo com a volatilidade do mercado
  • Introdução de um método de cálculo de ciclo adaptativo
  1. Otimização do controle de risco:
  • Desenvolver mecanismo dinâmico de stop loss e take profit
  • Projetar um sistema dinâmico de gerenciamento de armazém

Resumir

Esta estratégia combina RSI e diversas médias móveis para construir um sistema de negociação altamente adaptável. A principal vantagem da estratégia está na validação cruzada de vários indicadores técnicos e na configuração flexível de parâmetros, mas, ao mesmo tempo, deve-se prestar atenção ao atraso da média móvel e ao impacto das condições de mercado no desempenho da estratégia. Por meio de otimização contínua e controle de risco, espera-se que essa estratégia alcance um desempenho estável em transações reais.

Código-fonte da estratégia
/*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 -----