Tendencia cruzada de la pendiente de la EMA siguiendo la estrategia

El autor:¿ Qué pasa?, Fecha: 2023-10-17 17:02:30
Las etiquetas:

img

Resumen general

Esta estrategia utiliza el cruce de las pendientes de dos EMA con diferentes longitudes para generar tendencias siguiendo las señales.

Las condiciones que hacen que la estrategia entre en el mercado son:

  • Pendiente rápido > Pendiente lento y precio > EMA 200: largo
  • Pendiente rápido < Pendiente lento y precio < EMA 200: pasar a corto

Cuando las pendientes simples se cruzan en la dirección opuesta, cierra la posición.

La estrategia funciona mejor en Bitcoin y las altcoins más líquidas y capitalizadas, pero también funciona muy bien en activos volátiles, en particular si a menudo son tendencia. Funciona mejor en el marco de tiempo de 4 horas.

También hay un filtro de volatilidad opcional, que abre la posición solo si la diferencia entre las dos pendientes es mayor que un valor específico.

¡Disfruta de ello!

Estrategia lógica

El núcleo de esta estrategia consiste en comparar las pendientes de dos EMA con diferentes longitudes.

Primero, se calculan las EMA con longitudes de 130 y 400, luego se calculan las pendientes de cada una, luego se calculan las EMA de longitud 3 en cada pendiente para obtener curvas de pendiente suavizadas.

Cuando la inclinación de la EMA rápida cruza por encima de la inclinación de la EMA lenta, se genera una señal de compra.

Para filtrar el ruido, una EMA de 200 períodos se puede utilizar como un filtro de tendencia, considerando las señales largas solo cuando el precio está por encima de la EMA, y las señales cortas solo cuando está por debajo.

Además, se puede utilizar un filtro de volatilidad, que genera señales solo cuando la diferencia entre las dos pendientes es mayor que un umbral, para evitar casos en que las pendientes se cruzan pero la volatilidad es insuficiente.

Cuando las pendientes rápidas y lentas se cruzan inversamente, las posiciones se cierran para detener las ganancias/pérdidas.

Análisis de ventajas

  1. El uso de cruces de pendiente para generar señales puede rastrear de manera efectiva las tendencias

  2. El ajuste de las combinaciones de períodos de EMA puede adaptarse a las diferentes condiciones del mercado

  3. El filtro de tendencia evita ser engañado por la acción de precios agitados

  4. El filtro de volatilidad filtra las señales falsas

  5. Lógica sencilla y clara, fácil de entender e implementar

  6. Se puede utilizar en múltiples marcos de tiempo

Análisis de riesgos

  1. Pueden producirse frecuentes aberturas y cierres en mercados de gran alcance

  2. Los períodos EMA inadecuados podrían perder puntos de inflexión de la tendencia

  3. Los parámetros deben ajustarse a las condiciones cambiantes del mercado

  4. Al igual que los sistemas MA, las grandes tendencias pueden invertirse en los extremos

Direcciones de optimización

  1. Pruebe diferentes combinaciones de periodos de EMA para encontrar parámetros óptimos

  2. Elegir parámetros de acuerdo con las características de los activos y las condiciones del mercado

  3. Considere la posibilidad de añadir estrategias de stop loss para controlar el riesgo

  4. Considerar el ajuste dinámico de los períodos de EMA

  5. Prueba de diferentes valores de umbral de volatilidad

  6. Eficacia de los ensayos en todos los plazos

Resumen de las actividades

La estrategia tiene una lógica clara y fácil de entender, utilizando cruces de pendiente de la EMA para generar señales y rastrear efectivamente las tendencias. Los filtros de tendencia y volatilidad reducen las operaciones ruidosas.


/*backtest
start: 2023-10-09 00:00:00
end: 2023-10-16 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// strategy(title="Slopes",initial_capital=1000, default_qty_type=strategy.percent_of_equity, commission_type=strategy.commission.percent, commission_value=0.06, slippage = 2, default_qty_value=30, overlay=false)

//definizione input

start = timestamp(input(2018, "start year"), input(1, "start month"), input(1, "start day"), 00, 00)
end = timestamp(input(2020, "end year"), input(1, "end month"), input(1, "end day"), 00, 00)

average = input (title="Source MA Type", type=input.string, defval="EMA",options=["EMA","SMA"])

len1=input(130,title="Fast MA Length")
len2=input(400,title="Slow MA Length")

smoothingavg = input (title="Smoothing MAs Type", type=input.string, defval="EMA",options=["EMA","SMA"])
smoothingavglen = input (3,title="Smoothing MAs Length")

trendfilter=input(true,title="Trend Filter")
trendfilterperiod=input(200,title="Trend Filter MA Period")
trendfiltertype=input (title="Trend Filter MA Type", type=input.string, defval="EMA",options=["EMA","SMA"])

volatilityfilter=input(false,title="Volatility Filter")
volatilitydelta=input(0.0003,step=0.0001,title="Delta Slopes EMA")

//variabili

m1 = if average == "EMA" 
    ema(close,len1)
else
    sma(close,len1)

m2=if average == "EMA" 
    ema(close,len2)
else
    sma(close,len2)

slp1=(m1-m1[1])/m1
slp2=(m2-m2[1])/m2

e1=if smoothingavg == "EMA" 
    ema(slp1,smoothingavglen)
else
    sma(slp1,smoothingavglen)

e2=if smoothingavg == "EMA" 
    ema(slp2,smoothingavglen)
else
    sma(slp2,smoothingavglen)

plot(e1,color=color.yellow)
plot(e2,color=color.red)
//plot (abs(e1-e2),color=color.white)
//plot (ema(e1-e2,9),color=color.yellow)

//variabili accessorie e condizioni

TrendConditionL=if trendfiltertype =="EMA"
    close>ema(close,trendfilterperiod)
else
    close>sma(close,trendfilterperiod)
    
TrendConditionS=if trendfiltertype =="EMA"
    close<ema(close,trendfilterperiod)
else
    close<sma(close,trendfilterperiod)
    
VolatilityCondition = abs(e1-e2) > volatilitydelta

ConditionEntryL= if trendfilter == true
    if volatilityfilter == true
        e1>e2 and TrendConditionL and VolatilityCondition
    else
        e1>e2 and TrendConditionL
else
    if volatilityfilter == true
        e1>e2 and VolatilityCondition
    else 
        e1>e2

ConditionEntryS= if trendfilter == true
    if volatilityfilter == true
        e1<e2 and TrendConditionS and VolatilityCondition
    else 
        e1<e2 and TrendConditionS
else
    if volatilityfilter == true
        e1<e2 and VolatilityCondition
    else
        e1<e2

ConditionExitL=crossunder(e1,e2)
ConditionExitS=crossover(e1,e2)

if true
    if ConditionExitS
        if strategy.position_size < 0
            strategy.close("SLPShort")

if true
    if ConditionExitL
        if strategy.position_size > 0
            strategy.close("SLPLong")

if true
    if ConditionEntryL
        strategy.entry ("SLPLong",long=true)
        
if true
    if ConditionEntryS 
        strategy.entry("SLPShort",long=false)

Más.