Osilator MACD dengan Strategi Crossover EMA

Penulis:ChaoZhang, Tanggal: 2023-09-23
Tag:

Gambaran umum

Ini adalah strategi trading yang sederhana namun efisien yang menggabungkan osilator MACD dan crossover EMA. Saat ini diatur untuk lilin 4h tetapi dapat disesuaikan dengan kerangka waktu lain. Ini telah berkinerja baik pada BTC dan ETH selama 3 tahun terakhir, mengalahkan beli dan tahan. Dengan optimasi dapat disesuaikan untuk berjangka, indeks, forex, saham dll.

Logika Strategi

Komponen utama adalah:

  1. MACD: menilai perubahan momentum harga.

  2. EMA: Menentukan arah tren harga.

  3. Kondisi waktu: Mendefinisikan periode strategi yang valid.

  4. Pilihan panjang/pendek: Memilih arah panjang atau pendek.

Aturan perdagangan adalah:

  1. Long/exit short: Ketika dekat di atas EMA, histogram MACD positif, dan lilin saat ini lebih tinggi dari lilin sebelumnya.

  2. Short/exit long: Ketika ditutup di bawah EMA, histogram MACD negatif, dan lilin saat ini lebih rendah dari lilin sebelumnya.

Strategi ini menggabungkan trend berikut dan momentum dalam sistem yang sederhana dan efisien.

Keuntungan

Dibandingkan dengan indikator tunggal, keuntungan utama adalah:

  1. MACD menilai momentum jangka pendek, EMA menentukan arah tren.

  2. Aturan sederhana dan jelas, mudah dimengerti dan diterapkan.

  3. Pengaturan parameter yang fleksibel untuk produk dan jangka waktu yang berbeda.

  4. Opsi untuk perdagangan hanya panjang/pendek atau bidirectional.

  5. Dapat mendefinisikan periode strategi yang valid untuk menghindari perdagangan yang tidak perlu.

  6. Kinerja yang stabil selama bertahun-tahun.

  7. Risiko yang dapat dikontrol per perdagangan.

  8. Potensi untuk mengoptimalkan lebih lanjut dengan pembelajaran mesin.

Risiko

Meskipun manfaatnya, risiko untuk mempertimbangkan:

  1. Penyesuaian parameter luas berisiko overfitting.

  2. Tidak berhenti di tempat, risiko kerugian tak terbatas.

  3. Tidak ada filter volume, risiko kebocoran palsu.

  4. Lag dalam menangkap tren memutar, tidak bisa menghindari semua kerugian.

  5. penurunan kinerja akibat perubahan rezim pasar.

  6. Berdasarkan data historis saja, keandalan model adalah kunci.

  7. Frekuensi perdagangan yang tinggi meningkatkan biaya transaksi.

  8. Perlu memantau rasio reward/risiko dan kurva ekuitas.

Peningkatan

Strategi dapat ditingkatkan dengan:

  1. Menambahkan filter volume untuk menghindari kebocoran palsu.

  2. Mengimplementasikan stop untuk mengendalikan kerugian per perdagangan.

  3. Mengevaluasi efektivitas parameter di berbagai periode waktu.

  4. Mengintegrasikan pembelajaran mesin untuk optimasi dinamis.

  5. Pengujian ketahanan di seluruh pasar.

  6. Mengatur ukuran posisi untuk mengurangi frekuensi.

  7. Mengoptimalkan strategi manajemen risiko.

  8. Uji instrumen penyebaran untuk meningkatkan frekuensi.

  9. Pengujian backtesting terus menerus untuk mencegah overfitting.

Kesimpulan

Secara singkat, strategi ini membentuk sistem sederhana namun kuat dari kombinasi MACD dan EMA. Tetapi optimasi terus menerus dan pengujian ketahanan sangat penting bagi setiap strategi untuk beradaptasi dengan perubahan kondisi pasar. Strategi perdagangan perlu terus berkembang.


// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © SoftKill21

//@version=4
strategy("My Script", overlay=true)

//heiking ashi calculation
UseHAcandles    = input(false, title="Use Heikin Ashi Candles in Algo Calculations")
//
// === /INPUTS ===

// === BASE FUNCTIONS ===

haClose = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, close) : close
haOpen  = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, open) : open
haHigh  = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, high) : high
haLow   = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, low) : low

//timecondition
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2020, title = "From Year", minval = 1970)
 //monday and session 
 
// To Date Inputs
toDay = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2021, title = "To Year", minval = 1970)

startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = true

//ema data  -- moving average
len = input(9, minval=1, title="Length")
src = input(hl2, title="Source")
out = ema(src, len)
//plot(out, title="EMA", color=color.blue)

//histogram
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA (Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA (Signal Line)", type=input.bool, defval=false)

// Calculating
fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal


//main variables to apply conditions are going to be out(moving avg) and hist(macd)

long = haClose > out and haClose > haClose[1] and out > out[1] and hist> 0 and hist[1] < 0 and time_cond
short = haClose < out and haClose < haClose[1] and out < out[1] and hist < 0 and hist[1] > 0 and time_cond

//limit to 1 entry
var longOpeneda = false
var shortOpeneda = false
var int timeOfBuya = na



longCondition= long and not longOpeneda 

if longCondition
    longOpeneda := true
    timeOfBuya := time


longExitSignala = short
exitLongCondition = longOpeneda[1] and longExitSignala

if exitLongCondition
    longOpeneda := false
    timeOfBuya := na


plotshape(longCondition, style=shape.labelup, location=location.belowbar, color=color.green, size=size.tiny, title="BUY", text="BUY", textcolor=color.white)
plotshape(exitLongCondition, style=shape.labeldown, location=location.abovebar, color=color.red, size=size.tiny, title="SELL", text="SELL", textcolor=color.white)

//automatization

longEntry= input(true)
shortEntry=input(false)

if(longEntry)
    strategy.entry("long",strategy.long,when=longCondition)
    strategy.close("long",when=exitLongCondition)

if(shortEntry)
    strategy.entry("short",strategy.short,when=exitLongCondition)
    strategy.close("short",when=longCondition)



Lebih banyak