En la carga de los recursos... Cargando...

Estrategia de combinación de DMI y HMA

El autor:¿ Qué pasa?, Fecha: 2024-01-04 17:23:06
Las etiquetas:

img

Resumen general

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.

Estrategia lógica

  1. Calcular el rango verdadero, DIPlus, DIMinus y ADX.

  2. Calcular las medias móviles rápidas y lentas del casco (HMA).

  3. Activar la entrada larga cuando DIPlus cruza DIMinus y HMA rápido cruza HMA lento.

  4. Activar la entrada corta cuando DIMinus cruza por debajo de DIPlus y HMA rápido cruza por debajo de HMA lento.

  5. Poner órdenes largas/cortas en las señales de entrada.

Análisis de ventajas

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.

Análisis de riesgos

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.

Direcciones de optimización

  1. Añadir la pérdida de detención de ATR basado en el rango verdadero.

  2. Optimice los períodos del casco para encontrar la mejor mezcla.

  3. Umbral dinámico para señales largas/cortas.

  4. Añadir filtro de impulso para garantizar la continuidad de la tendencia.

Resumen de las actividades

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)

Más.