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.
Komponen utama adalah:
MACD: menilai perubahan momentum harga.
EMA: Menentukan arah tren harga.
Kondisi waktu: Mendefinisikan periode strategi yang valid.
Pilihan panjang/pendek: Memilih arah panjang atau pendek.
Aturan perdagangan adalah:
Long/exit short: Ketika dekat di atas EMA, histogram MACD positif, dan lilin saat ini lebih tinggi dari lilin sebelumnya.
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.
Dibandingkan dengan indikator tunggal, keuntungan utama adalah:
MACD menilai momentum jangka pendek, EMA menentukan arah tren.
Aturan sederhana dan jelas, mudah dimengerti dan diterapkan.
Pengaturan parameter yang fleksibel untuk produk dan jangka waktu yang berbeda.
Opsi untuk perdagangan hanya panjang/pendek atau bidirectional.
Dapat mendefinisikan periode strategi yang valid untuk menghindari perdagangan yang tidak perlu.
Kinerja yang stabil selama bertahun-tahun.
Risiko yang dapat dikontrol per perdagangan.
Potensi untuk mengoptimalkan lebih lanjut dengan pembelajaran mesin.
Meskipun manfaatnya, risiko untuk mempertimbangkan:
Penyesuaian parameter luas berisiko overfitting.
Tidak berhenti di tempat, risiko kerugian tak terbatas.
Tidak ada filter volume, risiko kebocoran palsu.
Lag dalam menangkap tren memutar, tidak bisa menghindari semua kerugian.
penurunan kinerja akibat perubahan rezim pasar.
Berdasarkan data historis saja, keandalan model adalah kunci.
Frekuensi perdagangan yang tinggi meningkatkan biaya transaksi.
Perlu memantau rasio reward/risiko dan kurva ekuitas.
Strategi dapat ditingkatkan dengan:
Menambahkan filter volume untuk menghindari kebocoran palsu.
Mengimplementasikan stop untuk mengendalikan kerugian per perdagangan.
Mengevaluasi efektivitas parameter di berbagai periode waktu.
Mengintegrasikan pembelajaran mesin untuk optimasi dinamis.
Pengujian ketahanan di seluruh pasar.
Mengatur ukuran posisi untuk mengurangi frekuensi.
Mengoptimalkan strategi manajemen risiko.
Uji instrumen penyebaran untuk meningkatkan frekuensi.
Pengujian backtesting terus menerus untuk mencegah overfitting.
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)