MACD Moving Average Combination Cross-Period Dynamic Trend Strategy (Strategi Tren Dinamis lintas periode)

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

img

Gambaran umum

Strategi ini didasarkan pada kombinasi rata-rata bergerak dari indikator MACD untuk mewujudkan penilaian tren dinamis di berbagai periode waktu. Ini termasuk dalam strategi pelacakan tren yang lebih klasik. Ini terutama menilai arah dan kekuatan tren saat ini melalui perbedaan antara rata-rata bergerak cepat dan lambat dari MACD dan hubungan antara garis sinyalnya. Pada saat yang sama, penilaian lintas periode diperkenalkan untuk meningkatkan akurasi dan menyesuaikan posisi secara dinamis.

Prinsip Strategi

  1. Hukum arah tren saat ini berdasarkan perbedaan antara rata-rata bergerak cepat dan lambat dari indikator MACD dan hubungan garis sinyalnya.
  2. Perbedaan MACD yang melintasi di atas garis sinyal adalah sinyal panjang, dan melintasi di bawah adalah sinyal pendek.
  3. Memperkenalkan perbedaan MACD dan histogram MACD ke arah yang sama untuk meningkatkan sinyal strategi.
  4. Tambahkan modul penilaian siklus silang, gunakan indikator MACD dari kerangka waktu yang lebih tinggi sebagai filter sinyal dan dasar penyesuaian posisi.
  5. Pengaturan posisi dinamis, mengurangi ukuran posisi ketika sinyal siklus silang lebih lemah, dan meningkatkan posisi ketika sinyal ditingkatkan.

Analisis Keuntungan

  1. Efektivitas MACD sendiri dalam menentukan arah tren relatif tinggi.
  2. Kombinasi dari perbedaan MACD dan verifikasi histogram ganda dapat meningkatkan akurasi sinyal.
  3. Penghakiman lintas siklus meningkatkan stabilitas strategi dan menghindari ditipu oleh sinyal frekuensi tinggi.
  4. Penyesuaian posisi dinamis memungkinkan strategi untuk lebih memahami peluang dan meningkatkan hasil yang berlebihan.

Analisis Risiko dan Solusi

  1. Sinyal MACD memiliki lag, yang dapat menyebabkan efek sinyal yang sedikit lebih buruk.
  • Solusi: Tingkatkan perbedaan antara rata-rata bergerak cepat dan lambat untuk menangkap sinyal sebelumnya.
  1. Sinyal siklus silang tidak selalu akurat dan dapat menyesatkan strategi.
  • Solusi: Memperkenalkan mekanisme penyesuaian posisi dinamis untuk memastikan bahwa strategi siklus utama mendominasi.
  1. Stabilitas keseluruhan dari strategi gabungan multi-faktor mungkin tidak cukup.
  • Solusi: Atur dengan hati-hati proporsi berat masing-masing parameter strategi untuk memastikan ketahanan keseluruhan.

Arahan Optimasi

  1. Uji efek dari kombinasi parameter siklus yang berbeda.
  2. Uji dampak dari kombinasi siklus silang yang berbeda pada efektivitas strategi.
  3. Sesuaikan parameter indikator MACD, seperti siklus rata-rata bergerak cepat dan lambat, siklus garis sinyal, dll.
  4. Uji efek dari faktor penyesuaian posisi yang berbeda.
  5. Uji efek backtest pada varietas lain.

Ringkasan

Strategi tren dinamis lintas periode kombinasi rata-rata bergerak MACD ini mengintegrasikan keuntungan dari indikator klasik dan referensi frame waktu multi. Melalui optimasi parameter dan pengujian kombinasi, strategi pelacakan tren yang relatif stabil dan menguntungkan dapat dibangun.


/*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 banyak