Estrategia de swing trading con cruce de RSI y MA con sistema de trailing stop

RSI MA CROSSOVER TRAILING SL Swing Trading risk management
Fecha de creación: 2025-04-24 16:51:14 Última modificación: 2025-04-24 16:51:14
Copiar: 4 Número de Visitas: 349
2
Seguir
319
Seguidores

Estrategia de swing trading con cruce de RSI y MA con sistema de trailing stop Estrategia de swing trading con cruce de RSI y MA con sistema de trailing stop

Descripción general

La estrategia es una estrategia de trading oscilante basada en el RSI (índice relativamente fuerte) cruzado con su promedio móvil (MA), diseñada para gráficos de 4 horas. La estrategia genera señales de trading a través de la horquilla de oro y la horquilla muerta del RSI con la MA, y combina una variedad de herramientas de gestión de riesgos, que incluyen fijación de stop/stop, seguimiento de stop loss y mecanismo de reversión de salida. La estrategia también establece un límite de pérdidas continuas y suspende el comercio hasta la próxima fecha de reajuste cuando las pérdidas continuas superen dos veces.

Principio de estrategia

  1. Limitación del marco temporalLa estrategia sólo funciona en gráficos de 4 horas, asegurando que las señales de negociación coincidan con el ciclo de tiempo diseñado.
  2. Cálculo del indicador: utiliza el RSI (la longitud predeterminada 14) y su promedio móvil (la SMA o EMA, la longitud predeterminada 14) para generar señales
    • La horca de oro (MA sobre el RSI) desencadena una señal de compra (hacer más) [2].
    • La horca muerta (MA bajo el RSI) desencadena la señal de venta (MA bajo el RSI)
  3. Administración de posiciones: El tamaño de la posición se calcula en función de la distribución de capital y el precio actual de cada transacción.
  4. Mecanismo de salida
    • Detención de pérdidas fijasLa diferencia entre los valores de los pares de pérdidas y los de las paradas se basa en el porcentaje de paradas (el 1.5% por defecto) y paradas (el 2.5% por defecto).
    • Seguimiento de pérdidas: Cuando el precio retrocede desde el punto más alto, se activa la salida.
    • El retorno y la salidaLa posición se estabiliza cuando aparece la señal de retorno.
  5. Control de riesgos
    • Suspenda la operación después de dos pérdidas consecutivas y vuelve a establecer el recuento de pérdidas cada día a las 9:15.

Análisis de las ventajas

  1. Verificación de señales multidimensionalesEn la actualidad, el índice de inflación es el índice más alto en el mundo, con un promedio de más de 200 puntos por segundo.
  2. Gestión de riesgos dinámicosEl objetivo de la estrategia es que los inversores de los países desarrollados puedan tener una mayor confianza en sus clientes.
  3. Estricto manejo de fondosEl objetivo de la estrategia es: evitar el exceso de apalancamiento basado en posiciones de capital.
  4. El control disciplinarioEl sistema de suspensión de pérdidas continuas previene el comercio emocional.
  5. Marcas de visualizaciónLa etiqueta gráfica clara ayuda a identificar rápidamente las señales y los puntos de salida.

Análisis de riesgos

  1. Sensibilidad de los parámetrosLa longitud de los RSI y MA tiene un gran impacto en la calidad de la señal y debe optimizarse para adaptarse a las fluctuaciones del mercado.
  2. Desempeño del mercado de tendenciasEn una tendencia fuerte, el RSI puede sobrecomprar/sobrevender durante un largo período, lo que hace que la señal se atrase.
  3. Limitación del marco temporal: sólo se aplica a los gráficos de 4 horas, otros períodos re-verificar.
  4. Riesgo de pérdidas continuasEl informe también señala que el sector de la construcción de viviendas y el sector de la construcción de viviendas está en una situación de crisis económica.
    Soluciones
  • Parámetros de optimización a través de la retroalimentación histórica.
  • La combinación de indicadores de tendencia (como el ADX) filtra las señales.
  • Configuración de la pérdida dinámica del contador de pérdidas.

Dirección de optimización

  1. Fusión de varios indicadores: Introducción de la confirmación de la señal de aumento de la banda MACD o Brin.
  2. Ajuste de parámetros dinámicosLa longitud del RSI y el Stop Loss Ratio se ajustan a la volatilidad del mercado.
  3. Ampliación del marco de tiempo: Estrategia de prueba en el rendimiento de un ciclo más alto o más bajo (por ejemplo, la luz solar / 1 hora).
  4. Mejoras en el aprendizaje automático: Optimización de las condiciones de entrada y salida utilizando un modelo de entrenamiento de datos históricos.
  5. Mejoras en la gestión de fondos: Ajuste de la proporción de capital por transacción en función de la dinámica del valor neto de la cuenta.

Resumir

La estrategia permite el comercio de oscilación a través de la señal cruzada de RSI y MA, combinada con herramientas de gestión de riesgos en varios niveles, que equilibran el potencial de ganancias y el control de riesgos. Su ventaja radica en una lógica clara y una estricta disciplina, pero necesita ser optimizada aún más para adaptarse a diferentes entornos de mercado.

Código Fuente de la Estrategia
/*backtest
start: 2024-04-23 00:00:00
end: 2024-09-06 00:00:00
period: 4h
basePeriod: 4h
exchanges: [{"eid":"Futures_Binance","currency":"DOGE_USDT"}]
*/

//@version=5
strategy("📈 RX Swing ", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=1)


