La estrategia de doble EMA es una estrategia de seguimiento de tendencias que identifica la dirección de tendencia de los precios calculando EMA de diferentes ciclos y lo utiliza para determinar entradas y salidas.
La estrategia se basa principalmente en dos indicadores de EMA, un EMA de 9 días a corto plazo y un EMA de 21 días más largo.
Cuando la EMA corta cruza por encima de la EMA larga, se considera que los precios entran en una tendencia alcista. La estrategia será larga para seguir la tendencia al alza. Cuando la EMA corta cruza por debajo de la EMA larga, se considera que los precios entran en una tendencia bajista. La estrategia será corta para seguir la tendencia bajista.
Los indicadores EMA pueden filtrar eficazmente el ruido de los datos de precios e identificar la dirección principal de la tendencia.
La estrategia tiene las siguientes ventajas:
También hay algunos riesgos con esta estrategia:
La estrategia se puede optimizar en los siguientes aspectos:
En resumen, la estrategia de doble EMA es una estrategia muy útil de seguimiento de tendencias. Es fácil de operar, entender y tiene un excelente rendimiento en mercados con tendencias fuertes. La estrategia también tiene algunos riesgos que se pueden mitigar a través de varias mejoras para mejorar su estabilidad.
/*backtest start: 2023-02-21 00:00:00 end: 2024-02-27 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 // This can only draw so many lines. Use bar replay to go back further strategy("Strategy Lines", shorttitle="Strategy Lines", overlay=true, max_lines_count=500) //########################################################################################################################################### // Replace your strategy here //########################################################################################################################################### shortEMA = ta.ema(close, input(9, title="Short EMA Length")) longEMA = ta.ema(close, input(21, title="Long EMA Length")) // Entry conditions for long and short positions longCondition = ta.crossover(shortEMA, longEMA) shortCondition = ta.crossunder(shortEMA, longEMA) //########################################################################################################################################### // Strategy Lines //########################################################################################################################################### var timeLow = bar_index var line li = na var openLPrice = 0.0000 var openSPrice = 0.0000 LongWColor = input.color(color.rgb(0,255,0,0),"Long Win Color", group="Strategy Lines") LongLColor = input.color(color.rgb(0,0,255,0),"Long Loss Color", group="Strategy Lines") ShortWColor = input.color(color.rgb(255,255,0,0),"Short Win Color", group="Strategy Lines") ShortLColor = input.color(color.rgb(255,0,0,0),"Short Loss Color", group="Strategy Lines") WinFontColor = input.color(color.rgb(0,0,0,0),"Win Font Color", group="Strategy Lines") LossFontColor = input.color(color.rgb(255,255,255,0),"Loss Font Color", group="Strategy Lines") LinesShowLabel = input(false,"Show Labels?",group = "Strategy Lines") // // Start new line when we go long // if strategy.position_size >0 // line.delete(li) // li := line.new(timeLow, close[bar_index-timeLow], bar_index, close, width=2, color=close>openLPrice?LongWColor:LongLColor) // // Start new line when we go short // if strategy.position_size <0 // line.delete(li) // li := line.new(timeLow, close[bar_index-timeLow], bar_index, close, width=2, color=close<openSPrice?ShortWColor:ShortLColor) // //Delete Lines if we don't have a position open // if strategy.position_size ==0 // li := line.new(timeLow, close[bar_index-timeLow], bar_index, close, width=2, color=color.rgb(0,0,0,100)) // line.delete(li) if LinesShowLabel // Short Label if strategy.position_size>=0 and strategy.position_size[1] <0 label.new( timeLow, na, text=str.tostring((openSPrice-close[1])/(syminfo.mintick*10)), color=close[1]<openSPrice?ShortWColor:ShortLColor, textcolor=close[1]<openSPrice?WinFontColor:LossFontColor, size=size.small, style=label.style_label_down, yloc=yloc.abovebar) // Long Label if strategy.position_size<=0 and strategy.position_size[1] >0 label.new( timeLow, na, text=str.tostring((close[1]-openLPrice)/(syminfo.mintick*10)), color=close[1]>openLPrice?LongWColor:LongLColor, textcolor=close[1]>openLPrice?WinFontColor:LossFontColor, size=size.small, style=label.style_label_down, yloc=yloc.abovebar) // Open long position and draw line if (longCondition) //strategy.entry("Long", strategy.long) // timeLow := bar_index // li := line.new(timeLow, close[bar_index-timeLow], bar_index, close, width=2, color=close>openLPrice?LongWColor:LongLColor) openLPrice := close // Open short position and draw line if (shortCondition) //strategy.entry("Short", strategy.short) // timeLow := bar_index // li := line.new(timeLow, close[bar_index-timeLow], bar_index, close, width=2, color=close<openSPrice?ShortWColor:ShortLColor) openSPrice := close //########################################################################################################################################### // Strategy Execution (Replace this as well) //########################################################################################################################################### if (longCondition) strategy.entry("Long", strategy.long) if (shortCondition) strategy.entry("Short", strategy.short)