Esta estrategia es una estrategia de canal de precios adaptativa basada en el indicador de rango verdadero promedio (ATR) y el índice direccional promedio (ADX).
Calcular el máximo máximo (HH) y el mínimo mínimo (LL) en una longitud dada. Calcular también el ATR en la misma longitud.
Calcular +DI y -DI basado en los movimientos al alza y a la baja de los precios.
Si el ADX < 25, el mercado se considera lateral. Si se cierra > el canal superior (HH - multiplicador ATR * ATR), vaya largo. Si se cierra < el canal inferior (LL + multiplicador ATR * ATR), vaya corto.
Si ADX >= 25 y +DI > -DI, el mercado es alcista.
Si ADX >= 25 y +DI < -DI, el mercado es bajista.
Posición de salida después de las barras exit_length desde la entrada.
La estrategia se adapta automáticamente en función de las condiciones del mercado, utilizando la estrategia de canal en el mercado lateral y la tendencia en el mercado de tendencia.
El uso de ATR y ADX asegura la adaptabilidad. ATR ajusta el ancho del canal, ADX determina la tendencia.
La salida forzada añade estabilidad.
ADX puede generar señales falsas con frecuencia.
Los malos parámetros de ATR y ADX conducen a un mal rendimiento.
Incapaz de protegerse eficazmente contra los eventos del cisne negro.
Optimizar los parámetros de ATR y ADX para mejorar la adaptabilidad.
Añadir stop loss para limitar las pérdidas.
Añadir filtros para evitar señales falsas.
La estrategia combina indicadores y mecanismos para adaptarse a las condiciones del mercado, pero pueden ocurrir juicios erróneos debido a las limitaciones de los indicadores, futuras optimizaciones de parámetros y control de riesgos.
/*backtest start: 2023-11-03 00:00:00 end: 2023-12-03 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Adaptive Price Channel Strategy", overlay=true) length = input(20, title="Length") exit_length = input(10, title="Exit After X Periods") atr_multiplier = input(3.2, title="ATR Multiplier") startDate = input(defval = timestamp("2019-01-15T08:15:15+00:00"), title = "Start Date") endDate = input(defval = timestamp("2033-04-01T08:15:00+00:00"), title = "End Date") hh = ta.highest(high, length) ll = ta.lowest(low, length) atr = ta.atr(length) // calculate +DI and -DI upMove = high - high[1] downMove = low[1] - low plusDM = na(upMove[1]) ? na : (upMove > downMove and upMove > 0 ? upMove : 0) minusDM = na(downMove[1]) ? na : (downMove > upMove and downMove > 0 ? downMove : 0) plusDI = ta.rma(plusDM, length) / atr * 100 minusDI = ta.rma(minusDM, length) / atr * 100 // calculate ADX dx = math.abs(plusDI - minusDI) / (plusDI + minusDI) * 100 adx = ta.rma(dx, length) var int barSinceEntry = na if (not na(close[length]) ) if (adx < 25) // Sideways market if (close > hh - atr_multiplier * atr) strategy.entry("PChLE", strategy.long, comment="PChLE") barSinceEntry := 0 else if (close < ll + atr_multiplier * atr) strategy.entry("PChSE", strategy.short, comment="PChSE") barSinceEntry := 0 else if (adx >= 25 and plusDI > minusDI) // Bullish market if (close > hh - atr_multiplier * atr) strategy.entry("PChLE", strategy.long, comment="PChLE") barSinceEntry := 0 else if (adx >= 25 and plusDI < minusDI) // Bearish market if (close < ll + atr_multiplier * atr) strategy.entry("PChSE", strategy.short, comment="PChSE") barSinceEntry := 0 if (na(barSinceEntry)) barSinceEntry := barSinceEntry[1] + 1 else if (barSinceEntry >= exit_length) strategy.close("PChLE") strategy.close("PChSE") barSinceEntry := na plot(hh, title="Highest High", color=color.green, linewidth=2) plot(ll, title="Lowest Low", color=color.red, linewidth=2)