이중 EMA 전략은 다른 주기의 EMA를 계산하여 가격의 트렌드 방향을 파악하고 입출구를 결정하는 트렌드 다음 전략입니다. 이 간단하고 실용적인 전략은 트렌딩 시장에서 잘 작동합니다.
이 전략은 주로 두 개의 EMA 지표, 즉 단기 9일 EMA와 더 긴 21일 EMA를 기반으로 합니다. 이 지표의 크로스오버는 입시 및 출구 신호를 생성합니다.
짧은 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)