MACD Moving Average Combination Cross-Period Dynamic Trend Strategy

Penulis:ChaoZhang, Tarikh: 2024-02-19 10:48:11
Tag:

img

Ringkasan

Strategi ini berdasarkan gabungan purata bergerak penunjuk MACD untuk merealisasikan penilaian trend dinamik merentasi tempoh masa. Ia tergolong dalam strategi penjejakan trend yang lebih klasik. Ia terutamanya menilai arah dan kekuatan trend semasa melalui perbezaan antara purata bergerak cepat dan perlahan MACD dan hubungan antara garis isyaratnya. Pada masa yang sama, penghakiman lintas tempoh diperkenalkan untuk meningkatkan ketepatan dan menyesuaikan kedudukan secara dinamik.

Prinsip Strategi

  1. Menghakimi arah trend semasa berdasarkan perbezaan antara purata bergerak cepat dan perlahan penunjuk MACD dan hubungan garis isyaratnya.
  2. Perbezaan MACD yang melintasi di atas garis isyarat adalah isyarat panjang, dan melintasi di bawah adalah isyarat pendek.
  3. Memperkenalkan perbezaan MACD dan histogram MACD ke arah yang sama untuk meningkatkan isyarat strategi.
  4. Tambah modul penghakiman kitaran silang, gunakan penunjuk MACD jangka masa yang lebih tinggi sebagai penapis isyarat dan asas penyesuaian kedudukan.
  5. Penyesuaian kedudukan dinamik, mengurangkan saiz kedudukan apabila isyarat kitaran silang lemah, dan meningkatkan kedudukan apabila isyarat ditingkatkan.

Analisis Kelebihan

  1. Keberkesanan MACD itu sendiri dalam menentukan arah trend agak tinggi.
  2. Gabungan perbezaan MACD dan pengesahan histogram berganda dapat meningkatkan ketepatan isyarat.
  3. Penghakiman rentas kitaran meningkatkan kestabilan strategi dan mengelakkan ditipu oleh isyarat frekuensi tinggi.
  4. Penyesuaian kedudukan dinamik membolehkan strategi untuk memanfaatkan peluang dengan lebih baik dan meningkatkan pulangan yang berlebihan.

Analisis Risiko dan Penyelesaian

  1. Isyarat MACD mempunyai lag, yang boleh membawa kepada kesan isyarat yang sedikit lebih rendah.
  • Penyelesaian: Tingkatkan perbezaan antara purata bergerak pantas dan perlahan untuk menangkap isyarat terlebih dahulu.
  1. Isyarat kitaran silang tidak semestinya tepat dan boleh menyesatkan strategi.
  • Penyelesaian: Memperkenalkan mekanisme pelarasan kedudukan dinamik untuk memastikan strategi kitaran utama mendominasi.
  1. Kestabilan keseluruhan strategi gabungan pelbagai faktor mungkin tidak mencukupi.
  • Penyelesaian: Sesuaikan dengan teliti perbandingan berat setiap parameter strategi untuk memastikan ketahanan keseluruhan.

Arahan pengoptimuman

  1. Uji kesan gabungan parameter kitaran yang berbeza.
  2. Uji kesan gabungan kitaran silang yang berbeza terhadap keberkesanan strategi.
  3. Sesuaikan parameter penunjuk MACD, seperti kitaran purata bergerak pantas dan perlahan, kitaran garis isyarat, dll.
  4. Uji kesan faktor penyesuaian kedudukan yang berbeza.
  5. Uji kesan backtest pada jenis lain.

Ringkasan

Strategi trend dinamik perpaduan purata bergerak MACD ini mengintegrasikan kelebihan penunjuk klasik dan rujukan bingkai masa berbilang. Melalui pengoptimuman parameter dan ujian gabungan, strategi penjejakan trend yang agak stabil dan menguntungkan dapat dibina.


