Strategi ini memanfaatkan prinsip crossover rata-rata bergerak ganda, menggabungkan indikator MACD untuk penilaian tren dan pencahayaan latar belakang silang, dan mengkonfirmasi entri dengan titik pola, bertujuan untuk menangkap tren jangka menengah di pasar. Logika utama adalah untuk masuk ketika arah rata-rata bergerak berubah, menonjolkan titik silang dengan warna latar belakang MACD, dan menentukan momentum dengan perubahan warna histogram MACD.
Strategi ini membangun rata-rata bergerak ganda menggunakan EMA cepat dan EMA lambat, dan menentukan arah tren berdasarkan persilangan antara garis cepat dan lambat.
Menurut kode, panjang jalur cepat adalah 12 dan panjang jalur lambat adalah 26, mewakili tren jangka pendek dan jangka panjang.
Logika silang:
trend_up = macd > sinyal: garis cepat melintasi garis lambat, menunjukkan tren naik jangka pendek
trend_dn = macd < sinyal: garis cepat melintasi di bawah garis lambat, menunjukkan tren penurunan jangka pendek
Deteksi titik silang:
cross_UP = sinyal[1] >= macd[1] dan sinyal < macd: garis cepat melintasi garis lambat dari bawah
cross_DN = sinyal[1] <= macd[1] dan sinyal > macd: garis cepat melintasi garis lambat dari atas
Perubahan warna histogram menentukan kekuatan momentum:
histA_IsUp = Kolom histogram meningkat dan lebih besar dari 0, momentum menguat dalam tren naik
histA_IsDown = Kolom histogram menurun tetapi masih lebih besar dari 0, momentum melemah dalam tren naik
Logika yang sama di bawah 0
Rata-rata bergerak ganda menentukan tren jangka menengah, hindari kebisingan jangka pendek
MACD membantu menilai tren jangka pendek dan momentum untuk keuntungan yang lebih tinggi
Perubahan warna histogram membantu mengidentifikasi waktu masuk yang lebih baik
Warna latar belakang crossover menyoroti sinyal
Periode rata-rata bergerak yang dapat disesuaikan sesuai dengan lingkungan pasar yang berbeda
Parameter MACD yang dapat disesuaikan mengoptimalkan indikator
Memberikan beberapa konfirmasi entri: tren, crossover, pola pecah
Dual MAs tidak sensitif terhadap fluktuasi jangka pendek, mungkin kehilangan peluang jangka pendek
Efek MACD yang buruk dengan pengaturan parameter yang tidak tepat, dapat menghasilkan sinyal palsu
Entri yang didasarkan hanya pada MAs dan MACD memiliki beberapa titik buta
Tidak ada mekanisme stop loss menghasilkan risiko peningkatan kerugian
Kurangnya pengelolaan uang yang ketat dan ukuran posisi
Solusi yang mungkin:
Menggabungkan indikator lain untuk menentukan rentang swing jangka pendek dan risiko kontrol
Mengoptimalkan parameter MACD dan menguji di pasar yang berbeda
Tambahkan pola, momentum dll untuk mengkonfirmasi sinyal
Menetapkan mekanisme stop loss untuk membatasi ukuran kerugian
Tambahkan modul manajemen uang ke ukuran posisi berdasarkan modal
Uji dan optimalkan kombinasi parameter MA untuk lebih banyak kemampuan adaptasi pasar
Cobalah jenis MA yang berbeda seperti VWAP, Bollinger midline dll.
Pertimbangkan volume perdagangan untuk menghindari breakout palsu
Masukkan RSI dll untuk mengkonfirmasi overbought/oversold
Membangun mekanisme stop loss yang kuat seperti trailing stop, volatility stop dll.
Menggabungkan ukuran posisi berdasarkan ukuran akun
Pertimbangkan pembelajaran mesin untuk optimasi parameter
Memperluas alam semesta strategi untuk pendekatan portofolio yang ditingkatkan
Strategi ini mengintegrasikan penyaringan tren rata-rata bergerak ganda dan momentum MACD, menambahkan fitur pola, membangun sistem perdagangan jangka menengah yang relatif stabil. Keuntungan utama terletak pada menangkap tren utama sambil menghindari kebisingan jangka pendek. Tetapi ada juga bidang yang dapat ditingkatkan, seperti menambahkan mekanisme stop loss dan manajemen risiko. Secara keseluruhan ini berfungsi sebagai contoh konseptual yang berharga, tetapi membutuhkan pengujian dan penyempurnaan yang komprehensif untuk perdagangan langsung.
/*backtest start: 2022-11-15 00:00:00 end: 2023-11-15 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy(title="Histogram MacD MVP_V2.1", shorttitle="Histogram MacD MVP_2.1") //Plot Inputs res = input.timeframe("", "Indicator TimeFrame") fast_length = input.int(title="Fast Length", defval=12) slow_length = input.int(title="Slow Length", defval=26) src = input.source(title="Source", defval=close) signal_length = input.int(title="Signal Smoothing", minval = 1, maxval = 999, defval = 9) sma_source = input.string(title="Oscillator MA Type", defval="EMA", options=["SMA", "EMA"]) sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"]) // Show Plots T/F show_macd = input.bool(true, title="Show MACD Lines", group="Show Plots?", inline="SP10") show_macd_LW = input.int(3, minval=0, maxval=5, title = "MACD Width", group="Show Plots?", inline="SP11") show_signal_LW= input.int(2, minval=0, maxval=5, title = "Signal Width", group="Show Plots?", inline="SP11") show_Hist = input.bool(true, title="Show Histogram", group="Show Plots?", inline="SP20") show_hist_LW = input.int(5, minval=0, maxval=5, title = "-- Width", group="Show Plots?", inline="SP20") show_trend = input.bool(true, title = "Show MACD Lines w/ Trend Color", group="Show Plots?", inline="SP30") show_HB = input.bool(false, title="Show Highlight Price Bars", group="Show Plots?", inline="SP40") show_cross = input.bool(false, title = "Show BackGround on Cross", group="Show Plots?", inline="SP50") show_dots = input.bool(true, title = "Show Circle on Cross", group="Show Plots?", inline="SP60") show_dots_LW = input.int(5, minval=0, maxval=5, title = "-- Width", group="Show Plots?", inline="SP60") //show_trend = input(true, title = "Colors MACD Lines w/ Trend Color", group="Show Plots?", inline="SP5") // MACD Lines colors col_macd = input.color(#FF6D00, "MACD Line ", group="Color Settings", inline="CS1") col_signal = input.color(#2962FF, "Signal Line ", group="Color Settings", inline="CS1") col_trnd_Up = input.color(#4BAF4F, "Trend Up ", group="Color Settings", inline="CS2") col_trnd_Dn = input.color(#B71D1C, "Trend Down ", group="Color Settings", inline="CS2") // Histogram Colors col_grow_above = input.color(#26A69A, "Above Grow", group="Histogram Colors", inline="Hist10") col_fall_above = input.color(#FF5252, "Fall", group="Histogram Colors", inline="Hist10") col_grow_below = input.color(#FF5252, "Below Grow", group="Histogram Colors", inline="Hist20") col_fall_below = input.color(#f8f524, "Fall", group="Histogram Colors", inline="Hist20") // Alerts T/F Inputs alert_Long = input.bool(true, title = "MACD Cross Up", group = "Alerts", inline="Alert10") alert_Short = input.bool(true, title = "MACD Cross Dn", group = "Alerts", inline="Alert10") alert_Long_A = input.bool(false, title = "MACD Cross Up & > 0", group = "Alerts", inline="Alert20") alert_Short_B = input.bool(false, title = "MACD Cross Dn & < 0", group = "Alerts", inline="Alert20") // Calculating fast_ma = request.security(syminfo.tickerid, res, sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length)) slow_ma = request.security(syminfo.tickerid, res, sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length)) macd = fast_ma - slow_ma signal = request.security(syminfo.tickerid, res, sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)) hist = macd - signal // MACD Trend and Cross Up/Down conditions trend_up = macd > signal trend_dn = macd < signal cross_UP = signal[1] >= macd[1] and signal < macd cross_DN = signal[1] <= macd[1] and signal > macd cross_UP_A = (signal[1] >= macd[1] and signal < macd) and macd > 0 cross_DN_B = (signal[1] <= macd[1] and signal > macd) and macd < 0 // Condition that changes Color of MACD Line if Show Trend is turned on.. trend_col = show_trend and trend_up ? col_trnd_Up : trend_up ? col_macd : show_trend and trend_dn ? col_trnd_Dn: trend_dn ? col_macd : na //Var Statements for Histogram Color Change var bool histA_IsUp = false var bool histA_IsDown = false var bool histB_IsDown = false var bool histB_IsUp = false histA_IsUp := hist == hist[1] ? histA_IsUp[1] : hist > hist[1] and hist > 0 histA_IsDown := hist == hist[1] ? histA_IsDown[1] : hist < hist[1] and hist > 0 histB_IsDown := hist == hist[1] ? histB_IsDown[1] : hist < hist[1] and hist <= 0 histB_IsUp := hist == hist[1] ? histB_IsUp[1] : hist > hist[1] and hist <= 0 hist_col = histA_IsUp ? col_grow_above : histA_IsDown ? col_fall_above : histB_IsDown ? col_grow_below : histB_IsUp ? col_fall_below :color.silver // Plot Statements //Background Color bgcolor(show_cross and cross_UP ? col_trnd_Up : na, editable=false) bgcolor(show_cross and cross_DN ? col_trnd_Dn : na, editable=false) //Highlight Price Bars barcolor(show_HB and trend_up ? col_trnd_Up : na, title="Trend Up", offset = 0, editable=false) barcolor(show_HB and trend_dn ? col_trnd_Dn : na, title="Trend Dn", offset = 0, editable=false) //Regular Plots plot(show_Hist and hist ? hist : na, title="Histogram", style=plot.style_columns, color=color.new(hist_col ,0),linewidth=show_hist_LW) plot(show_macd and signal ? signal : na, title="Signal", color=color.new(col_signal, 0), style=plot.style_line ,linewidth=show_signal_LW) plot(show_macd and macd ? macd : na, title="MACD", color=color.new(trend_col, 0), style=plot.style_line ,linewidth=show_macd_LW) hline(0, title="0 Line", color=color.new(color.gray, 0), linestyle=hline.style_dashed, linewidth=1, editable=false) plot(show_dots and cross_UP ? macd : na, title="Dots", color=color.new(trend_col ,0), style=plot.style_circles, linewidth=show_dots_LW, editable=false) plot(show_dots and cross_DN ? macd : na, title="Dots", color=color.new(trend_col ,0), style=plot.style_circles, linewidth=show_dots_LW, editable=false) //Alerts if alert_Long and cross_UP alert("Symbol = (" + syminfo.tickerid + ") TimeFrame = (" + timeframe.period + ") Current Price (" + str.tostring(close) + ") MACD Crosses Up.", alert.freq_once_per_bar_close) if alert_Short and cross_DN alert("Symbol = (" + syminfo.tickerid + ") TimeFrame = (" + timeframe.period + ") Current Price (" + str.tostring(close) + ") MACD Crosses Down.", alert.freq_once_per_bar_close) //Alerts - Stricter Condition - Only Alerts When MACD Crosses UP & MACD > 0 -- Crosses Down & MACD < 0 if alert_Long_A and cross_UP_A alert("Symbol = (" + syminfo.tickerid + ") TimeFrame = (" + timeframe.period + ") Current Price (" + str.tostring(close) + ") MACD > 0 And Crosses Up.", alert.freq_once_per_bar_close) if alert_Short_B and cross_DN_B alert("Symbol = (" + syminfo.tickerid + ") TimeFrame = (" + timeframe.period + ") Current Price (" + str.tostring(close) + ") MACD < 0 And Crosses Down.", alert.freq_once_per_bar_close) if (histA_IsUp) strategy.entry("buy", strategy.long, comment="buy") if (histA_IsDown) strategy.entry("sell", strategy.short, comment="sell")