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.
La estrategia se ejecuta principalmente a través de las siguientes etapas:
Calcular el indicador ATR, el período ATR está establecido por el parámetro nATRPeriod, por defecto en 5;
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;
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;
Juzgar si el precio rompe la línea de stop loss, si rompe, enviar señales de compra o venta;
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.
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.
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)