// === INPUTS ===
rsiLength     = input.int(14, title="RSI Length")
maLength      = input.int(14, title="RSI MA Length")
maType        = input.string("SMA", options=["SMA", "EMA"], title="MA Type for RSI")
sl_pct        = input.float(1.5, title="Stop Loss %", minval=0.0)
tp_pct        = input.float(2.5, title="Take Profit %", minval=0.0)
capitalPerTrade = input.float(15000, title="Capital Per Trade (INR)", minval=1)
lotSize       = input.int(50, title="Lot Size (Nifty Options Lot)", minval=1)
trail_points  = input.float(10, title="Trailing SL Points", minval=0.1)

// === CALCULATIONS ===
rsi    = ta.rsi(close, rsiLength)
rsiMA  = maType == "SMA" ? ta.sma(rsi, maLength) : ta.ema(rsi, maLength)

longSignal  = ta.crossover(rsi, rsiMA)
shortSignal = ta.crossunder(rsi, rsiMA)

// === TRADING WINDOW ===
canTrade = true
exitTime = false

// === STATE VARIABLES ===
var float entryPrice = na
var bool inTrade = false
var string tradeDir = ""
var int lossCount = 0
var float trailHigh = na
var float trailLow = na

// === EXIT TRIGGER ===
exitNow = false
exitReason = ""

// === POSITION SIZE BASED ON CAPITAL ===
positionSize = (capitalPerTrade / close) * lotSize

// === ENTRY LOGIC (AFTER CLOSE OF CANDLE) ===
if (canTrade and lossCount < 2)
    if (longSignal and not inTrade and barstate.isconfirmed)  // Ensure the signal happens after candle close
        strategy.entry("Buy Call", strategy.long, qty=positionSize)
        entryPrice := close
        trailHigh := close
        inTrade := true
        tradeDir := "CALL"

    else if (shortSignal and not inTrade and barstate.isconfirmed)  // Ensure the signal happens after candle close
        strategy.entry("Buy Put", strategy.short, qty=positionSize)
        entryPrice := close
        trailLow := close
        inTrade := true
        tradeDir := "PUT"

// === TRAILING STOP-LOSS LOGIC ===
if (inTrade)
    if (tradeDir == "CALL")
        trailHigh := math.max(trailHigh, close)
        if (close <= trailHigh - trail_points)
            strategy.close("Buy Call", comment="CALL Trailing SL Hit")
            exitNow := true
            exitReason := "Trail SL"
            inTrade := false
            lossCount := lossCount + 1

    if (tradeDir == "PUT")
        trailLow := math.min(trailLow, close)
        if (close >= trailLow + trail_points)
            strategy.close("Buy Put", comment="PUT Trailing SL Hit")
            exitNow := true
            exitReason := "Trail SL"
            inTrade := false
            lossCount := lossCount + 1

// === REVERSAL EXIT LOGIC ===
if (inTrade)
    if (tradeDir == "CALL" and shortSignal)
        strategy.close("Buy Call", comment="CALL Exit on Reversal")
        exitNow := true
        exitReason := "Reversal"
        inTrade := false
        if (strategy.position_size < 0)
            lossCount := lossCount + 1

    if (tradeDir == "PUT" and longSignal)
        strategy.close("Buy Put", comment="PUT Exit on Reversal")
        exitNow := true
        exitReason := "Reversal"
        inTrade := false
        if (strategy.position_size > 0)
            lossCount := lossCount + 1

// === TP/SL EXIT LOGIC ===
if (inTrade)
    tpLevel = entryPrice * (1 + tp_pct / 100)
    slLevel = entryPrice * (1 - sl_pct / 100)

    if (strategy.position_size > 0)
        if (close >= tpLevel)
            strategy.close("Buy Call", comment="CALL TP Hit")
            exitNow := true
            exitReason := "TP"
            inTrade := false
        else if (close <= slLevel)
            strategy.close("Buy Call", comment="CALL SL Hit")
            exitNow := true
            exitReason := "SL"
            inTrade := false
            lossCount := lossCount + 1

    if (strategy.position_size < 0)
        tpLevel = entryPrice * (1 - tp_pct / 100)
        slLevel = entryPrice * (1 + sl_pct / 100)

        if (close <= tpLevel)
            strategy.close("Buy Put", comment="PUT TP Hit")
            exitNow := true
            exitReason := "TP"
            inTrade := false
        else if (close >= slLevel)
            strategy.close("Buy Put", comment="PUT SL Hit")
            exitNow := true
            exitReason := "SL"
            inTrade := false
            lossCount := lossCount + 1

// === RESET LOSS COUNT ON NEW DAY ===
if (hour == 9 and minute == 15)
    lossCount := 0

// === MARKUPS ===
plotshape(longSignal and canTrade and lossCount < 2 and barstate.isconfirmed, title="📗 CALL Entry", location=location.belowbar, style=shape.triangleup, color=color.green, size=size.small, text="CALL")
plotshape(shortSignal and canTrade and lossCount < 2 and barstate.isconfirmed, title="📕 PUT Entry", location=location.abovebar, style=shape.triangledown, color=color.red, size=size.small, text="PUT")
plotshape(exitNow and exitReason == "TP", location=location.belowbar, style=shape.xcross, color=color.green, size=size.tiny, title="✅ TP Exit", text="TP")
plotshape(exitNow and exitReason == "SL", location=location.abovebar, style=shape.xcross, color=color.red, size=size.tiny, title="❌ SL Exit", text="SL")
plotshape(exitNow and exitReason == "Reversal", location=location.abovebar, style=shape.circle, color=color.fuchsia, size=size.tiny, title="🔁 Reversal Exit", text="REV")
plotshape(exitNow and exitReason == "Trail SL", location=location.abovebar, style=shape.square, color=color.yellow, size=size.tiny, title="🔂 Trailing SL Exit", text="Trail")