
La estrategia utiliza dos promedios móviles de Hall, a corto y largo plazo, para generar y filtrar señales de negociación. Los promedios móviles de Hall a corto plazo se utilizan para generar señales, mientras que los promedios móviles de Hall a largo plazo se utilizan para filtrar señales, y solo se generan señales de negociación cuando el promedio de Hall a corto plazo y el promedio de Hall a largo plazo cambian de forma simultánea.
La estrategia utiliza el indicador ATR para establecer un stop loss y un stop loss simultáneamente. Cada vez que se abre una posición, se establece dinámicamente el stop loss y el stop loss de la posición actual en función del valor del ATR.
Las medias móviles de Hall de corto plazo se utilizan para capturar las tendencias de corto plazo y los puntos de inflexión de los precios. Cuando la dirección de las medias móviles de Hall de corto plazo cambia, indica que la tendencia de corto plazo de los precios ha cambiado.
Los promedios móviles de Hall a largo plazo se utilizan para determinar el movimiento general de los precios. Por ejemplo, cuando la dirección de los promedios móviles de Hall a largo plazo es ascendente, indica que los precios están en una tendencia general ascendente.
Solo se produce una señal de negociación cuando la media móvil de Hall en el corto plazo se desplaza y su dirección de desplazamiento coincide con la dirección de movimiento general de la media móvil de Hall en el largo plazo. Es decir, solo se negocia esta señal de corto plazo cuando la tendencia de los precios en el corto plazo cambia al mismo tiempo que la tendencia general cambia en la misma dirección. Esto puede filtrar eficazmente las señales erróneas causadas por el ruido del mercado en el corto plazo.
Después de abrir una posición, se establece un punto de parada y un punto de parada en función del tamaño del indicador ATR. El indicador ATR puede reflejar la volatilidad y el nivel de riesgo del mercado. La posición de parada se coloca por debajo del precio bajo, mientras que la posición de parada se coloca por encima del precio alto, y ambos están vinculados con el valor de ATR, para ajustar el alcance del punto de parada en función de la volatilidad del mercado.
Esta estrategia combina señales a corto plazo y filtraciones a largo plazo para identificar de manera efectiva las tendencias de precios a medio plazo y capturar los puntos de inflexión a tiempo. En comparación con indicadores como las medias móviles individuales, se reduce la posibilidad de ser engañados por el ruido del mercado.
Ajuste dinámico de las posiciones de stop loss para establecer un stop loss razonable en función de la volatilidad del mercado, evitando ser demasiado radical y minimizando el riesgo de pérdidas al tiempo que garantiza la ganancia.
Con las ventajas de las medias móviles de Hall, los movimientos de precios se pueden determinar con mayor flexibilidad y precisión, y tienen una mayor capacidad de seguimiento que las medias móviles ordinarias.
La estrategia se basa en el cruce de dos medias móviles de Hall en el corto plazo y el largo plazo como señal, y si se produce un falso cruce entre dos medias móviles, puede causar una entrada errónea. En este caso, se debe decidir si se filtra la señal en función de la estructura del mercado a largo plazo.
En situaciones de oscilación, los precios pueden oscilar en un rango de transacciones más pequeño, lo que aumenta la tasa de error de la señal y aumenta la posibilidad de transacciones sin sentido. En este caso, las transacciones sin sentido pueden evitarse ampliando las condiciones de filtración de la señal de transacción.
La configuración de la parada de pérdidas depende del indicador ATR, y si la fluctuación del mercado reflejada por el indicador ATR no es precisa, la posición de la parada de pérdidas también se invalidará. En este caso, se puede considerar corregir el valor de ATR en combinación con otros indicadores de volatilidad.
Se puede considerar la posibilidad de combinar con otros indicadores a corto plazo para ayudar a la determinación de señales, como el indicador de sobrecompra y sobreventa, como el RSI, para mejorar la eficacia del filtro.
Se pueden aumentar o optimizar las relaciones lógicas de filtración entre las medias móviles de Hall de largo y corto plazo, haciendo que las reglas de filtración sean más estrictas y evitando señales erróneas.
Se pueden estudiar los efectos de diferentes configuraciones de parámetros en la estabilidad de la estrategia y la rentabilidad. Por ejemplo, diferentes combinaciones de parámetros de media móvil, parámetros ATR, etc. pueden producir diferentes resultados comerciales.
Esta estrategia combina la captura de señales de las medias móviles de Hall a corto plazo, la filtración de señales de las medias móviles de Hall a largo plazo y el indicador ATR para establecer paradas de pérdidas, formando un sistema de estrategias de seguimiento de tendencias a medio plazo más completo. Esta estrategia puede detectar con eficacia los puntos de inflexión de precios a medio plazo y evitar la interferencia del ruido del mercado a corto 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)