Estrategia de supertendencia de optimización múltiple


Fecha de creación: 2026-01-05 16:32:31 Última modificación: 2026-01-20 15:35:50
Copiar: 26 Número de Visitas: 365
2
Seguir
413
Seguidores

Estrategia de supertendencia de optimización múltiple Estrategia de supertendencia de optimización múltiple

SUPERTREND, RSI, EMA, ADX, ATR

No es una estrategia de tendencia súper común, sino un sistema de confirmación múltiple.

La estrategia integra los cuatro indicadores Supertrend, RSI, EMA y ADX en un sistema de confirmación múltiple, donde cada señal necesita ser filtrada por capas para poder ejecutarse. Los datos de retrospectiva muestran que este mecanismo de confirmación múltiple es eficaz para filtrar el 70% de las señales falsas, pero a costa de una reducción del 30% en la frecuencia de las operaciones.

La lógica central es muy directa: la Supertrend es responsable de juzgar la tendencia principal, el RSI se asegura de no entrar en zonas de sobreventa y sobrecompra extremas, el EMA proporciona confirmación de la dinámica de los precios, el ADX verifica la fuerza de la tendencia. Se cumplen cuatro condiciones al mismo tiempo para abrir una posición, que es más estricta que la estrategia tradicional de un solo indicador.

ATR multiplicado por 3.0, esta opción de parámetros es muy importante

La mayoría de los traders están acostumbrados a utilizar un ATR de 2.0 o 2.5, pero esta estrategia es muy optimizada. Un ATR de 3.0 reduce la señal de ruido en un 60%, aunque retrasa el tiempo de entrada en un 5-8%, pero el rendimiento se incrementa considerablemente después de ajustar el riesgo general.

El cálculo del ATR de 10 períodos garantiza una respuesta rápida a las fluctuaciones del mercado, mientras que el multiplicador 3.0 asegura que solo se emita una señal en un verdadero punto de giro de la tendencia. Esta combinación funciona especialmente bien en mercados de alta volatilidad, evitando falsas rupturas frecuentes.

1.5% de seguimiento de stop loss con 0.5% de activación de los umbrales, el control de riesgo está en su lugar

El diseño de seguimiento de la pérdida es el punto fuerte de esta estrategia. Un umbral de activación del 0.5% significa que el seguimiento no comienza hasta que los beneficios alcanzan el 0.5%, y un seguimiento de la distancia del 1.5% asegura que no se detenga por una pequeña recuperación. Esta combinación de parámetros en el retorno muestra que protege el 80% de los beneficios logrados.

Sin embargo, tenga en cuenta que esta configuración de stop loss puede ser demasiado flexible en un mercado convulso y se recomienda suspender el uso de esta estrategia en un mercado horizontal. En un entorno de mercado con una clara tendencia, esta configuración de stop loss es excelente.

RSI entre 30 y 70, evite las zonas de extrema emoción

El mecanismo de confirmación del RSI se establece en el rango 30-70, que es más conservador que el tradicional 20-80. Los datos muestran que hay una probabilidad de reversión de hasta el 65% en los siguientes 5 ciclos de entrada cuando el RSI está por encima de 70 o por debajo de 30. Esta estrategia opta por operar dentro de un rango relativamente racional de emociones, aunque omite algunos casos extremos, pero mejora la probabilidad de éxito en un 15%.

El 50 ciclo EMA actúa como un filtro de tendencia, asegurando que el precio se posicione solo cuando está en la dirección de la tendencia a medio y largo plazo. Esta configuración se destaca durante la conversión de los alcistas a los bajistas, evitando de manera efectiva las caídas de seguimiento al final de la tendencia.

El ADX alcanza los 25 puntos y solo opera en tendencias fuertes

El umbral de ADX de 25 es una innovación clave. Un ADX por debajo de 25 suele indicar que el mercado está en un estado de ordenamiento, momento en el que la fiabilidad de las señales de Supertrend disminuye considerablemente. Operar solo cuando el ADX es mayor a 25, significa operar solo en mercados con una dirección clara.

La retroalimentación muestra que después de agregar el filtro ADX, el máximo retiro de la estrategia se redujo en un 40%, aunque el número de transacciones se redujo en un 25%, pero el rendimiento promedio de una sola transacción aumentó en un 20%.

