Estrategia de negociación de media móvil adaptativa

El autor:¿ Qué pasa?, Fecha: 2024-02-22 17:09:39
Las etiquetas:

img

Resumen general

Esta estrategia es una estrategia de seguimiento de tendencias basada en promedios móviles adaptativos. Utiliza dos promedios móviles DEMA con períodos diferentes para generar señales comerciales. La estrategia adaptará automáticamente el marco de tiempo para el análisis basado en el período actual, lo que permite el seguimiento de marcos de tiempo múltiples.

Estrategia lógica

La estrategia utiliza una línea rápida DEMA y una línea lenta DEMA para construir señales comerciales. La línea rápida tiene un período de tf y la línea lenta tiene un período de tf*2. Una señal de compra se genera cuando la línea rápida cruza por encima de la línea lenta. Una señal de venta se genera cuando la línea rápida cruza por debajo de la línea lenta. Esto permite a la estrategia rastrear tendencias a medio y largo plazo. Además, la estrategia también utiliza un filtro de media móvil doble de Hull para reducir las operaciones ruidosas. Las señales solo se generan cuando el filtro de Hull acuerda la direccionalidad.

Análisis de ventajas

La mayor ventaja de esta estrategia es que puede adaptarse a diferentes períodos automáticamente. Elegirá el marco de tiempo de análisis de diario a semanal basado en el período actual. Esto hace que la estrategia sea adecuada para una variedad de entornos de mercado. Además, la estructura de media móvil dual puede rastrear las tendencias de manera efectiva, y el filtro dual aumenta la calidad de la señal. Como resultado, esta estrategia es muy adecuada para rastrear las tendencias a medio y largo plazo.

Análisis de riesgos

El principal riesgo de esta estrategia proviene de las inversiones de tendencia. Cuando el mercado pasa de un mercado alcista a un mercado bajista, las líneas rápidas y lentas pueden cruzarse bruscamente hacia abajo, lo que resulta en enormes pérdidas flotantes. Además, el filtro de línea también puede perder algunas oportunidades rentables. Si el filtro no está de acuerdo con la direccionalidad del precio, se saltarán esas señales rentables. Como resultado, esta estrategia se dirige principalmente a mercados de tendencia estables a medio y largo plazo.

Direcciones de optimización

La estrategia se puede optimizar ajustando los parámetros del filtro o utilizando otros indicadores como sustitutos. Por ejemplo, el MACD se puede probar en lugar de HullMA, o los parámetros del período HullMA se pueden ajustar. También se pueden probar diferentes combinaciones de parámetros para encontrar reglas de negociación más adecuadas. Además, los indicadores de volatilidad también se pueden incorporar para controlar el tamaño de la posición. Se pueden tomar posiciones más pequeñas cuando aumenta la volatilidad del mercado.

Conclusión

En conclusión, esta es una estrategia muy práctica de seguimiento de tendencias adaptativas. Puede ajustar automáticamente el marco de tiempo de análisis para diferentes períodos y es adecuado para operar en diferentes horizontes de tiempo. La estructura de media móvil dual puede rastrear constantemente las tendencias, y el filtro también mejora la calidad de la señal. En general, es adecuado para los inversores que buscan rendimientos constantes a medio y largo plazo.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-24 23:59:59
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2

//
//---------------------------------------------
//* Author - PPSingnal
//* http://ppsignal.com
//---------------------------------------------
//
//

strategy (title="PPSignal V4 (Auto Adaptive Times)", shorttitle="PPSignal V4", overlay=true)
delayOffset = input(defval = 0, title = "Delay Open/Close MA (Forces Non-Repainting)", minval = 0, step = 1)

//----------------------------------------    INICIO PPI     ----------------------------------------

// - PARÁMETROS DE ENTRADA
// SE DEFINE LA RESOLUCIÓN
useRes1 = true
setRes1 = true


tf = timeframe.period == "60" ? 4 : timeframe.period == "240" ? 4 : timeframe.period == "D" ? 4 : timeframe.period == "W" ?4 : 4


// PRIMER DEMA
type   = "DEMA"
src   = close
len    = tf
off   = 0
lsma   = 0
// SEGUNDA DEMA
type2   = "DEMA"
src2    = open
len2    = tf
off2    = 0
lsma2   = 0

// - INPUTS END

//----------------------------------------    INICIO FUNCIONES     ----------------------------------------

// RETORNA UNA MEDIA MOVIL (TYPE=TIPO / SRC = TIPO DE PRECIO / LEN=LONGITUD / LSMA=0)
variant(type, src, len, lsma) =>
    v1 = sma(src, len)                                                  // Simple
    v2 = ema(src, len)                                                  // Exponential
    v3 = wma(src, len)                                                  // Weighted
    v4 = vwma(src, len)                                                 // Volume Weighted
    v5 = na(v5[1]) ? sma(src, len) : (v5[1] * (len - 1) + src) / len    // Smoothed
    v6 = 2 * v2 - ema(v2, len)                                          // Double Exponential
    v7 = 3 * (v2 - ema(v2, len)) + ema(ema(v2, len), len)               // Triple Exponential
    v8 = wma(2 * wma(src, len / 2) - wma(src, len), round(sqrt(len)))   // Hull
    v9 = linreg(src, len, lsma)                                         // Least Squares
    // return variant, defaults to SMA if input invalid.
    type=="EMA"?v2 : type=="WMA"?v3 : type=="VWMA"?v4 : type=="SMMA"?v5 : type=="DEMA"?v6 : type=="TEMA"?v7 : type=="HullMA"?v8 : type=="LSMA"?v9 : v1

