Estrategia de negociación cuantitativa con parámetros dinámicos RSI asistidos por cruce de medias móviles múltiples

RSI MA SMA EMA WMA SMMA RMA
Fecha de creación: 2025-01-17 16:14:38 Última modificación: 2025-01-17 16:14:38
Copiar: 1 Número de Visitas: 410
1
Seguir
1617
Seguidores

Estrategia de negociación cuantitativa con parámetros dinámicos RSI asistidos por cruce de medias móviles múltiples

Descripción general

Esta es una estrategia comercial cuantitativa que combina el índice de fuerza relativa (RSI) con múltiples promedios móviles. Esta estrategia determina principalmente la tendencia del mercado mediante el seguimiento de las señales de cruce de diferentes tipos de promedios móviles (incluidos SMA, EMA, WMA y SMMA) en el indicador RSI, y combina los rangos de sobrecompra y sobreventa del propio indicador RSI como base auxiliar para Juicio, para determinar la tendencia del mercado. Momento de negociación.

Principio de estrategia

La estrategia incluye principalmente los siguientes pasos de cálculo clave:

  1. Calcule el indicador RSI de 14 períodos, establezca el área de sobrecompra en 70 y el área de sobreventa en 30
  2. Calcular tres medias móviles con diferentes parámetros en la 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. Reglas de generación de señales comerciales:
    • Señal de compra: Cuando MA2 cruza MA3 hacia arriba
    • Señal de venta: Cuando MA2 cruza MA3 hacia abajo
  4. Al mismo tiempo, detecta la desviación del indicador RSI para proporcionar una referencia auxiliar para las decisiones comerciales.

Ventajas estratégicas

  1. Múltiples indicadores técnicos se validan de forma cruzada para mejorar la confiabilidad de las señales comerciales
  2. El tipo y los parámetros de media móvil son ajustables, lo que tiene una gran flexibilidad.
  3. La función de detección de divergencia RSI puede ayudar a detectar puntos de inflexión del mercado con antelación
  4. Utilice la gestión de posiciones porcentuales para controlar eficazmente los riesgos
  5. Excelente efecto de visualización, fácil de analizar y realizar pruebas retrospectivas.

Riesgo estratégico

  1. Los cruces de medias móviles pueden tener un efecto rezagado
  2. En los mercados laterales pueden producirse señales falsas frecuentes
  3. Distorsión del indicador RSI en determinadas condiciones de mercado
  4. La selección incorrecta de parámetros puede dar como resultado demasiadas o muy pocas señales comerciales Solución alternativa:
  • Se recomienda combinar las tendencias del mercado y el volumen comercial para la validación cruzada.
  • La frecuencia de negociación se puede optimizar ajustando los parámetros de media móvil.
  • Establezca stop loss y take profit para controlar el riesgo

Dirección de optimización de la estrategia

  1. Optimización del filtrado de señales:
  • Añadir indicadores de confirmación de tendencias
  • Añadir análisis de volumen
  1. Optimización dinámica de parámetros:
  • Ajusta automáticamente los parámetros RSI y MA según la volatilidad del mercado
  • Introducción de un método de cálculo de ciclo adaptativo
  1. Optimización del control de riesgos:
  • Desarrollar mecanismos dinámicos de stop loss y take profit
  • Diseñar un sistema dinámico de gestión de almacenes

Resumir

Esta estrategia combina RSI y múltiples promedios móviles para construir un sistema de trading altamente adaptable. La principal ventaja de la estrategia radica en la validación cruzada de múltiples indicadores técnicos y la configuración flexible de parámetros, pero al mismo tiempo, se debe prestar atención al desfase del promedio móvil y al impacto de las condiciones del mercado en el rendimiento de la estrategia. Se espera que mediante la optimización continua y el control de riesgos, esta estrategia logre un desempeño estable en las transacciones reales.

Código Fuente de la Estrategia
/*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 -----