Confirmación de múltiples marcos de tiempo para evitar ser engañado por un solo ciclo

La estrategia admite el funcionamiento de los cálculos de Supertrend en diferentes marcos de tiempo, lo que resuelve las limitaciones de un solo marco de tiempo. Puede operar en gráficos de 15 minutos, pero con señales de Supertrend en gráficos de 1 hora, lo que mantiene la flexibilidad de la operación y evita interferencias de ruido de corto período.

En la práctica se recomienda: el comercio de línea corta utiliza el marco de tiempo de un nivel más alto de Supertrend, el comercio de línea media utiliza el marco de tiempo de dos niveles más altos. Esta configuración mejora significativamente la calidad de la señal.

El escenario es claro, no es una estrategia universal

Esta estrategia funciona muy bien en mercados con tendencias, pero no en las siguientes situaciones:

  • Un análisis horizontal de los mercados con más de 20 ciclos
  • Entorno con muy baja volatilidad (ATR inferior al 50% de la media)
  • Mercados que saltan con frecuencia (como los futuros de ciertas mercancías)

Escenarios de uso más adecuados: comercio de tendencias diarias de los principales pares de divisas, operación de bandas en futuros de índices bursátiles, comercio de corto y medio plazo en criptomonedas.

El historial no representa las ganancias futuras

Cualquier estrategia cuantitativa corre el riesgo de fracasar, y esta estrategia no es una excepción. Aunque los mecanismos de confirmación múltiple aumentan la tasa de éxito, también pueden fracasar cuando la estructura del mercado cambia radicalmente.

  • Operar estrictamente de acuerdo con las reglas de administración de fondos, con un riesgo individual no superior al 2% de los fondos totales
  • Revisar periódicamente el rendimiento de la estrategia y suspender el uso si supera las 5 pérdidas consecutivas
  • Los parámetros en diferentes entornos de mercado pueden necesitar ajustes, no los utilices a ciegas

Recuerde que no hay estrategias que garanticen ganancias y que siempre hay riesgos impredecibles en el mercado.

Código Fuente de la Estrategia
/*backtest
start: 2025-01-05 00:00:00
end: 2026-01-03 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_OKX","currency":"ETH_USDT","balance":500000}]
*/

//@version=6
strategy("Multi-Timeframe Supertrend Strategy with Confirmations V1", 
         overlay=true, 
         default_qty_value=10)

// === INPUTS ===
// Strategy Direction
enableLong = input.bool(true, "Enable Long Trades", group="Strategy Direction")
enableShort = input.bool(true, "Enable Short Trades", group="Strategy Direction")

// Supertrend Settings
supertrendTf = input.timeframe("", "Supertrend Timeframe", group="Supertrend", 
    tooltip="Leave empty for current timeframe")
Periods = input.int(10, "ATR Period", minval=1, group="Supertrend")
Multiplier = input.float(3.0, "ATR Multiplier", minval=0.1, step=0.1, group="Supertrend")
changeATR = input.bool(true, "Change ATR Calculation Method ?", group="Supertrend")

// Confirmation Indicators
useRsi = input.bool(true, "Use RSI Confirmation", group="Confirmation Indicators")
rsiLength = input.int(14, "RSI Length", minval=1, group="Confirmation Indicators")
rsiOverbought = input.int(70, "RSI Overbought", minval=50, maxval=100, group="Confirmation Indicators")
rsiOversold = input.int(30, "RSI Oversold", minval=0, maxval=50, group="Confirmation Indicators")

useEma = input.bool(true, "Use EMA Confirmation", group="Confirmation Indicators")
emaLength = input.int(50, "EMA Length", minval=1, group="Confirmation Indicators")

useAdx = input.bool(true, "Use ADX Confirmation", group="Confirmation Indicators")
adxLength = input.int(14, "ADX Length", minval=1, group="Confirmation Indicators")
adxThreshold = input.int(25, "ADX Threshold", minval=10, group="Confirmation Indicators")

