Стратегия двойной EMA - это стратегия, которая определяет направление тренда цен путем расчета EMA различных циклов и использует это для определения входов и выходов.
Стратегия основана на двух индикаторах EMA, краткосрочной 9-дневной EMA и более длительной 21-дневной EMA.
Когда короткая EMA пересекает длинную EMA, это рассматривается как цена, входящая в восходящий тренд. Стратегия будет длинной, чтобы следовать растущей тенденции. Когда короткая EMA пересекает длинную EMA, это рассматривается как цена, входящая в нисходящий тренд. Стратегия будет короткой, чтобы следовать снижающей тенденции.
Поскольку индикаторы EMA могут эффективно отфильтровывать шум из данных о ценах и определять основное направление тренда, стратегия использует двойные EMA в качестве основы для входа и выхода, чтобы фиксировать более длительные тенденции цен.
Стратегия имеет следующие преимущества:
Эта стратегия также сопряжена с некоторыми рисками:
Стратегия может быть оптимизирована в следующих аспектах:
В целом, двойная EMA-стратегия является очень полезной стратегией, следующей за трендом. Она проста в эксплуатации, понятна и отлично работает на сильно развивающихся рынках. Стратегия также имеет некоторые риски, которые могут быть смягчены с помощью различных улучшений для улучшения ее стабильности.
/*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)