// SuperSmoother filter
    // © 2013  John F. Ehlers
    a1 = exp(-1.414*3.14159 / len)
    b1 = 2*a1*cos(1.414*3.14159 / len)
    c2 = b1
    c3 = (-a1)*a1
    c1 = 1 - c2 - c3
    v12 = 0.0
    v12 := c1*(src + nz(src[1])) / 2 + c2*nz(v12[1]) + c3*nz(v12[2])
   

// RETORNA LA RESOLUCIÓN SETEADA Y SINO LA DEFAULT
// 3H:      1min - 3min - 5min - 15min
// DIARIO:  30 - 45 - 60
// SEMANAL: 120 - 180 - 240 - D


reso(exp, use, res) => use ? request.security(syminfo.tickerid, timeframe.period=="1" ? "D" : timeframe.period=="3" ? "D" : timeframe.period=="5" ? "D" : timeframe.period=="15" ? "D" : timeframe.period=="30" ? "D" : timeframe.period=="45" ? "W" : timeframe.period=="60" ? "W" : timeframe.period=="120" ? "W" : timeframe.period=="180" ? "W" : timeframe.period=="240" ? "W" : timeframe.period=="D" ? "W" : "W", exp) : exp




//----------------------------------------    FIN FUNCIONES     ----------------------------------------

//----------------------------------------    INICIO VARIABLES     ----------------------------------------

// DEMAS
ma_short    = reso(variant(type, src[off], len, lsma), useRes1, setRes1)
ma_long     = reso(variant(type2, src2[off2], len2, lsma2), useRes1, setRes1)


//----------------------------------------    FIN VARIABLES     ----------------------------------------


//----------------------------------------    FIN PPI     ----------------------------------------

//----------------------------------------    PRIMER FILTRO      ----------------------------------------
// Double HullMA
scolor      = false

n=1
n2ma=2*wma(close,round(n/2))
nma=wma(close,n)
diff=n2ma-nma
sqn=round(sqrt(n))

n2ma1=2*wma(close[1],round(n/2))
nma1=wma(close[1],n)
diff1=n2ma1-nma1
sqn1=round(sqrt(n))

n1=wma(diff,sqn)
n2=wma(diff1,sqn)

//----------------------------------------    FIN PRIMER FILTRO     ----------------------------------------

//----------------------------------------    INICIO CONDICIONES      ----------------------------------------

// CONDICION CON FILTRO
cruce= (ma_short > ma_long) and n1>n2 ? true : ma_short < ma_long ? false : cruce[1]
// Condition

// FONDO DE COLOR
bground = cruce ? white : red
bgcolor(bground, transp=90)


// BARRAS COLOREADAS
barcol = cruce ? yellow : red 
barcolor(barcol, transp=0)

closePlot   = plot(ma_short, title = "Zone 1", color = gray, circles = 0, style = circles, transp = 100)
openPlot   = plot(ma_long, title = "Zone 2", color = green, circles = 0, style = circles, transp = 100)
trendState  = ma_short > ma_long ? true : ma_short < ma_long ? false : trendState[1]

// channel fill
closePlotU  = plot(trendState ? ma_short : na, transp = 100, editable = false)
openPlotU   = plot(trendState ? ma_long : na, transp = 100, editable = false)
closePlotD  = plot(trendState ? na : ma_short, transp = 100, editable = false)
openPlotD   = plot(trendState ? na : ma_long, transp = 100, editable = false)

fill(openPlotU, closePlotU, title = "Up Trend Fill", color = yellow, transp = 70)
fill(openPlotD, closePlotD, title = "Down Trend Fill", color = red, transp = 70)




//----------------------------------------    FIN CONDICIONES     ----------------------------------------

//----------------------------------------    INICIO ESTRATEGIA      ----------------------------------------

//CONDICION COMPRA
longCond    = (ma_short > ma_long) and n1>=n2

//CONDICION VENTA

shortCond    = (ma_short < ma_long)

//ABRO COMPRA A
strategy.entry("Bull Trend", strategy.long, when = longCond)

//ABRO VENTA A
strategy.entry("Bearish Trend", strategy.short, when = shortCond)

//CIERRO VENTA A
strategy.exit("Exit Short", from_entry = "Bull Trend", when = shortCond)

//CIERRO COMPRA A
strategy.exit("Exit Long", from_entry = "Bearish Trend", when = longCond)

//----------------------------------------    FIN ESTRATEGIA     ----------------------------------------





Más.