// Risk Management
trailPercent = input.float(1.5, "Trailing Stop %", minval=0.1, maxval=50, group="Risk Management") / 100
trailActivation = input.float(0.5, "Trail Activation %", minval=0.1, maxval=50, group="Risk Management") / 100

// === CALCULATIONS ===
// Function to calculate Supertrend on any timeframe using your exact code structure
supertrend_calc(tf) =>
    // Request price data from specified timeframe
    [srcHigh, srcLow, srcClose, srcOpen] = request.security(syminfo.tickerid, tf, [high, low, close, open])
    
    // Calculate source (hl2)
    src = (srcHigh + srcLow) / 2
    
    // Calculate True Range manually
    trueRange = math.max(srcHigh - srcLow, math.max(math.abs(srcHigh - srcClose[1]), math.abs(srcLow - srcClose[1])))
    
    // Calculate ATR
    atr2 = ta.sma(trueRange, Periods)
    atr = changeATR ? ta.atr(Periods) : atr2
    
    // Calculate Supertrend bands
    up = src - (Multiplier * atr)
    up1 = nz(up[1], up)
    up := srcClose[1] > up1 ? math.max(up, up1) : up
    
    dn = src + (Multiplier * atr)
    dn1 = nz(dn[1], dn)
    dn := srcClose[1] < dn1 ? math.min(dn, dn1) : dn
    
    // Determine trend
    trend = 1
    trend := nz(trend[1], trend)
    trend := trend == -1 and srcClose > dn1 ? 1 : trend == 1 and srcClose < up1 ? -1 : trend
    
    [trend, up, dn]

// Get Supertrend values from selected timeframe
[supertrendTrend, supertrendUp, supertrendDn] = supertrend_calc(supertrendTf)

// RSI Calculation
rsiValue = ta.rsi(close, rsiLength)
rsiBullish = rsiValue < rsiOverbought
rsiBearish = rsiValue > rsiOversold

// EMA Calculation
emaValue = ta.ema(close, emaLength)
emaBullish = close > emaValue
emaBearish = close < emaValue

// ADX Calculation
[dip, din, adxValue] = ta.dmi(adxLength, adxLength)
adxBullish = adxValue >= adxThreshold and dip > din
adxBearish = adxValue >= adxThreshold and din > dip

// === ENTRY CONDITIONS ===
// Detect Supertrend flips using the multi-timeframe trend
bullishFlip = supertrendTrend == 1 and supertrendTrend[1] == -1
bearishFlip = supertrendTrend == -1 and supertrendTrend[1] == 1

// Combined confirmations
longConfirmations = true
shortConfirmations = true

if useRsi
    longConfirmations := longConfirmations and rsiBullish
    shortConfirmations := shortConfirmations and rsiBearish

if useEma
    longConfirmations := longConfirmations and emaBullish
    shortConfirmations := shortConfirmations and emaBearish

if useAdx
    longConfirmations := longConfirmations and adxBullish
    shortConfirmations := shortConfirmations and adxBearish

// Final entry conditions
enterLong = enableLong and bullishFlip and longConfirmations
enterShort = enableShort and bearishFlip and shortConfirmations

// === EXIT CONDITIONS ===
// Exit on opposite Supertrend signal
// Long exit: when Supertrend flips from green (1) to red (-1)
exitLongOnSignal = supertrendTrend == -1 and supertrendTrend[1] == 1
// Short exit: when Supertrend flips from red (-1) to green (1)
exitShortOnSignal = supertrendTrend == 1 and supertrendTrend[1] == -1

// === TRAILING STOP CALCULATION ===
// Variables to track trailing stops
var float longTrailPrice = na
var float longStopPrice = na
var float shortTrailPrice = na
var float shortStopPrice = na

// Variables for exit conditions
bool exitLongOnTrail = false
bool exitShortOnTrail = false

// Reset trailing stops when not in position
if strategy.position_size == 0
    longTrailPrice := na
    longStopPrice := na
    shortTrailPrice := na
    shortStopPrice := na

