La estrategia se basa en el indicador de la amplitud real media (ATR) para establecer una línea de parada dinámica, rastrear los cambios en el precio de las acciones y bloquear al máximo las ganancias al mismo tiempo que se logra la protección de la parada.
La estrategia se ejecuta principalmente a través de los siguientes pasos:
Para calcular el indicador ATR, el ciclo ATR se establece por el parámetro nATRPeriod, que es el parámetro por defecto 5;
La amplitud de parada se establece por el parámetro nATRMultip, 3.5 veces el ATR por defecto;
Cuando el precio de las acciones sube, el límite de pérdidas se eleva al precio de las acciones menos el límite de pérdidas si está por encima del límite de pérdidas anterior; cuando el precio de las acciones baja, el límite de pérdidas se reduce al precio de las acciones más el límite de pérdidas si está por debajo del límite de pérdidas anterior;
determinar si el precio de las acciones ha roto el límite de pérdidas, y si lo ha hecho, emitir una señal de compra o venta;
En función de la señal de ruptura de la línea de detención, entrar en una posición de venta o de vacío y cerrar la posición al tocar la línea de detención de nuevo.
Cuando el precio de las acciones sube, la línea de detención se ajusta constantemente hacia arriba, lo que bloquea las ganancias; cuando el precio de las acciones baja, la línea de detención se ajusta constantemente hacia abajo, lo que detiene. El indicador ATR puede reflejar con mayor precisión la volatilidad del precio de las acciones, y ajustar la línea de detención de acuerdo con la dinámica de ATR, para evitar que la detención sea demasiado radical o conservadora.
Se puede optimizar los parámetros, ajustar los parámetros del ciclo ATR y la amplitud de parada para encontrar la combinación de parámetros óptima para equilibrar la parada y el seguimiento. También se puede combinar con otros indicadores técnicos para filtrar el tiempo de entrada al mercado y reducir la parada innecesaria.
La estrategia logra el bloqueo de pérdidas y ganancias en el proceso de tenencia mediante el método de ajuste dinámico de la línea de pérdidas de ATR. En comparación con la posición de parada fija, la estrategia se adapta mejor a la fluctuación del precio de las acciones, evitando que la línea de parada sea demasiado radical o conservadora. El indicador ATR hace que el ajuste de la línea de parada sea más específico.
/*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)