Strategi Momentum Crossover Purata Bergerak Berganda

Penulis:ChaoZhang, Tarikh: 2023-11-16 17:25:13
Tag:

img

Ringkasan

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.

Logika Strategi

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.

Kelebihan

  1. Purata bergerak berganda menentukan trend jangka menengah, mengelakkan bunyi jangka pendek

  2. MACD membantu menilai trend jangka pendek dan momentum untuk keuntungan yang lebih tinggi

  3. Perubahan warna histogram membantu mengenal pasti masa kemasukan yang lebih baik

  4. Warna latar belakang silang menonjolkan isyarat

  5. Tempoh purata bergerak yang boleh disesuaikan sesuai dengan persekitaran pasaran yang berbeza

  6. Parameter MACD yang boleh diselaraskan mengoptimumkan penunjuk

  7. Menyediakan pengesahan kemasukan berbilang: trend, silang, corak pecah

Risiko

  1. Dual MA tidak sensitif terhadap turun naik jangka pendek, mungkin terlepas peluang jangka pendek

  2. Kesan MACD yang lemah dengan tetapan parameter yang tidak betul, boleh menghasilkan isyarat palsu

  3. Entri yang berasaskan hanya pada MAs dan MACD mempunyai beberapa titik buta

  4. Tiada mekanisme stop loss membawa kepada risiko peningkatan kerugian

  5. Kekurangan pengurusan wang yang ketat dan saiz kedudukan

Penyelesaian yang mungkin:

  1. Menggabungkan penunjuk lain untuk menentukan julat swing jangka pendek dan mengawal risiko

  2. Mengoptimumkan parameter MACD dan ujian di pasaran yang berbeza

  3. Tambah corak, momentum dan lain-lain untuk mengesahkan isyarat

  4. Menubuhkan mekanisme hentian kerugian untuk mengehadkan saiz kerugian

  5. Tambah modul pengurusan wang kepada saiz kedudukan berdasarkan modal

Arahan pengoptimuman

  1. Uji dan optimumkan gabungan parameter MA untuk lebih banyak kesesuaian pasaran

  2. Cuba pelbagai jenis MA seperti VWAP, Bollinger midline dan lain-lain.

  3. Pertimbangkan jumlah dagangan untuk mengelakkan pecah palsu

  4. Menggabungkan RSI dan lain-lain untuk mengesahkan overbought / oversold

  5. Membina mekanisme stop loss yang kukuh seperti trailing stop, volatility stop dan sebagainya.

  6. Memasukkan saiz kedudukan berdasarkan saiz akaun

  7. Pertimbangkan pembelajaran mesin untuk pengoptimuman parameter

  8. Memperluas alam semesta strategi untuk pendekatan portfolio yang dipertingkatkan

Kesimpulan

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")


Lebih lanjut