/*backtest
start: 2023-02-12 00:00:00
end: 2024-02-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@temelbulut
//@version=5
strategy('MACD Strategy %80', overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=50)

fastLength = input.int(title='MACD Fast Length', defval=12, minval=1)
slowLength = input.int(title='MACD Slow Length', defval=26, minval=1)
signalLength = input.int(title='MACD Signal Length', defval=9, minval=1)
crossscore = input(title='Cross (buy/sell) Score', defval=10.)
indiside = input(title='indicator Direction Score', defval=8)
histside = input(title='Histogram Direction Score', defval=2)
shotsl = input(title='Show Stop Loss Line', defval=false)
Mult = input.float(title='Stop Loss Factor', defval=1.2, minval=0.1, maxval=100)
Period = input.int(title='Stop Loss Period', defval=10, minval=1, maxval=100)
lookaheadi = input(title='Lookahead', defval=true)

HTF = timeframe.period == '1' ? '5' : timeframe.period == '3' ? '15' : timeframe.period == '5' ? '15' : timeframe.period == '15' ? '60' : timeframe.period == '30' ? '60' : timeframe.period == '45' ? '60' : timeframe.period == '60' ? '240' : timeframe.period == '120' ? '240' : timeframe.period == '180' ? '240' : timeframe.period == '240' ? 'D' : timeframe.period == 'D' ? 'W' : 'W'

calc = timeframe.period == '1' ? 5 : timeframe.period == '3' ? 5 : timeframe.period == '5' ? 3 : timeframe.period == '15' ? 4 : timeframe.period == '30' ? 4 : timeframe.period == '45' ? 4 : timeframe.period == '60' ? 4 : timeframe.period == '120' ? 3 : timeframe.period == '180' ? 3 : timeframe.period == '240' ? 6 : timeframe.period == 'D' ? 5 : 1

count() =>
    indi = ta.ema(close, fastLength) - ta.ema(close, slowLength)
    signal = ta.ema(indi, signalLength)
    Anlyse = 0.0
    // direction of indi and histogram
    hist = indi - signal
    Anlyse := indi > indi[1] ? hist > hist[1] ? indiside + histside : hist == hist[1] ? indiside : indiside - histside : 0
    Anlyse += (indi < indi[1] ? hist < hist[1] ? -(indiside + histside) : hist == hist[1] ? -indiside : -(indiside - histside) : 0)
    Anlyse += (indi == indi[1] ? hist > hist[1] ? histside : hist < hist[1] ? -histside : 0 : 0)
    // cross now earlier ?
    countcross = indi >= signal and indi[1] < signal[1] ? crossscore : indi <= signal and indi[1] > signal[1] ? -crossscore : 0.
    countcross += nz(countcross[1]) * 0.6
    Anlyse += countcross
    nz(Anlyse)

Anlys = count()
AnlysHfrm = lookaheadi ? request.security(syminfo.tickerid, HTF, count(), lookahead=barmerge.lookahead_on) : request.security(syminfo.tickerid, HTF, count(), lookahead=barmerge.lookahead_off)
Result = (AnlysHfrm * calc + Anlys) / (calc + 1)

longCondition = ta.change(Result) != 0 and Result > 0
if longCondition
    strategy.entry('MACD Long', strategy.long,alert_message = 'MACD Long')

shortCondition = ta.change(Result) != 0 and Result < 0
if shortCondition
    strategy.entry('MACD Short', strategy.short,alert_message = 'MACD Short')

countstop(pos) =>
    Upt = hl2 - Mult * ta.atr(Period)
    Dnt = hl2 + Mult * ta.atr(Period)
    TUp = 0.
    TDown = 0.
    TUp := close[1] > TUp[1] ? math.max(Upt, TUp[1]) : Upt
    TDown := close[1] < TDown[1] ? math.min(Dnt, TDown[1]) : Dnt
    tslmtf = pos == 1 ? TUp : TDown
    tslmtf

pos = longCondition ? 1 : -1
stline = 0.
countstop__1 = countstop(pos)
security_1 = request.security(syminfo.tickerid, HTF, countstop__1)
stline := ta.change(time(HTF)) != 0 or longCondition or shortCondition ? security_1 : nz(stline[1])
plot(stline, color=shotsl ? color.rgb(148, 169, 18) : na, style=plot.style_line, linewidth=2, title='Stop Loss')



Lebih lanjut