Estrategia de media móvil del filtro de casco

El autor:¿ Qué pasa?, Fecha: 2024-01-04 15:16:34
Las etiquetas:

img

Resumen general

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.

Estrategia lógica

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.

Análisis de ventajas

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.

Análisis de riesgos

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.

Optimizació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.

Resumen de las actividades

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)


Más.