Strategi EMA berganda adalah strategi trend berikut yang mengenal pasti arah trend harga dengan mengira EMA kitaran yang berbeza dan menggunakannya untuk menentukan kemasukan dan keluar.
Strategi ini terutamanya berdasarkan dua penunjuk EMA, EMA jangka pendek 9 hari dan EMA 21 hari yang lebih lama.
Apabila EMA pendek melintasi di atas EMA panjang, ia dilihat sebagai harga memasuki trend menaik. Strategi akan pergi panjang untuk mengikuti trend menaik. Apabila EMA pendek melintasi di bawah EMA panjang, ia dilihat sebagai harga memasuki trend menurun. Strategi akan pergi pendek untuk mengikuti trend menurun.
Indikator EMA dapat menapis bunyi bising dari data harga dengan berkesan dan mengenal pasti arah utama trend.
Strategi ini mempunyai kelebihan berikut:
Terdapat juga beberapa risiko dengan strategi ini:
Strategi ini boleh dioptimumkan dalam aspek berikut:
Ringkasnya, strategi EMA berganda adalah strategi yang sangat berguna mengikut trend. Ia mudah dikendalikan, difahami, dan berfungsi dengan sangat baik di pasaran yang mempunyai trend yang kuat. Strategi ini juga mempunyai beberapa risiko yang dapat dikurangkan melalui pelbagai peningkatan untuk meningkatkan kestabihannya. Secara keseluruhan, EMA berganda berfungsi sebagai templat rujukan penting untuk perdagangan kuantitatif.
/*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)