Strategi ini didasarkan pada 3 garis EMA dari periode yang berbeda. Strategi ini menilai arah tren saat ini dengan apakah harga berada di atas garis EMA. Ketika garis EMA jangka pendek melintasi di atas garis EMA jangka panjang, sinyal beli dihasilkan. Ketika garis EMA jangka pendek melintasi di bawah garis EMA jangka panjang, sinyal jual dihasilkan. Strategi ini melacak tren berjalan dan menutup posisi tepat waktu ketika tren berbalik.
Strategi ini menggunakan 3 garis EMA, yang masing-masing 10 hari, 20 hari dan 50 hari.
Bila kedua EMA 10 hari dan EMA 20 hari berada di atas EMA 50 hari, hal ini didefinisikan sebagai uptrend;
Bila kedua EMA 10 hari dan EMA 20 hari berada di bawah EMA 50 hari, itu didefinisikan sebagai downtrend;
Ketika garis EMA jangka pendek (10 hari dan 20 hari) melintasi di atas garis EMA jangka panjang (50 hari), sinyal beli dihasilkan;
Ketika garis EMA jangka pendek (10 hari dan 20 hari) melintasi di bawah garis EMA jangka panjang (50 hari), sinyal jual dihasilkan;
Menjaga posisi panjang selama tren naik dan memegang posisi pendek selama tren turun;
Tutup posisi arah saat ini ketika tren berbalik (EMA jangka pendek melintasi EMA jangka panjang).
Strategi menangkap keuntungan dengan menutup posisi tepat waktu untuk mengunci keuntungan dan bergantian antara posisi panjang dan pendek.
Keuntungan dari strategi ini adalah:
Ada juga beberapa risiko dalam strategi ini:
Selama pasar yang terikat kisaran, garis EMA dapat sering bersilang, menghasilkan biaya perdagangan yang tinggi dari posisi pembukaan dan penutupan yang sering;
Penentuan tren oleh EMA mungkin gagal setelah kesenjangan harga, kehilangan peluang masuk yang baik.
Untuk mengoptimalkan risiko, beberapa metode dapat digunakan:
Aturan posisi terbuka dapat dipermudah dengan baik ketika EMA dekat untuk menghindari over-trading;
Tentukan tren dengan menggabungkan indikator lain untuk menghindari kegagalan EMA.
Strategi dapat dioptimalkan dari aspek berikut:
Optimasi parameter: Uji kombinasi periode EMA yang berbeda untuk menemukan parameter optimal;
Optimalisasi biaya perdagangan. Optimalkan aturan posisi terbuka dengan benar untuk mengurangi perdagangan sering yang tidak perlu;
Optimasi strategi stop loss. Atur tingkat stop loss yang wajar untuk mengontrol kerugian tunggal;
Menggabungkan indikator lain. Gunakan MACD, KDJ dan indikator lain untuk membantu menentukan waktu masuk yang optimal.
Secara umum, strategi ini cukup sederhana dan praktis. Ini menggunakan EMA untuk menentukan arah tren dengan strategi stop loss yang tepat untuk mengontrol risiko secara efektif. Ada juga ruang untuk optimasi. Dengan menggabungkan optimasi parameter, strategi stop loss dan indikator lainnya, kinerja strategi ini dapat ditingkatkan lebih lanjut.
/*backtest start: 2024-01-28 00:00:00 end: 2024-01-31 04:00:00 period: 45m basePeriod: 5m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © mattehalen //@version=4 //study("EMA 10,20 59",overlay=true) strategy("EMA 10,20 59",overlay=true) infoBox = input(true, title="infoBox", type=input.bool) infoBox2 = input(false, title="infoBox2", type=input.bool) BuySellSignal_Bool = input(false, title="Buy & SellSignal", type=input.bool) infoBoxSize = input(title="infoBoxSize", defval=size.large, options=[size.auto, size.tiny, size.small, size.normal, size.large, size.huge]) ema1Value = input(10) ema2Value = input(20) ema3Value = input(59) maxLoss = input(3000) ema1 = ema(close,ema1Value) ema2 = ema(close,ema2Value) ema3 = ema(close,ema3Value) objcnt = 0 buyTitle = tostring(close[1]) myProfit = float(0) plot(ema1,title="ema1",color=color.red,linewidth=2) plot(ema2,title="ema2",color=color.green,linewidth=2) plot(ema3,title="ema3",color=color.black,linewidth=2) Buytrend = (ema1 and ema2 > ema3) and (ema1[1] and ema2[1] > ema3[1]) BarssinceBuyTrend = barssince(Buytrend) BarssinceSellTrend = barssince(not Buytrend) closeAtBuyTrend = close[1] bgcolor(Buytrend ? color.green : color.red,transp=70) BuySignal = Buytrend and not Buytrend[1] and BuySellSignal_Bool BuySignalOut = Buytrend and (crossunder(ema1,ema2)) and BuySellSignal_Bool BarssinceBuy = barssince(BuySignal) bgcolor(BuySignal ? color.green : na , transp=30) bgcolor(BuySignalOut ? color.black : na , transp=30) plot(BarssinceBuy,title="BarssinceBuy",display=display.none) SellSignal = not Buytrend and Buytrend[1] and BuySellSignal_Bool SellSignalOut = not Buytrend and (crossover(ema1,ema2)) and BuySellSignal_Bool BarssinceSell = barssince(SellSignal) bgcolor(SellSignal ? color.red : na , transp=30) bgcolor(SellSignalOut ? color.black : na , transp=30) plot(BarssinceSell,title="BarssinceSell",display=display.none) buyProfit = float(0) cntBuy =0 sellProfit = float(0) cntSell =0 buyProfit := Buytrend and not Buytrend[1]? nz(buyProfit[1]) + (close[BarssinceBuyTrend[1]]-close) : nz(buyProfit[1]) cntBuy := Buytrend and not Buytrend[1]? nz(cntBuy[1]) + 1: nz(cntBuy[1]) sellProfit := not Buytrend and Buytrend[1]? nz(sellProfit[1]) + (close-close[BarssinceSellTrend[1]]) : nz(sellProfit[1]) cntSell := not Buytrend and Buytrend[1]? nz(cntSell[1]) + 1 : nz(cntSell[1]) totalProfit = buyProfit + sellProfit // if (Buytrend and not Buytrend[1] and infoBox==true) // l = label.new(bar_index - (BarssinceBuyTrend[1]/2), na,text="Close = " + tostring(close) + "\n" + "Start = "+tostring(close[BarssinceBuyTrend[1]]) + "\n" + "Profit = "+tostring(close[BarssinceBuyTrend[1]]-close) ,style=label.style_labelup, yloc=yloc.belowbar,color=color.red,size=infoBoxSize) // if (not Buytrend and Buytrend[1] and infoBox==true) // l = label.new(bar_index - (BarssinceSellTrend[1]/2), na,text="Close = " + tostring(close) + "\n" + "Start = "+tostring(close[BarssinceSellTrend[1]]) + "\n" + "Profit = "+tostring(close-close[BarssinceSellTrend[1]]) ,style=label.style_labeldown, yloc=yloc.abovebar,color=color.green,size=infoBoxSize) // if (BuySignalOut and not BuySignalOut[1] and infoBox2==true) // // l = label.new(bar_index - (BarssinceBuy[0]/2), na,text="Close = " + tostring(close) + "\n" + "Start = "+tostring(close[BarssinceBuy[0]]) + "\n" + "Profit = "+tostring(close-close[BarssinceBuy[0]]) ,style=label.style_labelup, yloc=yloc.belowbar,color=color.purple,size=infoBoxSize // l = label.new(bar_index, na,text="Close = " + tostring(close) + "\n" + "Start = "+tostring(close[BarssinceBuy[0]]) + "\n" + "Profit = "+tostring(close-close[BarssinceBuy[0]]) ,style=label.style_labelup, yloc=yloc.belowbar,color=color.lime,size=infoBoxSize) // if (SellSignalOut and not SellSignalOut[1] and infoBox2==true) // // l = label.new(bar_index - (BarssinceSell[0]/2), na,text="Close = " + tostring(close) + "\n" + "Start = "+tostring(close[BarssinceSell[0]]) + "\n" + "Profit = "+tostring(close[BarssinceSell[0]]-close) ,style=label.style_labeldown, yloc=yloc.abovebar,color=color.purple,size=infoBoxSize) // l = label.new(bar_index, na,text="Close = " + tostring(close) + "\n" + "Start = "+tostring(close[BarssinceSell[0]]) + "\n" + "Profit = "+tostring(close[BarssinceSell[0]]-close) ,style=label.style_labeldown, yloc=yloc.abovebar,color=color.fuchsia,size=infoBoxSize) // l2 = label.new(bar_index, na, 'buyProfit in pip = '+tostring(buyProfit)+"\n"+ 'cntBuy = '+tostring(cntBuy) +"\n"+ 'sellProfit in pip = '+tostring(sellProfit)+"\n"+ 'cntSell = '+tostring(cntSell) +"\n"+ 'totalProfit in pip = '+tostring(totalProfit) , // color=totalProfit>0 ? color.green : color.red, // textcolor=color.white, // style=label.style_labeldown, yloc=yloc.abovebar, // size=size.large) // label.delete(l2[1]) //-------------------------------------------------- //-------------------------------------------------- if (Buytrend) strategy.close("short", comment = "Exit short") strategy.entry("long", true) strategy.exit("Max Loss", "long", loss = maxLoss) //if BuySignalOut // strategy.close("long", comment = "Exit Long") if (not Buytrend) // Enter trade and issue exit order on max loss. strategy.close("long", comment = "Exit Long") strategy.entry("short", false) strategy.exit("Max Loss", "short", loss = maxLoss) //if SellSignalOut // Force trade exit. //strategy.close("short", comment = "Exit short") //-------------------------------------------------- //-------------------------------------------------- //--------------------------------------------------