Tren Mengikuti Strategi Berdasarkan Garis EMA

Penulis:ChaoZhang, Tanggal: 2024-02-05 14:21:18
Tag:

img

Gambaran umum

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.

Logika Strategi

Strategi ini menggunakan 3 garis EMA, yang masing-masing 10 hari, 20 hari dan 50 hari.

  1. Bila kedua EMA 10 hari dan EMA 20 hari berada di atas EMA 50 hari, hal ini didefinisikan sebagai uptrend;

  2. Bila kedua EMA 10 hari dan EMA 20 hari berada di bawah EMA 50 hari, itu didefinisikan sebagai downtrend;

  3. Ketika garis EMA jangka pendek (10 hari dan 20 hari) melintasi di atas garis EMA jangka panjang (50 hari), sinyal beli dihasilkan;

  4. Ketika garis EMA jangka pendek (10 hari dan 20 hari) melintasi di bawah garis EMA jangka panjang (50 hari), sinyal jual dihasilkan;

  5. Menjaga posisi panjang selama tren naik dan memegang posisi pendek selama tren turun;

  6. 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.

Analisis Keuntungan

Keuntungan dari strategi ini adalah:

  1. Peraturan sederhana dan jelas, mudah dimengerti dan diterapkan;
  2. Menggunakan garis EMA untuk menentukan tren menghindari gangguan dari fluktuasi pasar jangka pendek;
  3. Penutupan posisi tepat waktu untuk melacak trend runs menghindari ekspansi kerugian;
  4. Tidak perlu memprediksi arah pasar dengan tingkat kemenangan tinggi dengan melacak tren.

Analisis Risiko

Ada juga beberapa risiko dalam strategi ini:

  1. Selama pasar yang terikat kisaran, garis EMA dapat sering bersilang, menghasilkan biaya perdagangan yang tinggi dari posisi pembukaan dan penutupan yang sering;

  2. Penentuan tren oleh EMA mungkin gagal setelah kesenjangan harga, kehilangan peluang masuk yang baik.

Untuk mengoptimalkan risiko, beberapa metode dapat digunakan:

  1. Aturan posisi terbuka dapat dipermudah dengan baik ketika EMA dekat untuk menghindari over-trading;

  2. Tentukan tren dengan menggabungkan indikator lain untuk menghindari kegagalan EMA.

Arahan Optimasi

Strategi dapat dioptimalkan dari aspek berikut:

  1. Optimasi parameter: Uji kombinasi periode EMA yang berbeda untuk menemukan parameter optimal;

  2. Optimalisasi biaya perdagangan. Optimalkan aturan posisi terbuka dengan benar untuk mengurangi perdagangan sering yang tidak perlu;

  3. Optimasi strategi stop loss. Atur tingkat stop loss yang wajar untuk mengontrol kerugian tunggal;

  4. Menggabungkan indikator lain. Gunakan MACD, KDJ dan indikator lain untuk membantu menentukan waktu masuk yang optimal.

Ringkasan

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")
    
//--------------------------------------------------
//--------------------------------------------------
//--------------------------------------------------



Lebih banyak