Strategi ini adalah berdasarkan 3 garis EMA dari tempoh yang berbeza. Ia menilai arah trend semasa dengan sama ada harga berada di atas garis EMA. Apabila garis EMA jangka pendek melintasi di atas garis EMA jangka panjang, isyarat beli dihasilkan. Apabila garis EMA jangka pendek melintasi di bawah garis EMA jangka panjang, isyarat jual dihasilkan. Strategi ini mengesan arah trend dan menutup kedudukan tepat pada masanya apabila trend berbalik.
Strategi ini menggunakan 3 garis EMA, yang masing-masing 10 hari, 20 hari dan 50 hari.
Apabila kedua-dua EMA 10 hari dan EMA 20 hari berada di atas EMA 50 hari, ia ditakrifkan sebagai aliran menaik;
Apabila kedua-dua EMA 10 hari dan EMA 20 hari berada di bawah EMA 50 hari, ia ditakrifkan sebagai aliran menurun;
Apabila garis EMA jangka pendek (10 hari dan 20 hari) melintasi di atas garis EMA jangka panjang (50 hari), isyarat beli dihasilkan;
Apabila garis EMA jangka pendek (10 hari dan 20 hari) melintasi di bawah garis EMA jangka panjang (50 hari), isyarat jual dihasilkan;
Mengekalkan kedudukan panjang semasa trend menaik dan memegang kedudukan pendek semasa trend menurun;
Tutup kedudukan arah semasa apabila trend berbalik (EMA jangka pendek menyeberangi EMA jangka panjang).
Strategi ini menangkap keuntungan dengan menutup kedudukan tepat pada masanya untuk mengunci keuntungan dan bergantian antara kedudukan panjang dan pendek.
Kelebihan strategi ini ialah:
Terdapat juga beberapa risiko dalam strategi ini:
Semasa pasaran terhad julat, garis EMA boleh bersilang dengan kerap, mengakibatkan kos dagangan yang tinggi dari kedudukan pembukaan dan penutupan yang kerap;
Penentuan trend oleh EMA mungkin gagal selepas jurang harga, kehilangan peluang kemasukan yang baik.
Untuk mengoptimumkan risiko, beberapa kaedah boleh digunakan:
Peraturan kedudukan terbuka boleh disederhanakan dengan betul apabila EMA hampir untuk mengelakkan perdagangan berlebihan;
Menentukan trend menggabungkan penunjuk lain untuk mengelakkan kegagalan EMA.
Strategi ini boleh dioptimumkan dari aspek berikut:
Pengoptimuman parameter. Uji gabungan tempoh EMA yang berbeza untuk mencari parameter optimum;
Pengoptimuman kos dagangan. Mengoptimumkan peraturan kedudukan terbuka dengan betul untuk mengurangkan perdagangan kerap yang tidak perlu;
Mengoptimumkan strategi stop loss. Tetapkan tahap stop loss yang munasabah untuk mengawal kerugian tunggal;
Menggabungkan penunjuk lain. Gunakan MACD, KDJ dan penunjuk lain untuk membantu menentukan masa kemasukan yang optimum.
Secara umum, strategi ini agak mudah dan praktikal. Ia menggunakan EMA untuk menentukan arah trend dengan strategi stop loss yang betul untuk mengawal risiko dengan berkesan. Terdapat juga ruang untuk pengoptimuman. Dengan menggabungkan pengoptimuman parameter, strategi stop loss dan penunjuk lain, prestasi strategi ini dapat ditingkatkan lagi.
/*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") //-------------------------------------------------- //-------------------------------------------------- //--------------------------------------------------