Esta estrategia combina el índice de movimiento direccional (DMI) y el promedio móvil del casco (HMA) para identificar la dirección del mercado con DMI y confirmar la fortaleza de la tendencia con HMA, sin gestión de riesgos.
Calcular el rango verdadero, DIPlus, DIMinus y ADX.
Calcular las medias móviles rápidas y lentas del casco (HMA).
Activar la entrada larga cuando DIPlus cruza DIMinus y HMA rápido cruza HMA lento.
Activar la entrada corta cuando DIMinus cruza por debajo de DIPlus y HMA rápido cruza por debajo de HMA lento.
Poner órdenes largas/cortas en las señales de entrada.
La doble confirmación del indicador de tendencia DMI y Hull MA garantiza la exactitud en la captura de la tendencia del mercado y evita los problemas.
El riesgo principal proviene de la falta de stop loss, no controlar las pérdidas cuando ocurren grandes oscilaciones del mercado.
Las soluciones posibles incluyen la adición de pérdida de parada móvil, la optimización de la mezcla de parámetros, etc.
Añadir la pérdida de detención de ATR basado en el rango verdadero.
Optimice los períodos del casco para encontrar la mejor mezcla.
Umbral dinámico para señales largas/cortas.
Añadir filtro de impulso para garantizar la continuidad de la tendencia.
La combinación de DMI y HMA se desempeña de manera excepcional en la identificación de tendencias con simplicidad y eficiencia.
/*backtest start: 2022-12-28 00:00:00 end: 2024-01-03 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/ // © Tuned_Official //@version=4 strategy(title="DMI + HMA - No Risk Management", overlay = false, pyramiding=1, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.025) //Inputs hullLen1 = input(title="Hull 1 length", type=input.integer, defval=29) hullLen2 = input(title="Hull 2 length", type=input.integer, defval=2) len = input(title="Length for DI", type=input.integer, defval=76) //Calculations 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 = 0.0 SmoothedTrueRange := nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/len) + TrueRange SmoothedDirectionalMovementPlus = 0.0 SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/len) + DirectionalMovementPlus SmoothedDirectionalMovementMinus = 0.0 SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/len) + DirectionalMovementMinus //Indicators fasthull = hma(close, hullLen1) slowhull = hma(close, hullLen2) DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100 DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100 DX = abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100 ADX = sma(DX, len) //Plots plot(DIPlus, color=color.green, title="DI+") plot(DIMinus, color=color.red, title="DI-") plot(ADX, color=color.black, title="ADX") //conditions go_long = crossover(DIPlus, DIMinus) and fasthull > slowhull //crossover(fasthull, slowhull) and DIPlus > DIMinus go_short = crossover(DIMinus, DIPlus) and fasthull < slowhull //crossunder(fasthull, slowhull) and DIMinus > DIPlus //Entry if strategy.position_size < 0 or strategy.position_size == 0 strategy.order("long", strategy.long, when=go_long) if strategy.position_size > 0 or strategy.position_size == 0 strategy.order("Short", strategy.short, when=go_short)