La idea central de esta estrategia es utilizar el indicador de Rango Verdadero Promedio (ATR) para establecer una línea de stop loss trasero adaptativa para maximizar la protección de las posiciones rentables mientras se evita la stop loss prematura. El indicador ATR puede capturar dinámicamente la volatilidad del mercado y ajustar la distancia de stop loss basada en la volatilidad del mercado, asegurando una stop loss efectiva mientras se minimiza la probabilidad de que se desencadene una stop loss. Esta estrategia también incorpora bandas de Bollinger para visualizar los límites superior e inferior de la línea de stop loss, con la opción de agregar protección de mecha para contrarrestar el efecto de la sierra de freno en los mercados de rango.
Esta estrategia utiliza el promedio del período N del indicador ATR multiplicado por un factor como la distancia de stop loss base. Cuanto mayor sea el valor ATR, mayor será la volatilidad del mercado, por lo que más amplia se establece la distancia de stop loss. Cuanto menor sea el valor ATR, más estrecha se establece la distancia de stop loss. Esto permite el ajuste dinámico de la distancia de stop loss basada en la volatilidad del mercado.
Específicamente, la estrategia utiliza la siguiente lógica central:
Calcular el valor ATR del período ATR (nATRPeriod).
Obtener la distancia base de stop loss nLoss multiplicando el valor ATR por un factor (nATRMultip).
Actualizar la línea de stop loss xATRTrailingStop en función de la línea de alto, bajo y stop loss actual del período anterior.
Si el mínimo actual desencadena la línea de stop loss del período anterior, la línea de stop loss se mueve hasta debajo de la distancia baja de nLoss.
Si el máximo actual activa la línea de stop loss del período anterior, la línea de stop loss se mueve hacia abajo hasta por encima de la distancia máxima de nLoss.
Si no se activa la línea de stop loss, ajuste la línea de stop loss en función de la distancia del precio cerrado a ella.
Añadir una distancia de protección de mecha opcional para optimizar aún más la línea de pérdida de parada.
Trace Bandas de Bollinger para visualizar el límite superior e inferior de la línea de stop loss.
Determine la dirección de la posición en función del color de la línea de stop loss.
La estrategia utiliza de forma flexible el indicador ATR para permitir que la línea de stop loss se ajuste de forma adaptativa en función de la volatilidad del mercado, garantizando una distancia de stop loss razonable y evitando al mismo tiempo un stop loss excesivo que cause pérdidas innecesarias de posiciones.
Las ventajas de esta estrategia:
Utilice el indicador ATR para ajustar la distancia de stop loss adaptándose dinámicamente a las diferentes condiciones del mercado.
El multiplicador personalizable permite un ajuste flexible de la distancia de stop loss.
La adición de bandas de Bollinger proporciona la visualización de los límites superior e inferior de la línea de stop loss.
La protección de mecha opcional evita la sierra en diversos mercados.
Se puede utilizar como stop loss para maximizar el descenso de las posiciones rentables.
La lógica de la estrategia es clara y fácil de entender con pocos parámetros optimizables.
Aplicable a varios productos y plazos.
Algunos riesgos de esta estrategia a tener en cuenta:
El indicador ATR reacciona lentamente a las conmociones del mercado, lo que conduce a una gran distancia de stop loss.
El ajuste excesivo del multiplicador también aumenta la distancia de parada de pérdida, aumentando el riesgo de pérdida.
La protección de la mecha puede hacer que la línea de stop loss sea demasiado floja cuando aumenta la sierra.
Las reglas de entrada no consideradas no pueden utilizarse como estrategia de entradas/salidas.
Pruebas extensas y optimización de los parámetros necesarios para diferentes productos y plazos.
La ruptura de pérdidas de parada puede aumentar las pérdidas, lo que requiere una gestión eficaz del capital.
La estrategia se puede optimizar en los siguientes aspectos:
Prueba diferentes períodos de ATR para optimizar la distancia de pérdida de parada.
Ajuste el multiplicador para equilibrar la distancia de stop loss y la probabilidad.
Optimizar el período de protección de la mecha para evitar la sierra.
Trate de añadir condiciones de entrada en la parte superior de la pérdida de parada para que sea la estrategia de entradas / salidas.
Añadir un indicador de tendencia para ajustar la distancia de stop loss en función de la tendencia.
Ajuste el stop loss basado en la teoría de las ondas de Elliott.
En el caso de las entidades de titulización, el importe de las pérdidas individuales se determinará en función de la situación de la entidad de titulización.
Esta estrategia utiliza la característica adaptativa del indicador ATR para diseñar un mecanismo de stop loss dinámico. Al tiempo que garantiza el stop loss, también minimiza los desencadenantes de stop loss innecesarios. La lógica de la estrategia es simple y clara, lo que permite una optimización flexible basada en las necesidades. Funciona mejor como stop loss de seguimiento para maximizar la protección de las ganancias. Con la optimización adecuada de parámetros y el control de riesgos, esta estrategia puede ser una herramienta efectiva de stop loss en el comercio cuantitativo.
/*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")