Esta estrategia combina el índice de movimiento direccional (ADX), el indicador direccional más (DI +) y los promedios móviles rápidos y lentos para determinar la dirección del mercado y el período de retención. Pertenece a las estrategias comerciales de seguimiento de tendencias.
La lógica central de esta estrategia es generar señales de compra cuando la línea +DI cruza por encima de la línea ADX desde abajo hacia arriba, y generar señales de venta cuando la línea +DI cruza por debajo de la línea ADX desde arriba hacia abajo. Por lo tanto, esta estrategia se basa en el cruce entre DI y ADX para determinar las tendencias del mercado y los puntos de reversión. Al mismo tiempo, la relación entre los promedios rápidos y lentos se utiliza para determinar la tendencia general del mercado. Las señales de negociación solo se considerarán cuando la EMA rápida esté por encima de la EMA lenta.
Específicamente, se activará una señal de compra cuando se cumplan las siguientes condiciones:
Se activará una señal de venta cuando se cumplan las siguientes condiciones:
La estrategia también incorpora una lógica de stop loss para salir de todas las posiciones cuando el precio cae por debajo del nivel de stop loss.
La estrategia combina los indicadores DI, ADX y media móvil para determinar eficazmente los cambios en las tendencias del mercado.
Hay algunos riesgos a tener en cuenta con esta estrategia:
Estos riesgos pueden abordarse mediante la optimización de los parámetros de ADX y promedio móvil, el ajuste del nivel de stop loss, la adición de filtros para la confirmación, etc.
Hay espacio para otras mejoras:
En general, esta estrategia de tendencia cruzada de ADX es bastante estable, capaz de capturar efectivamente las reversiones desde el principio, pero el control del riesgo es crítico.
/*backtest start: 2022-12-01 00:00:00 end: 2023-12-07 00:00:00 period: 1d basePeriod: 1h 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/ // © mohanee //@version=4 //ADX strategy SmoothedTrueRange=0.00 SmoothedDirectionalMovementPlus=0.00 SmoothedDirectionalMovementMinus=0.00 strategy(title="ADX strategy", overlay=false,pyramiding=3, default_qty_type=strategy.fixed, default_qty_value=3, initial_capital=10000, currency=currency.USD) len = input(11, title="ADX Length", minval=1) threshold = input(30, title="threshold", minval=5) fastEma=input(13, title="Fast EMA",minval=1, maxval=50) slowEma=input(55, title="Slow EMA",minval=10, maxval=200) stopLoss =input(8, title="Stop Loss",minval=1) // TrueRange = max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1]))) DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? max(high-nz(high[1]), 0): 0 DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? max(nz(low[1])-low, 0): 0 SmoothedTrueRange:= nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/len) + TrueRange SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/len) + DirectionalMovementPlus SmoothedDirectionalMovementMinus:= nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/len) + DirectionalMovementMinus DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100 DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100 DX = abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100 ADX = sma(DX, len) plot(DIPlus, color=color.green, title="DI+") //plot(DIMinus, color=color.red, title="DI-") plot(ADX, color=color.black, title="ADX") hline(threshold, color=color.black, linestyle=hline.style_dashed) fastEmaVal=ema(close,fastEma) slowEmaVal=ema(close,slowEma) //long condition longCondition= ADX < threshold and crossover(DIPlus,ADX) and fastEmaVal > slowEmaVal barcolor(longCondition ? color.yellow: na) strategy.entry(id="ADXLE", long=true, when= longCondition and strategy.position_size<1) barcolor(strategy.position_size>1 ? color.blue: na) bgcolor(strategy.position_size>1 ? color.blue: na) //Add strategy.entry(id="ADXLE", comment="Add", long=true, when= strategy.position_size>1 and close<strategy.position_avg_price and crossover(DIPlus,ADX) ) //calculate stop Loss stopLossVal = strategy.position_avg_price - (strategy.position_avg_price*stopLoss*0.01) strategy.close(id="ADXLE",comment="SL Exit", when=close<stopLossVal) //close all on stop loss //exit condition exitCondition= ADX > threshold and crossunder(DIPlus,ADX) // and fastEmaVal > slowEmaVal strategy.close(id="ADXLE",comment="TPExitAll", qty=strategy.position_size , when= exitCondition) //close all