Estrategia de reversión de la súper tendencia diaria

El autor:¿ Qué pasa?, Fecha: 2024-02-22 16:22:28
Las etiquetas:

img

Resumen general

La Super Trend Daily Reversal Strategy es una estrategia de trading cuantitativa que utiliza el indicador de Super Trend para determinar las tendencias del mercado, combina el avance de precios y el rango verdadero promedio para calcular la stop loss, y utiliza el indicador de tasa de cambio de precios para filtrar las señales de Super Trend. Esta estrategia es adecuada para los marcos de tiempo diarios y más altos y se puede utilizar en mercados como criptomonedas y acciones.

Estrategia lógica

El indicador de Super Tendencia se basa en el rango verdadero promedio (ATR) y puede determinar más claramente la dirección de las tendencias del mercado.

La estrategia utiliza el indicador de tasa de cambio de precios (ROC) para filtrar el indicador de súper tendencia para evitar señales no válidas.

Para la pérdida de parada, la estrategia proporciona dos métodos de pérdida de parada: porcentaje de pérdida de parada fijo y pérdida de parada adaptativa basada en ATR. La pérdida de parada fija es simple y directa.

Las condiciones de entrada son una reversión del indicador de Super Tendencia y el indicador de tasa de cambio de precio pasa el filtro. Las condiciones de salida son que Super Trend se invierta de nuevo o rompa la línea de stop loss. La estrategia se adhiere al principio de seguimiento de tendencia y solo permite una posición en cada dirección.

Análisis de ventajas

La mayor ventaja de esta estrategia es que el indicador de Super Tendencia tiene mayor claridad y estabilidad para juzgar la dirección de la tendencia en comparación con las medias móviles ordinarias, con menos ruido.

El mecanismo de stop loss adaptativo ATR también permite que la estrategia se adapte a un entorno de mercado más amplio.

Según los resultados de las pruebas, esta estrategia tiene un rendimiento excepcionalmente bueno en un mercado alcista. La tasa de ganancia es muy alta en tendencias a largo plazo de magnitud significativa, con largos ciclos rentables consecutivos.

Análisis de riesgos

El principal riesgo a que se enfrenta esta estrategia es el error de valoración de la inversión de tendencia, que puede pasar por alto las señales de inversión o generar señales de inversión innecesarias.

Además, un stop loss demasiado amplio también puede conducir a mayores pérdidas.

Para hacer frente a estos riesgos, el período de cálculo del ATR puede acortarse adecuadamente o ajustarse el multiplicador de pérdida de parada del ATR. También se pueden añadir indicadores adicionales para determinar las áreas clave de soporte/resistencia para evitar señales engañosas procedentes de dichas zonas.

Direcciones de optimización

La estrategia se puede optimizar en los siguientes aspectos:

  1. Ajustar los parámetros del indicador de Super Tendencia para optimizar el período ATR y los múltiplos de ATR para que la línea de Super Tendencia sea más suave.

  2. Ajustar los parámetros del indicador de tasa de cambio de precios para optimizar el período y el umbral de tasa de cambio para reducir las señales falsas.

  3. Pruebe diferentes mecanismos de stop loss, como las paradas traseras, u optimice la amplitud de stop loss de las paradas fijas.

  4. Añadir indicadores de juicio adicionales para determinar el soporte/resistencia clave y evitar una evaluación errónea de las inversiones de tendencia.

  5. Prueba la configuración de los parámetros y los efectos en diferentes productos para encontrar la combinación óptima de parámetros.

  6. Realizar una optimización de backtest para encontrar los mejores parámetros.

Conclusión

En general, la Super Trend Daily Reversal Strategy es una estrategia de seguimiento de tendencias relativamente estable y confiable. Combina el indicador de Super Trend y el indicador de tasa de cambio de precios para filtrar, lo que puede identificar efectivamente la dirección de las tendencias a mediano y largo plazo. El mecanismo de stop loss adaptativo ATR también le permite adaptarse a la mayoría de los entornos de mercado. A través de una mayor optimización de la configuración de parámetros e indicadores de juicio adicionales, la estabilidad y rentabilidad de esta estrategia se pueden mejorar.


/*backtest
start: 2024-01-22 00:00:00
end: 2024-02-21 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Super Trend Daily BF 🚀", overlay=true, precision=2, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)

/////////////// Time Frame ///////////////
_1 = input(false,  "════════ Test Period ═══════")
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true

///////////// Super Trend /////////////
_2 = input(false,  "══════ Super Trend ══════")
length = input(title="ATR Period", type=input.integer, defval=3)
mult = input(title="ATR Multiplier", type=input.float, step=0.1, defval=1.3)

atr = mult * atr(length)

longStop = hl2 - atr
longStopPrev = nz(longStop[1], longStop)
longStop :=  close[1] > longStopPrev ? max(longStop, longStopPrev) : longStop

shortStop = hl2 + atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := close[1] < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop

dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and close > shortStopPrev ? 1 : dir == 1 and close < longStopPrev ? -1 : dir

///////////// Rate Of Change ///////////// 
_3 = input(false,  "══════ Rate of Change ══════")
source = close
roclength = input(30, "ROC Length",  minval=1)
pcntChange = input(6, "ROC % Change", minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))

///////////////  Strategy  /////////////// 
long = dir == 1 and dir[1] == -1 and isMoving()
short = dir == -1 and dir[1] == 1 and isMoving()

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

/////////////// Dynamic ATR Stop Losses ///////////////
_4 = input(false,  "════════ Stop Loss ═══════")
SL_type = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type")
sl_inp = input(6.0, title='Fixed Stop Loss %') / 100
atrLkb = input(20, minval=1, title='ATR Stop Period')
atrMult = input(1.5, step=0.25, title='ATR Stop Multiplier') 
atr1 = atr(atrLkb)

longStop1 = 0.0
longStop1 :=  short_signal ? na : long_signal ? close - (atr1 * atrMult) : longStop1[1]
shortStop1 = 0.0
shortStop1 := long_signal ? na : short_signal ? close + (atr1 * atrMult) : shortStop1[1]

slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na

/////////////// Execution ///////////////
if testPeriod()
    strategy.entry("L", strategy.long, when=long)
    strategy.entry("S", strategy.short, when=short)
    strategy.exit("L SL", "L", stop = SL_type == "Fixed" ? long_sl : longStop1, when=since_longEntry > 0)
    strategy.exit("S SL", "S", stop = SL_type == "Fixed" ? short_sl : shortStop1, when=since_shortEntry > 0)

/////////////// Plotting /////////////// 
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=30)
bgcolor(isMoving() ? dir == 1 ? color.lime : color.red : color.white , transp=80)

Más.