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:
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!
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.
El uso de cruces de pendiente para generar señales puede rastrear de manera efectiva las tendencias
El ajuste de las combinaciones de períodos de EMA puede adaptarse a las diferentes condiciones del mercado
El filtro de tendencia evita ser engañado por la acción de precios agitados
El filtro de volatilidad filtra las señales falsas
Lógica sencilla y clara, fácil de entender e implementar
Se puede utilizar en múltiples marcos de tiempo
Pueden producirse frecuentes aberturas y cierres en mercados de gran alcance
Los períodos EMA inadecuados podrían perder puntos de inflexión de la tendencia
Los parámetros deben ajustarse a las condiciones cambiantes del mercado
Al igual que los sistemas MA, las grandes tendencias pueden invertirse en los extremos
Pruebe diferentes combinaciones de periodos de EMA para encontrar parámetros óptimos
Elegir parámetros de acuerdo con las características de los activos y las condiciones del mercado
Considere la posibilidad de añadir estrategias de stop loss para controlar el riesgo
Considerar el ajuste dinámico de los períodos de EMA
Prueba de diferentes valores de umbral de volatilidad
Eficacia de los ensayos en todos los plazos
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)