Strategi ini menggunakan prinsip crossover purata bergerak berganda, menggabungkan penunjuk MACD untuk penghakiman trend dan pencahayaan latar belakang silang, dan mengesahkan entri dengan titik corak, bertujuan untuk menangkap trend jangka pertengahan di pasaran. Logik utama adalah untuk memasuki apabila arah purata bergerak berubah, menonjolkan titik silang dengan warna latar belakang MACD, dan menentukan momentum dengan perubahan warna histogram MACD.
Strategi ini membina purata bergerak berganda menggunakan EMA pantas dan EMA perlahan, dan menentukan arah trend berdasarkan persilangan antara garis pantas dan perlahan. Ia juga mengira MACD dan Isyarat, dan merangka perbezaan mereka sebagai histogram.
Menurut kod, panjang garis cepat adalah 12 dan panjang garis perlahan adalah 26, mewakili trend jangka pendek dan jangka panjang.
Logika silang:
trend_up = macd > isyarat: garis pantas melintasi di atas garis perlahan, menunjukkan trend menaik jangka pendek
trend_dn = macd < isyarat: garis pantas melintasi di bawah garis perlahan, menunjukkan trend menurun jangka pendek
Pengesanan titik silang:
cross_UP = isyarat[1] >= macd[1] dan isyarat < macd: garis pantas melintasi garis perlahan dari bawah
cross_DN = isyarat[1] <= macd[1] dan isyarat > macd: garisan pantas melintasi garisan perlahan dari atas
Perubahan warna histogram menentukan kekuatan momentum:
histA_IsUp = Kolom histogram meningkat dan lebih besar daripada 0, momentum menguatkan dalam trend menaik
histA_IsDown = Kolom histogram menurun tetapi masih lebih besar daripada 0, momentum melemah dalam trend menaik
Logik yang sama di bawah 0.
Purata bergerak berganda menentukan trend jangka menengah, mengelakkan bunyi jangka pendek
MACD membantu menilai trend jangka pendek dan momentum untuk keuntungan yang lebih tinggi
Perubahan warna histogram membantu mengenal pasti masa kemasukan yang lebih baik
Warna latar belakang silang menonjolkan isyarat
Tempoh purata bergerak yang boleh disesuaikan sesuai dengan persekitaran pasaran yang berbeza
Parameter MACD yang boleh diselaraskan mengoptimumkan penunjuk
Menyediakan pengesahan kemasukan berbilang: trend, silang, corak pecah
Dual MA tidak sensitif terhadap turun naik jangka pendek, mungkin terlepas peluang jangka pendek
Kesan MACD yang lemah dengan tetapan parameter yang tidak betul, boleh menghasilkan isyarat palsu
Entri yang berasaskan hanya pada MAs dan MACD mempunyai beberapa titik buta
Tiada mekanisme stop loss membawa kepada risiko peningkatan kerugian
Kekurangan pengurusan wang yang ketat dan saiz kedudukan
Penyelesaian yang mungkin:
Menggabungkan penunjuk lain untuk menentukan julat swing jangka pendek dan mengawal risiko
Mengoptimumkan parameter MACD dan ujian di pasaran yang berbeza
Tambah corak, momentum dan lain-lain untuk mengesahkan isyarat
Menubuhkan mekanisme hentian kerugian untuk mengehadkan saiz kerugian
Tambah modul pengurusan wang kepada saiz kedudukan berdasarkan modal
Uji dan optimumkan gabungan parameter MA untuk lebih banyak kesesuaian pasaran
Cuba pelbagai jenis MA seperti VWAP, Bollinger midline dan lain-lain.
Pertimbangkan jumlah dagangan untuk mengelakkan pecah palsu
Menggabungkan RSI dan lain-lain untuk mengesahkan overbought / oversold
Membina mekanisme stop loss yang kukuh seperti trailing stop, volatility stop dan sebagainya.
Memasukkan saiz kedudukan berdasarkan saiz akaun
Pertimbangkan pembelajaran mesin untuk pengoptimuman parameter
Memperluas alam semesta strategi untuk pendekatan portfolio yang dipertingkatkan
Strategi ini mengintegrasikan penapisan trend purata bergerak berganda dan momentum MACD, menambah ciri corak, membina sistem perdagangan jangka menengah yang agak stabil. Kelebihan utama terletak pada menangkap trend utama sambil mengelakkan bunyi bising jangka pendek. Tetapi terdapat juga bidang yang boleh diperbaiki, seperti menambahkan mekanisme stop loss dan pengurusan risiko. Secara keseluruhan ini berfungsi sebagai contoh konsep yang berharga, tetapi memerlukan ujian 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")