
La idea central de esta estrategia es utilizar el indicador de la amplitud real promedio (ATR) para establecer una línea de trazado de pérdidas que se adapte para que las posiciones rentables reciban la máxima protección y eviten pérdidas prematuras. El indicador ATR puede capturar dinámicamente la volatilidad del mercado, ajustar la distancia de detención de pérdidas según las fluctuaciones del mercado y minimizar la probabilidad de que se desencadene un cierre de pérdidas al tiempo que garantiza el cierre.
Esta estrategia utiliza el promedio de N ciclos del indicador ATR multiplicado por un múltiplo como la distancia de parada básica. Cuanto mayor sea el ATR, la distancia de parada se establece más ampliamente; cuanto menor sea el ATR, la distancia de parada se establece más estrechamente. De esta manera, se puede ajustar la distancia de parada de acuerdo con la volatilidad del mercado.
En concreto, la estrategia utiliza la siguiente lógica central:
Calcula el valor de ATR para el período de ATR ((nATRPeriod)).
Se obtiene la distancia de parada básica nLoss de acuerdo con el valor de ATR multiplicado por el múltiplo ((nATRMultip)).
La línea de parada xATRTrailingStop se actualiza según los máximos y mínimos actuales y la línea de parada del ciclo anterior.
Si el mínimo actual desencadena el límite de pérdidas del ciclo anterior, el límite de pérdidas se desplaza a la distancia nLoss por debajo del mínimo.
Si el punto más alto actual desencadena el límite de pérdidas del ciclo anterior, el límite de pérdidas se desplazará por debajo del límite de pérdidas a la distancia nLoss por encima del punto más alto.
Si no se activa el stop loss, se ajusta el stop loss en función de la distancia entre el precio de cierre y la línea de stop loss.
Se añade la distancia de protección de la línea de sombra opcional para optimizar aún más la línea de parada.
Traza la órbita de la banda de Bryn para visualizar el límite superior y inferior de la línea de parada.
La dirección de la posición se determina por el color de la línea de parada.
La estrategia utiliza el indicador ATR de forma flexible para permitir que la línea de pérdidas se adapte a las fluctuaciones del mercado, lo que garantiza una distancia de pérdidas razonable y evita la pérdida innecesaria de posiciones por un cierre demasiado radical.
La estrategia tiene las siguientes ventajas:
Utiliza el indicador ATR para ajustar dinámicamente la distancia de detención, adaptándose a las diferentes condiciones del mercado.
Los parámetros de multiplicador se pueden personalizar para permitir un ajuste flexible de la distancia de parada.
Se une a la órbita del cinturón de Bryn para formar el límite visual superior e inferior de la línea de pérdida.
La función de protección de la línea de sombra opcional evita el whipsaw de la ciudad de temblores.
Se puede utilizar como un tracker de stop loss para maximizar el retiro de las posiciones ganadoras.
La estrategia es clara y fácil de entender, los parámetros son menos fáciles de optimizar.
Se puede utilizar en varias variedades y ciclos, con una amplia aplicación.
También hay riesgos que deben ser considerados:
El índice ATR está retrasado en reaccionar a los eventos inesperados del mercado, lo que puede causar un alto nivel de pérdidas.
La configuración de multiplicadores demasiado grande también puede causar un largo espacio de parada, lo que aumenta el riesgo de pérdidas.
La función de protección de la línea de sombra hace que la línea de parada se relaje demasiado cuando aumenta la vibración.
Sin considerar las reglas de entrada, no puede ser una estrategia de entradas/salidas.
Los parámetros de optimización se deben probar repetidamente para adaptarse a diferentes variedades y ciclos.
La ruptura de los límites de pérdidas puede causar pérdidas que se extienden y requieren una gestión eficaz de los fondos.
Esta estrategia puede ser optimizada en los siguientes aspectos:
Prueba de diferentes parámetros de ciclo ATR para optimizar la distancia de parada.
Ajuste los parámetros del multiplicador para encontrar el equilibrio entre la distancia de parada y la probabilidad de parada.
Optimización de los parámetros del ciclo de protección de la línea de sombra para evitar la whipsaw.
Intentar agregar las condiciones de entrada en base a la parada de pérdidas para convertirlo en una estrategia de entradas/salidas.
Añade indicadores de tendencia y ajusta la distancia de parada según la tendencia.
En combinación con la teoría de la onda, se ajusta la distancia de deterioro según la posición de la onda.
El control de posiciones se añade para limitar las pérdidas individuales.
La estrategia utiliza la característica de adaptación de los indicadores ATR, diseñó un mecanismo de parada de pérdidas que puede ajustarse dinámicamente. Al mismo tiempo que garantiza la parada de pérdidas, también reduce lo más posible los disparos de parada innecesarios. La idea de la estrategia es simple y clara, y se puede optimizar de manera flexible según sus propias necesidades.
/*backtest
start: 2022-10-12 00:00:00
end: 2023-10-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=2
////////////////////////////////////////////////////////////
// Copyright by HPotter v2.0 13/10/2014
// Average True Range Trailing Stops Strategy, by Sylvain Vervoort
// The related article is copyrighted material from Stocks & Commodities Jun 2009
// Modified by River to add Bands, and change color of Trailing Stop and add Wick Protection. Now turned into a Strategy for Backtesting Purposes.
// After backtesting, it seems clear that it functions well as a Trailing Stop, but not as an Entry/Exit strategy.
////////////////////////////////////////////////////////////
strategy(title="ATR Trailing Stop Bands Strategy[R] ", overlay = true)
nATRPeriod = input(5)
nATRMultip = input(4)
length = input(30, "#Periods of Wick Protection", minval=2)
bType = input(0, "Max [1] or Avg Wick Protection [0]", minval=0, maxval=1)
avgupperwick = sma(close[1] <= open[1] ? high[1] - open[1] : high[1] - close[1], length)
maxupperwick = highest(close[1] <= open[1] ? high[1] - open[1] : high[1] - close[1], length)
avglowerwick = sma(close[1] > open[1] ? open[1] - low[1] : close[1] - low[1], length)
maxlowerwick = highest(close[1] > open[1] ? open[1] - low[1] : close[1] - low[1], length)
upperwick = bType == 0 ? avgupperwick : maxupperwick
lowerwick = bType == 0 ? avglowerwick : maxlowerwick
xATR = atr(nATRPeriod)
nLoss = nATRMultip * xATR
upperband = iff(high < nz(upperband[1], 0) and high[1] < nz(upperband[1], 0), min(nz(upperband[1]), high + nLoss + upperwick), high + nLoss + upperwick)
lowerband = iff(low > nz(lowerband[1], 0) and low[1] > nz(lowerband[1], 0), max(nz(lowerband[1]), low - nLoss - lowerwick), low - nLoss - lowerwick)
xATRTrailingStop = iff(low > nz(xATRTrailingStop[1], 0) and low[1] > nz(xATRTrailingStop[1], 0), max(nz(xATRTrailingStop[1]), low - nLoss - lowerwick),
iff(high < nz(xATRTrailingStop[1], 0) and high[1] < nz(xATRTrailingStop[1], 0), min(nz(xATRTrailingStop[1]), high + nLoss + upperwick),
// iff(low <= nz(xATRTrailingStop[1], 0) and close[1] > nz(xATRTrailingStop[1], 0), high + nLoss + upperwick, iff(high >= nz(xATRTrailingStop[1], 0) and close[1] < nz(xATRTrailingStop[1], 0), low - nLoss - lowerwick,0))))
iff(low <= nz(xATRTrailingStop[1], 0) and close[1] > nz(xATRTrailingStop[1], 0), upperband[1], iff(high >= nz(xATRTrailingStop[1], 0) and close[1] < nz(xATRTrailingStop[1], 0), lowerband[1],0))))
pos = iff(close[1] > nz(xATRTrailingStop[1], 0) and low <= nz(xATRTrailingStop[1], 0), 1,
iff(close[1] < nz(xATRTrailingStop[1], 0) and high >= nz(xATRTrailingStop[1], 0), -1, nz(pos[1], 0)))
color = pos == 1 ? red: pos == -1 ? green : blue
plot(upperband, color=red, title="ATR Upper")
plot(xATRTrailingStop, color=color, title="ATR Trailing Stop", linewidth=2)
plot(lowerband, color=green, title="ATR Lower")
longCondition = (color == green and color[1] == red)
if (longCondition)
strategy.entry("Long", strategy.long)
longExitCondition = (color == red and color[1] == green)
if (longExitCondition)
strategy.close("Long")
shortCondition = (color == red and color[1] == green)
if (shortCondition)
strategy.entry("Short", strategy.short)
shortexitCondition = (color == green and color[1] == red)
if (shortexitCondition)
strategy.close("Short")