Sumber dimuat naik... memuat...

Osilator MACD dengan Strategi Crossover EMA

Penulis:ChaoZhang, Tarikh: 2023-09-23 15:24:12
Tag:

Ringkasan

Ini adalah strategi dagangan yang mudah namun cekap yang menggabungkan osilator MACD dan persilangan EMA. Pada masa ini ditubuhkan untuk lilin 4h tetapi dapat disesuaikan dengan jangka masa lain. Ia telah melakukan dengan baik pada BTC dan ETH selama 3 tahun yang lalu, mengalahkan beli dan pegang. Dengan pengoptimuman ia boleh disesuaikan untuk niaga hadapan, indeks, forex, saham dll.

Logika Strategi

Komponen utama ialah:

  1. MACD: menilai perubahan momentum harga.

  2. EMA: Menentukan arah trend harga.

  3. Keadaan masa: Menentukan tempoh strategi yang sah.

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

Peraturan perdagangan adalah:

  1. Long / keluar pendek: Apabila dekat di atas EMA, histogram MACD positif, dan lilin semasa lebih tinggi daripada lilin sebelumnya.

  2. Pendek / keluar panjang: Apabila ditutup di bawah EMA, histogram MACD negatif, dan lilin semasa lebih rendah daripada lilin sebelumnya.

Strategi ini menggabungkan trend berikut dan momentum dalam sistem yang mudah dan cekap.

Kelebihan

Berbanding dengan penunjuk tunggal, kelebihan utama adalah:

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

  2. Peraturan yang mudah dan jelas, mudah difahami dan dilaksanakan.

  3. Penyesuaian parameter yang fleksibel untuk produk dan jangka masa yang berbeza.

  4. Pilihan untuk perdagangan panjang/pendek sahaja atau dua arah.

  5. Boleh menentukan tempoh strategi yang sah untuk mengelakkan perdagangan yang tidak perlu.

  6. Prestasi yang stabil selama bertahun-tahun.

  7. Risiko yang boleh dikawal setiap perdagangan.

  8. Potensi untuk mengoptimumkan lebih lanjut dengan pembelajaran mesin.

Risiko

Walaupun ada kelebihan, risiko untuk mempertimbangkan:

  1. Penyesuaian parameter yang luas berisiko terlalu banyak.

  2. Tiada hentian di tempat, risiko kerugian tidak terhad.

  3. Tiada penapis kelantangan, risiko kebocoran palsu.

  4. Lag dalam menangkap trend bertukar, tidak boleh mengelakkan semua kerugian.

  5. Penurunan prestasi akibat perubahan rejim pasaran.

  6. Berdasarkan data sejarah sahaja, ketahanan model adalah kunci.

  7. Frekuensi perdagangan yang tinggi meningkatkan kos transaksi.

  8. Perlu memantau nisbah ganjaran / risiko dan lengkung ekuiti.

Peningkatan

Strategi ini boleh ditingkatkan dengan:

  1. Menambah penapis kelantangan untuk mengelakkan gangguan palsu.

  2. Menerapkan henti untuk mengawal kerugian setiap perdagangan.

  3. Penilaian keberkesanan parameter merentasi tempoh masa.

  4. Menggabungkan pembelajaran mesin untuk pengoptimuman dinamik.

  5. Ujian ketahanan di seluruh pasaran.

  6. Mengatur saiz kedudukan untuk mengurangkan kekerapan.

  7. Mengoptimumkan strategi pengurusan risiko.

  8. Ujian instrumen penyebaran untuk meningkatkan kekerapan.

  9. Pengujian semula berterusan untuk mengelakkan pemasangan berlebihan.

Kesimpulan

Ringkasnya, strategi ini membentuk sistem yang mudah namun kuat dari gabungan MACD dan EMA. Tetapi pengoptimuman berterusan dan ujian ketahanan adalah penting untuk mana-mana strategi untuk menyesuaikan diri dengan keadaan pasaran yang berubah. 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 lanjut