Strategi Momentum Crossover Rata-rata Bergerak Ganda

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

img

Gambaran umum

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.

Logika Strategi

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

Keuntungan

  1. Rata-rata bergerak ganda menentukan tren jangka menengah, hindari kebisingan jangka pendek

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

  3. Perubahan warna histogram membantu mengidentifikasi waktu masuk yang lebih baik

  4. Warna latar belakang crossover menyoroti sinyal

  5. Periode rata-rata bergerak yang dapat disesuaikan sesuai dengan lingkungan pasar yang berbeda

  6. Parameter MACD yang dapat disesuaikan mengoptimalkan indikator

  7. Memberikan beberapa konfirmasi entri: tren, crossover, pola pecah

Risiko

  1. Dual MAs tidak sensitif terhadap fluktuasi jangka pendek, mungkin kehilangan peluang jangka pendek

  2. Efek MACD yang buruk dengan pengaturan parameter yang tidak tepat, dapat menghasilkan sinyal palsu

  3. Entri yang didasarkan hanya pada MAs dan MACD memiliki beberapa titik buta

  4. Tidak ada mekanisme stop loss menghasilkan risiko peningkatan kerugian

  5. Kurangnya pengelolaan uang yang ketat dan ukuran posisi

Solusi yang mungkin:

  1. Menggabungkan indikator lain untuk menentukan rentang swing jangka pendek dan risiko kontrol

  2. Mengoptimalkan parameter MACD dan menguji di pasar yang berbeda

  3. Tambahkan pola, momentum dll untuk mengkonfirmasi sinyal

  4. Menetapkan mekanisme stop loss untuk membatasi ukuran kerugian

  5. Tambahkan modul manajemen uang ke ukuran posisi berdasarkan modal

Arahan Optimasi

  1. Uji dan optimalkan kombinasi parameter MA untuk lebih banyak kemampuan adaptasi pasar

  2. Cobalah jenis MA yang berbeda seperti VWAP, Bollinger midline dll.

  3. Pertimbangkan volume perdagangan untuk menghindari breakout palsu

  4. Masukkan RSI dll untuk mengkonfirmasi overbought/oversold

  5. Membangun mekanisme stop loss yang kuat seperti trailing stop, volatility stop dll.

  6. Menggabungkan ukuran posisi berdasarkan ukuran akun

  7. Pertimbangkan pembelajaran mesin untuk optimasi parameter

  8. Memperluas alam semesta strategi untuk pendekatan portofolio yang ditingkatkan

Kesimpulan

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


Lebih banyak