Esta estrategia rastrea los cambios dinámicos del indicador ADX para capturar los cambios tempranos en las tendencias del mercado para seguir la tendencia oportuna. Cuando el ADX sube rápidamente desde niveles bajos, indica que se está formando una tendencia que presenta una gran oportunidad de entrar. Con la ayuda de promedios móviles, puede filtrar señales falsas de manera efectiva.
El núcleo de esta estrategia radica en juzgar el desarrollo de la tendencia basado en los cambios dinámicos del indicador ADX. Un ADX bajo significa pequeñas fluctuaciones en las tendencias. Cuando el ADX sube rápidamente desde niveles bajos, indica que se está formando una tendencia. La estrategia captura la aparición de la tendencia mediante el monitoreo del fuerte aumento del ADX.
Específicamente, la señal de entrada consiste en los siguientes factores:
Cuando se cumplen todas las condiciones anteriores, indica que se está formando una tendencia alcista para ir largo. Cuando el precio cae por debajo de los promedios móviles, se cierran posiciones. Se utilizan dos promedios móviles para juzgar las tendencias con mayor precisión.
La lógica de stop loss es similar: ir corto cuando el ADX cae rápidamente, y cerrar posiciones cuando el precio sube por encima de los promedios móviles.
La mayor ventaja aquí es la captura oportuna de las tendencias emergentes. La forma convencional de ver los valores absolutos de ADX a menudo requiere una confirmación por encima de 20 o 25 para llamar a una tendencia, perdiendo así el momento óptimo de entrada.
Además, las medias móviles ayudan a filtrar las señales falsas de manera efectiva, mejorando la estabilidad de la estrategia.
El mayor riesgo proviene de la naturaleza rezagada del propio ADX. A pesar de atrapar el rápido aumento para reducir el rezagado, todavía hay algún retraso. Esto causa perderse algunos mercados que se invierten rápidamente.
Además, ADX no juzga perfectamente las tendencias y inevitablemente las diagnostica erróneamente de vez en cuando.
Todavía hay un gran espacio para optimizar esta estrategia, principalmente para mejorar la precisión de ADX en la captura de tendencias. Se pueden explorar métodos como el aprendizaje automático, modelos de entrenamiento para pronosticar la distribución de probabilidades basados en los cambios de ADX. También se pueden probar otros aspectos como el ajuste de parámetros, indicadores adicionales, etc.
Esta estrategia de seguimiento de tendencias ADX dinámica captura rápidamente los cambios de tendencia al identificar fuertes subidas de ADX, siguiendo así las tendencias de manera oportuna.
/*backtest start: 2023-12-03 00:00:00 end: 2023-12-10 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © dhilipthegreat //@version=4 //Rising ADX strategy strategy(title="Rising ADX strategy", overlay=false) adxlen = input(14, title="ADX Length", minval=1) threshold = input(10, title="threshold", minval=5) hline(threshold, color=color.black, linestyle=hline.style_dashed) atype = input(2,minval=1,maxval=7,title="1=SMA, 2=EMA, 3=WMA, 4=HullMA") malen=input(20, title="Moving average 1 ",minval=1, maxval=50) avg = atype == 1 ? sma(close,malen) : atype == 2 ? ema(close,malen) : atype == 3 ? wma(close,malen) : atype == 4 ? hma(close,malen) : na atype2 = input(2,minval=1,maxval=7,title="1=SMA, 2=EMA, 3=WMA, 4=HullMA") malen2=input(20, title="Moving average 2",minval=1, maxval=200) avg2 = atype2 == 1 ? sma(close,malen2) : atype2 == 2 ? ema(close,malen2) : atype2 == 3 ? wma(close,malen2) : atype2 == 4 ? hma(close,malen2) : na //ADX&DI dilen = 14 dirmov(len,_high,_low,_tr) => up = change(_high) down = -change(_low) plusDM = na(up) ? na : (up > down and up > 0 ? up : 0) minusDM = na(down) ? na : (down > up and down > 0 ? down : 0) truerange = rma(_tr, len) plus = fixnan(100 * rma(plusDM, len) / truerange) minus = fixnan(100 * rma(minusDM, len) / truerange) [plus, minus] adx(dilen, adxlen,_high,_low,_tr) => [plus, minus] = dirmov(dilen,_high,_low,_tr) sum = plus + minus adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen) [plus, minus] = dirmov(dilen,high,low,tr) sig = adx(dilen, adxlen,high,low,tr) prev_sig = adx(dilen, adxlen,high[1],low[1],tr) plot(sig ? sig : na, color = rising(sig, 1) ? color.lime : falling(sig, 1) ? color.orange : color.purple, title="ADX",linewidth=2) ////// longCondition= sig > threshold and rising(sig, 1) and falling(prev_sig, 1) and close > avg and close > avg2 barcolor(longCondition ? color.yellow: na) Long_side = input(true, "Long side") if Long_side strategy.entry(id="Long", long=true, when= longCondition and strategy.position_size<1) exitCondition= (rising(prev_sig, 1) and falling(sig, 1)) or close < avg and close < avg2 strategy.close(id="Long",comment="L exit", qty=strategy.position_size , when= exitCondition) //close all shortCondition= sig > threshold and rising(sig, 1) and falling(prev_sig, 1) and close < avg and close < avg2 barcolor(shortCondition ? color.gray: na) Short_side = input(true, "Short side") if Short_side strategy.entry(id="Short", long=false, when= shortCondition and strategy.position_size<1) sell_exitCondition= (rising(prev_sig, 1) and falling(sig, 1)) or close > avg and close > avg2 strategy.close(id="Short",comment="S exit", qty=strategy.position_size , when= sell_exitCondition) //close all barcolor(strategy.position_size>1 ? color.lime: na) bgcolor(strategy.position_size>1 ? color.lime: na) barcolor(strategy.position_size<0 ? color.orange: na) bgcolor(strategy.position_size<0 ? color.orange: na)