La estrategia de ATR para detener el retraso

El autor:¿ Qué pasa?, Fecha: 2023-10-09 16:59:57
Las etiquetas:

Resumen general

Esta estrategia establece una línea de stop loss dinámica basada en el indicador de rango verdadero promedio (ATR) para rastrear los cambios en el precio de las acciones, con el fin de proteger el stop loss al tiempo que se maximiza la obtención de ganancias.

Estrategia lógica

La estrategia se ejecuta principalmente a través de las siguientes etapas:

  1. Calcular el indicador ATR, el período ATR está establecido por el parámetro nATRPeriod, por defecto en 5;

  2. Calcular la línea de pérdida de parada basada en el valor ATR, la magnitud de la pérdida de parada se establece mediante el parámetro nATRMultip, por defecto a 3,5 veces el ATR;

  3. Cuando el precio sube, si es superior a la línea de stop loss anterior, ajustar la línea de stop loss hasta el precio menos la magnitud de stop loss; cuando el precio cae, si es inferior a la línea de stop loss anterior, ajustar la línea de stop loss hacia abajo hasta el precio más la magnitud de stop loss;

  4. Juzgar si el precio rompe la línea de stop loss, si rompe, enviar señales de compra o venta;

  5. Introduzca posiciones largas o cortas basadas en las señales de ruptura de la línea de stop loss, y cierre posiciones cuando el precio toque la línea de stop loss nuevamente.

Cuando el precio sube, la línea de stop loss se moverá continuamente hacia arriba para bloquear las ganancias. Cuando el precio cae, la línea de stop loss se moverá continuamente hacia abajo para detener las pérdidas. El indicador ATR puede reflejar la fluctuación de precios con mayor precisión. Ajustar dinámicamente la línea de stop loss basada en ATR puede evitar una stop loss demasiado agresiva o demasiado conservadora.

Análisis de ventajas

  • Ajuste dinámico de la línea de stop loss para evitar la expansión de las pérdidas
  • El ajuste de la línea de stop loss es relativamente suave para evitar una stop loss prematura.
  • Utilice el indicador ATR para calcular una magnitud de stop loss más razonable basada en la última volatilidad
  • Línea de pérdida para bloquear las ganancias de manera efectiva

Análisis de riesgos

  • La configuración del parámetro ATR debe ser cuidadosa, el período ATR demasiado corto puede causar una fluctuación excesiva de la línea de stop loss, demasiado largo puede no reflejar el cambio de precio en el tiempo
  • La magnitud del stop loss debe fijarse de acuerdo con la volatilidad específica de las acciones, los valores excesivamente grandes o pequeños afectarán al rendimiento de la estrategia
  • La suspensión de pérdidas traseras puede reducir el margen de ganancia al detener la ganancia antes de otro aumento de precios
  • El ajuste frecuente de la posición puede llevar a mayores costes de negociación

Los parámetros se pueden optimizar ajustando el período de ATR y la magnitud de la pérdida de parada para encontrar el equilibrio óptimo entre la pérdida de parada y la pérdida de seguimiento.

Direcciones de optimización

  • Optimizar el parámetro del período ATR para hacer que los cambios en la línea de stop loss sigan más de cerca la fluctuación del precio
  • Optimizar el parámetro de magnitud de pérdida de parada para una pérdida de parada más razonable
  • Añadir otros indicadores para filtrar el tiempo de entrada
  • Sólo ir largo cuando la tendencia al alza obvia emerge
  • Considerar la posibilidad de añadir un mecanismo de reingreso para participar en acciones con stop loss pero con expectativa de crecimiento continuo

Resumen de las actividades

El indicador ATR hace que el ajuste de la línea de stop loss sea más dirigido. Pero los parámetros y las estrategias de reingreso necesitan una mayor optimización para reducir las paradas innecesarias y ampliar el margen de ganancia. En general, esta es una buena idea de stop loss dinámico que vale la pena investigar y aplicar.


/*backtest
start: 2023-09-08 00:00:00
end: 2023-10-08 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
//@okadoke
////////////////////////////////////////////////////////////
// Based on Average True Range Trailing Stops Strategy by HPotter
// Average True Range Trailing Stops Strategy, by Sylvain Vervoort 
// The related article is copyrighted material from Stocks & Commodities Jun 2009 
////////////////////////////////////////////////////////////
strategy(title="ATR Trailing Stops Strategy", shorttitle="ATRTSS", overlay = true, 
  initial_capital=100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type="percent", commission_value=0.0)
  
nATRPeriod      = input(5, "ATR Period")
nATRMultip      = input(3.5, "ATR Multiplier")
useShorts       = input(false, "Test w/Shorts?")
daysBackMax     = input(defval = 360, title = "Max Days Back to Test", minval = 0)
daysBackMin     = input(defval = 0, title = "Min Days Back to Test", minval = 0)
msBackMax       = 1000 * 60 * 60 * 24 * daysBackMax
msBackMin       = 1000 * 60 * 60 * 24 * daysBackMin

xATR = atr(nATRPeriod)
nLoss = nATRMultip * xATR
xATRTrailingStop = na
xATRTrailingStop := 
 iff(close > nz(xATRTrailingStop[1], 0) and close[1] > nz(xATRTrailingStop[1], 0), max(nz(xATRTrailingStop[1]), close - nLoss),
  iff(close < nz(xATRTrailingStop[1], 0) and close[1] < nz(xATRTrailingStop[1], 0), min(nz(xATRTrailingStop[1]), close + nLoss), 
   iff(close > nz(xATRTrailingStop[1], 0), close - nLoss, close + nLoss))) 
                       
pos = na 
pos := 
 iff(close[1] < nz(xATRTrailingStop[1], 0) and close > nz(xATRTrailingStop[1], 0), 1, 
  iff(close[1] > nz(xATRTrailingStop[1], 0) and close < nz(xATRTrailingStop[1], 0), -1, nz(pos[1], 0)))
        
color = pos == -1 ? red: pos == 1 ? green : blue 
plot(xATRTrailingStop, color=color, title="ATR Trailing Stop")

isWithinTimeBounds = (msBackMax == 0 or (time > (timenow - msBackMax))) and (msBackMin == 0 or (time < (timenow - msBackMin)))

buy     = crossover(close, xATRTrailingStop)
sell    = crossunder(close, xATRTrailingStop)

strategy.entry("LONG", long=true, when=buy and isWithinTimeBounds)
strategy.close("LONG", when=sell and isWithinTimeBounds)
strategy.entry("SHORT", long=false, when=useShorts and sell and isWithinTimeBounds)
strategy.close("SHORT", when=useShorts and buy and isWithinTimeBounds)



Más.