Trend Mengikut Strategi Berdasarkan Garis EMA

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

img

Ringkasan

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.

Logika Strategi

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

  1. Apabila kedua-dua EMA 10 hari dan EMA 20 hari berada di atas EMA 50 hari, ia ditakrifkan sebagai aliran menaik;

  2. Apabila kedua-dua EMA 10 hari dan EMA 20 hari berada di bawah EMA 50 hari, ia ditakrifkan sebagai aliran menurun;

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

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

  5. Mengekalkan kedudukan panjang semasa trend menaik dan memegang kedudukan pendek semasa trend menurun;

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

Analisis Kelebihan

Kelebihan strategi ini ialah:

  1. Peraturan adalah mudah dan jelas, mudah difahami dan dilaksanakan;
  2. Menggunakan garis EMA untuk menentukan trend mengelakkan gangguan daripada turun naik pasaran jangka pendek;
  3. Penutupan kedudukan tepat pada masanya untuk mengesan trend berjalan mengelakkan kerugian yang berkembang;
  4. Tidak perlu meramalkan hala tuju pasaran dengan kadar kemenangan yang tinggi dengan mengesan trend.

Analisis Risiko

Terdapat juga beberapa risiko dalam strategi ini:

  1. Semasa pasaran terhad julat, garis EMA boleh bersilang dengan kerap, mengakibatkan kos dagangan yang tinggi dari kedudukan pembukaan dan penutupan yang kerap;

  2. Penentuan trend oleh EMA mungkin gagal selepas jurang harga, kehilangan peluang kemasukan yang baik.

Untuk mengoptimumkan risiko, beberapa kaedah boleh digunakan:

  1. Peraturan kedudukan terbuka boleh disederhanakan dengan betul apabila EMA hampir untuk mengelakkan perdagangan berlebihan;

  2. Menentukan trend menggabungkan penunjuk lain untuk mengelakkan kegagalan EMA.

Arahan pengoptimuman

Strategi ini boleh dioptimumkan dari aspek berikut:

  1. Pengoptimuman parameter. Uji gabungan tempoh EMA yang berbeza untuk mencari parameter optimum;

  2. Pengoptimuman kos dagangan. Mengoptimumkan peraturan kedudukan terbuka dengan betul untuk mengurangkan perdagangan kerap yang tidak perlu;

  3. Mengoptimumkan strategi stop loss. Tetapkan tahap stop loss yang munasabah untuk mengawal kerugian tunggal;

  4. Menggabungkan penunjuk lain. Gunakan MACD, KDJ dan penunjuk lain untuk membantu menentukan masa kemasukan yang optimum.

Ringkasan

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



Lebih lanjut