Esta estrategia utiliza promedios móviles de Hull a corto y largo plazo para generar y filtrar las señales comerciales. La media móvil de Hull a corto plazo se utiliza para generar señales, mientras que la media móvil de Hull a largo plazo se utiliza para filtrar señales. Las operaciones solo se realizan cuando la media móvil de Hull a corto plazo cambia de dirección y la media móvil de Hull a largo plazo se mueve en la misma dirección general.
La estrategia también utiliza el indicador ATR para establecer dinámicamente los niveles de stop loss y de ganancias al iniciar operaciones.
El promedio móvil de Hull a corto plazo capta las tendencias de los precios a corto plazo y los puntos de inflexión.
El promedio móvil a largo plazo de Hull determina la tendencia general de los precios.
Las operaciones solo se realizan cuando la media móvil de Hull a corto plazo cambia de dirección, y su nueva dirección se alinea con la dirección de la media móvil de Hull a largo plazo.
Después de ingresar posiciones, los niveles de stop loss y take profit se establecen en función del valor del indicador ATR. El ATR refleja la volatilidad del mercado y los niveles de riesgo.
La combinación de señales a corto plazo y filtros a largo plazo permite identificar eficazmente las tendencias a medio plazo y los puntos de inflexión, evitando señales falsas del ruido del mercado.
El método de stop loss y take profit dinámicos basado en el ATR establece rangos razonables basados en la volatilidad actual, el equilibrio de la toma de beneficios y la prevención de pérdidas.
El promedio móvil de Hull tiene ventajas de flexibilidad y precisión sobre los promedios móviles estándar, con un mejor seguimiento de tendencias.
La estrategia se basa en cruces entre las medias móviles de Hull para generar señales.
En el rango, los mercados agitados con los precios oscilando en un rango de negociación, los errores de señal y las operaciones innecesarias pueden acumularse.
La dependencia del stop loss y take profit en ATR significa que las lecturas de volatilidad inexactas darán lugar a una mala colocación.
Indicadores adicionales a corto plazo como el RSI pueden mejorar la precisión de la señal a través de la convergencia.
La lógica del filtro entre las medias móviles de Hull puede mejorarse para tener requisitos de entrada más estrictos, evitando señales falsas.
La investigación de ajuste de parámetros puede descubrir mejoras en la estabilidad y la rentabilidad por cambios en las longitudes de media móvil, los períodos ATR, etc.
Esta estrategia combina la generación de señales a corto plazo, el filtrado de señales a largo plazo y el stop loss/take profit basado en ATR en un marco robusto de tendencia a mediano plazo.
/*backtest start: 2023-12-04 00:00:00 end: 2024-01-03 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("Hull Filtered Strategy", overlay=true, pyramiding=0, default_qty_type= strategy.percent_of_equity, default_qty_value = 10, calc_on_order_fills=false, slippage=0,commission_type=strategy.commission.percent,commission_value=0) // Parameters for Hull Moving Averages src = input(close, title="Source") signal_period = input(50, title="Period of signal HMA") filter_period = input(200, title="Period of filter HMA") strat_dir_input = input(title="Strategy Direction", defval="all", options=["long", "short", "all"]) // Set allowed trading directions strat_dir_value = strat_dir_input == "long" ? strategy.direction.long : strat_dir_input == "short" ? strategy.direction.short : strategy.direction.all strategy.risk.allow_entry_in(strat_dir_value) // stop loss and take profit sl_factor = input(2,title="Stop Loss Factor") tp_factor = input(3,title="Take Profit Factor") atr_period = input(14, title="ATR Period (SL/TP)") // Testing Start dates testStartYear = input(2010, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0) //Stop date if you want to use a specific range of dates testStopYear = input(2030, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(31, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0) // ----------------------------------------------------------------------------- // Global variables // ----------------------------------------------------------------------------- var float tp = na var float sl = na var float position = na // ----------------------------------------------------------------------------- // Functions // ----------------------------------------------------------------------------- testWindow() => time >= testPeriodStart and time <= testPeriodStop ? true : false // ----------------------------------------------------------------------------- // The engine // ----------------------------------------------------------------------------- hma_signal = hma(src, signal_period) hma_filter = hma(src, filter_period) // Used to determine exits and stop losses atr_e = atr(atr_period) // if hma_filter increases hma_trend is set to 1, if it decreases hma_trend is set to -1. If no trend is available, hma_trend is set to ß0 trend = hma_filter > hma_filter[1] ? 1 : hma_filter < hma_filter[1] ? -1 : 0 signal = hma_signal > hma_signal[1] ? 1 : hma_signal < hma_signal[1] ? -1 : 0 // ----------------------------------------------------------------------------- // signals // ----------------------------------------------------------------------------- if signal[0] == 1 and signal[1] != 1 and trend == 1 and testWindow() sl := close - sl_factor*atr_e tp := close + tp_factor*atr_e strategy.entry("HMA_LNG", strategy.long) strategy.exit("LE", "HMA_LNG", profit=100*tp_factor*atr_e, loss=100*sl_factor*atr_e) if signal[0] == -1 and signal[1] != -1 and trend == -1 and testWindow() sl := close + sl_factor*atr_e tp := close - tp_factor*atr_e strategy.entry("HMA_SHRT", strategy.short) strategy.exit("SE", "HMA_SHRT", profit=100*tp_factor*atr_e, loss=100*sl_factor*atr_e) if strategy.position_size != 0 sl := sl[1] tp := tp[1] // ----------------------------------------------------------------------------- // PLOT // ----------------------------------------------------------------------------- hma_s = plot(hma_signal, title="SIGNAL", color = signal == 1 ? color.green : color.red) hma_l = plot(hma_filter, title="TREND", color = trend == 1 ? color.green : color.red) plot(tp, title="TAKE PROFIT", color= strategy.position_size != 0 ? color.blue: na, linewidth=1) plot(sl, title="STOP LOSS", color= strategy.position_size != 0 ? color.red: na, linewidth = 1)