Strategi ini menggabungkan sinyal golden cross dan dead cross indikator MACD, hubungan harga penutupan dengan garis median, dan karakteristik volatilitas harga untuk menentukan titik masuk dan keluar.
Strategi ini didasarkan pada prinsip-prinsip berikut:
Gunakan garis cepat MACD dan garis lambat golden cross dan dead cross untuk menentukan pasar bull dan bear dan titik masuk tertentu.
Gunakan hubungan harga penutupan dengan garis median untuk menentukan akhir tren dan titik keluar.
Menetapkan mekanisme re-entry untuk kembali memasuki pasar ke arah yang sama setelah akhir tren MACD saat ini untuk meningkatkan keuntungan.
Menetapkan mekanisme entri koreksi untuk menambahkan posisi selama koreksi harga parsial dalam tren.
Secara dinamis menyesuaikan posisi berdasarkan hal di atas untuk memaksimalkan keuntungan dalam tren sambil keluar dengan cepat ketika tren berakhir.
Secara khusus, strategi ini terlebih dahulu memeriksa apakah ada golden cross atau dead cross yang terjadi antara garis cepat dan lambat MACD untuk pergi panjang atau pendek.
Selain itu, strategi ini memiliki mekanisme re-entry untuk membuka kembali posisi ke arah awal jika MACD terus menunjukkan sinyal ke arah yang sama setelah tren awal berakhir.
Melalui pengaturan ini, strategi dapat secara dinamis menyesuaikan posisi, meningkatkan frekuensi masuk dan keluar, dan memaksimalkan pengembalian sambil mengendalikan risiko dalam tren.
Keuntungan utama dari strategi multi-indikator ini adalah:
MACD mengidentifikasi tren dan titik pembalikan untuk masuk.
Hubungan harga penutupan dan garis median secara akurat menentukan akhir tren.
Re-entry meningkatkan efisiensi pemanfaatan modal.
Koreksi entri tepat waktu menambahkan posisi untuk menangkap tren.
Frekuensi perdagangan yang tinggi dengan risiko yang terkontrol menghasilkan faktor keuntungan yang tinggi.
Parameter yang dapat disesuaikan untuk optimasi di berbagai produk dan pasar.
Logika yang jelas dan kode yang ringkas untuk perdagangan langsung yang mudah.
Data backtest yang cukup memastikan keandalan.
Risiko utama adalah:
Kemungkinan sinyal MACD yang salah perlu diverifikasi dengan indikator lain.
Stop yang terlalu ketat bisa dihentikan oleh gerakan yang tidak stabil.
Peningkatan frekuensi perdagangan membutuhkan pengendalian pemanfaatan modal.
Entri koreksi dapat menyebabkan kerugian selama penarikan.
Optimasi yang diperlukan untuk produk dan pasar yang berbeda.
Membutuhkan backtesting dan optimasi yang berkelanjutan.
Biaya slippage perlu dipertimbangkan untuk perdagangan langsung.
Langkah-langkah manajemen risiko termasuk menggunakan stop untuk membatasi kerugian, mengevaluasi pemanfaatan modal, mengoptimalkan parameter per produk melalui backtesting, memantau dinamika pasar untuk memperbaiki parameter, dan memperhitungkan slippage dalam tes.
Peluang peningkatan:
Tambahkan indikator lain untuk memverifikasi sinyal, misalnya KDJ.
Mengimplementasikan adaptif berhenti dinamis.
Mengoptimalkan masuk kembali dan koreksi masuk logika.
Optimasi parameter per produk.
Mengoptimalkan pemanfaatan modal untuk entri.
Masukkan indikator volume untuk menghindari kerugian dari entri mundur.
Tambahkan mekanisme keluar seperti berhenti bergerak.
Bangun robot perdagangan otomatis.
Perhitungkan faktor dunia nyata seperti slippage.
Ini dapat lebih meningkatkan stabilitas, kemampuan beradaptasi, otomatisasi, dan kinerja langsung.
Strategi ini mengintegrasikan sinyal MACD, analisis harga penutupan, dan beberapa mekanisme entri untuk memaksimalkan tren sambil mengendalikan risiko.
/*backtest start: 2023-09-29 00:00:00 end: 2023-10-29 00:00:00 period: 2h basePeriod: 15m 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/ // © Puckapao //@version=4 // strategy(title="MACD", shorttitle="MACD", overlay=true, initial_capital=10000.00, currency="USD", default_qty_type=strategy.cash, default_qty_value=10000.00) // Getting inputs reenter_delay = input(title="Re-enter Delay", type=input.integer, defval=2) sculp_delay = input(title="Sculp Delay", type=input.integer, defval=4) fast_length = input(title="Fast Length", type=input.integer, defval=12) slow_length = input(title="Slow Length", type=input.integer, defval=26) src = input(title="Source", type=input.source, defval=close) 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=true) ema_period = input(title="EMA Period", type=input.integer, defval=21) // Get date startDate = input(title="Start Date", type=input.integer, defval=19, minval=1, maxval=31) startMonth = input(title="Start Month", type=input.integer, defval=09, minval=1, maxval=12) startYear = input(title="Start Year", type=input.integer, defval=2017, minval=1800, maxval=2100) endDate = input(title="End Date", type=input.integer, defval=31, minval=1, maxval=31) endMonth = input(title="End Month", type=input.integer, defval=3, minval=1, maxval=12) endYear = input(title="End Year", type=input.integer, defval=2021, minval=1800, maxval=2100) // STEP 2: // Look if the close time of the current bar // falls inside the date range inDateRange = true reenter_cnt = 0 reenter_cnt := nz(reenter_cnt[1]) sculp_cnt = 0 sculp_cnt := nz(sculp_cnt[1]) close_cnt = 0 close_cnt := nz(close_cnt[1]) on_long = false on_long := nz(on_long[1]) on_short = false on_short := nz(on_short[1]) sculp = false reenter = false slowdown = false ema = ema(close, ema_period) // Plot colors col_grow_above = #26A69A col_grow_below = #FFCDD2 col_fall_above = #B2DFDB col_fall_below = #EF5350 col_macd = #0094ff col_signal = #ff6a00 // 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 // plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 ) // plot(macd, title="MACD", color=col_macd, transp=0) // plot(signal, title="Signal", color=col_signal, transp=0) cross_up = crossover(macd, signal) cross_down = crossunder(macd, signal) if (inDateRange) over_macd = macd > 0 and signal > 0 ? true : false under_macd = macd < 0 and signal < 0 ? true : false over_water = close > ema ? true : false under_water = close < ema ? true : false slowdown := hist >= 0 ? (hist[1] > hist ? true : false) : (hist[1] > hist ? false : true) reenter := hist >= 0 ? (hist[1] < hist ? true : false) : (hist[1] > hist ? true : false) sculp := (hist >= 0 ? (hist[1] > hist ? true : false) : (hist[1] < hist ? true : false)) if(reenter == true) if(reenter_cnt < reenter_delay) reenter_cnt := reenter_cnt + 1 else if(reenter_cnt > 0) reenter_cnt := reenter_cnt - 1 if(sculp == true) if(sculp_cnt < sculp_delay) sculp_cnt := sculp_cnt + 1 else if(sculp_cnt > 0) sculp_cnt := sculp_cnt - 1 if(slowdown == false) if(close_cnt < 2) close_cnt := close_cnt + 1 else close_cnt := 0 // plotchar(fork_cnt, "fork count", "") // plotchar(spoon_cnt, "spoon count", "") // Entry if (cross_up == true) strategy.entry("long", strategy.long, comment = "long", alert_message = "long") on_long := true on_short := false if (cross_down == true) strategy.entry("short", strategy.short, comment = "short", alert_message = "short") on_short := true on_long := false // Sculp bottom / top if (sculp == true and sculp_cnt >= sculp_delay) if (hist >= 0) strategy.entry("sculp-short", strategy.short, comment = "sculp-short", alert_message = "sculp-short") else strategy.entry("sculp-long", strategy.long, comment = "sculp-long", alert_message = "sculp-long") sculp_cnt := 0 sculp := false // Re-Entry if (reenter == true and reenter_cnt >= reenter_delay) if (hist >= 0) strategy.entry("re-long", strategy.long, comment = "re-long", alert_message = "re-long") else strategy.entry("re-short", strategy.short, comment = "re-short", alert_message = "re-short") reenter_cnt := 0 reenter := false // Close strategy.close("long", when = slowdown, comment = "close long", alert_message = "close long") strategy.close("short", when = slowdown, comment = "close short", alert_message = "close short") strategy.close("re-long", when = slowdown, comment = "close re-long", alert_message = "close re-long") strategy.close("re-short", when = slowdown, comment = "close re-short", alert_message = "close re-short") strategy.close("sculp-long", when = slowdown, comment = "close sculp-long", alert_message = "close sculp-long") strategy.close("sculp-short", when = slowdown, comment = "close sculp-short", alert_message = "close sculp-short") if (slowdown) if (hist >= 0) on_long := false else on_short := false plotchar(slowdown, "close", "") plotchar(reenter, "reenter", "") plotchar(reenter_cnt, "reenter count", "") plotchar(sculp, "sculp", "") plotchar(sculp_cnt, "sculp count", "")