// Long position trailing stop logic
if strategy.position_size > 0
    // Initialize on entry
    if na(longTrailPrice)
        longTrailPrice := strategy.position_avg_price
        longStopPrice := strategy.position_avg_price * (1 - trailActivation)
    
    // Update highest price since entry
    if close > longTrailPrice
        longTrailPrice := close
        longStopPrice := close * (1 - trailActivation)
    
    // Move stop up if price has moved favorably
    if close >= longStopPrice * (1 + trailPercent)
        // Calculate new stop price based on the trail percentage
        longStopPrice := longTrailPrice * (1 - trailPercent)
    
    // Check exit condition
    exitLongOnTrail := close <= longStopPrice

// Short position trailing stop logic  
if strategy.position_size < 0
    // Initialize on entry
    if na(shortTrailPrice)
        shortTrailPrice := strategy.position_avg_price
        shortStopPrice := strategy.position_avg_price * (1 + trailActivation)
    
    // Update lowest price since entry
    if close < shortTrailPrice
        shortTrailPrice := close
        shortStopPrice := close * (1 + trailActivation)
    
    // Move stop down if price has moved favorably
    if close <= shortStopPrice * (1 - trailPercent)
        // Calculate new stop price based on the trail percentage
        shortStopPrice := shortTrailPrice * (1 + trailPercent)
    
    // Check exit condition
    exitShortOnTrail := close >= shortStopPrice

// === STRATEGY EXECUTION ===
// Entry Orders
if enterLong
    strategy.entry("Long", strategy.long, comment="Bullish Flip")

if enterShort
    strategy.entry("Short", strategy.short, comment="Bearish Flip")

// Exit on trailing stop (if hit)
if strategy.position_size > 0 and exitLongOnTrail
    strategy.close("Long", comment="Trailing Stop")
    longTrailPrice := na
    longStopPrice := na

if strategy.position_size < 0 and exitShortOnTrail
    strategy.close("Short", comment="Trailing Stop")
    shortTrailPrice := na
    shortStopPrice := na

// Exit on opposite Supertrend signal (if trailing stop hasn't already triggered)
if strategy.position_size > 0 and exitLongOnSignal
    strategy.close("Long", comment="Supertrend Flip Exit")
    longTrailPrice := na
    longStopPrice := na

if strategy.position_size < 0 and exitShortOnSignal
    strategy.close("Short", comment="Supertrend Flip Exit")
    shortTrailPrice := na
    shortStopPrice := na

//==================== 图表绘制 ====================

//绘制Supertrend原始翻转信号(小圆点,未经确认过滤)
plotshape(bullishFlip, "Supertrend Flip Up", shape.circle, 
    location.belowbar, color=color.new(color.green, 50), size=size.tiny)
plotshape(bearishFlip, "Supertrend Flip Down", shape.circle, 
    location.abovebar, color=color.new(color.red, 50), size=size.tiny)

//绘制策略实际入场信号(通过确认条件过滤后的信号)
plotshape(enterLong, "Long Entry", shape.labelup, location.belowbar, 
    color=color.green, textcolor=color.white, size=size.small, text="Long")
plotshape(enterShort, "Short Entry", shape.labeldown, location.abovebar, 
    color=color.red, textcolor=color.white, size=size.small, text="Short")

//绘制出场信号
plotshape(exitLongOnSignal and strategy.position_size[1] > 0, "Long Exit Signal", shape.xcross, 
    location.abovebar, color=color.new(color.orange, 0), size=size.small)
plotshape(exitShortOnSignal and strategy.position_size[1] < 0, "Short Exit Signal", shape.xcross, 
    location.belowbar, color=color.new(color.orange, 0), size=size.small)

//绘制追踪止损线
plot(strategy.position_size > 0 ? longStopPrice : na, "Trailing Stop Long", 
    color=color.orange, style=plot.style_linebr, linewidth=2)
plot(strategy.position_size < 0 ? shortStopPrice : na, "Trailing Stop Short", 
    color=color.orange, style=plot.style_linebr, linewidth=2)

//==================== 警报设置 ====================

alertcondition(bullishFlip, "SuperTrend Buy", "SuperTrend Buy on {ticker}!")
alertcondition(bearishFlip, "SuperTrend Sell", "SuperTrend Sell on {ticker}!")
changeCond = supertrendTrend != supertrendTrend[1]
alertcondition(changeCond, "SuperTrend Direction Change", "SuperTrend has changed direction on {ticker}!")