Sumber daya yang dimuat... Pemuatan...

Strategi Rata-rata Bergerak Lima Kali Lebih Kuat

Penulis:ChaoZhang, Tanggal: 2024-05-23 18:14:35
Tag:EMAWMASMATMAVARWWMAZLEMATSF

img

Gambaran umum

Quintuple Strong Moving Average adalah strategi perdagangan yang didasarkan pada beberapa moving average. Strategi ini menggunakan 5 moving average dari berbagai jangka waktu dan jenis untuk mengidentifikasi tren yang kuat di pasar.

Dengan mempertimbangkan secara komprehensif tren dan hubungan posisi relatif dari rata-rata bergerak dari kerangka waktu dan jenis yang berbeda, strategi ini dapat secara akurat menentukan arah tren saat ini dan kekuatan pasar, dan menyesuaikan posisi tepat waktu sesuai dengan perubahan tren, sehingga mencapai profitabilitas yang baik.

Prinsip Strategi

Strategi ini menggunakan lima rata-rata bergerak dari kerangka waktu dan jenis yang berbeda, yaitu:

  1. Tingkat 1 rata-rata bergerak: tampilan yang dapat disesuaikan, label, sumber data, kerangka waktu, panjang, lebar baris, warna dan jenis.
  2. Rata-rata bergerak tingkat 2: tampilan yang dapat disesuaikan, label, sumber data, kerangka waktu, panjang, lebar baris, warna dan jenis.
  3. Rata-rata bergerak tingkat 3: tampilan yang dapat disesuaikan, label, sumber data, kerangka waktu, panjang, lebar baris, warna dan jenis.
  4. Rata-rata bergerak tingkat 4: terutama digunakan untuk penilaian tambahan, tampilan yang dapat disesuaikan, label, sumber data, kerangka waktu, panjang, lebar baris dan warna.
  5. Rata-rata bergerak tingkat 5: terutama digunakan untuk penilaian tambahan, tampilan yang dapat disesuaikan, label, sumber data, kerangka waktu, panjang, lebar baris dan warna.

Jenis dari 5 rata-rata bergerak ini dapat diatur secara fleksibel, termasuk SMA, EMA, WMA, TMA, VAR, WWMA, ZLEMA, TSF dan 8 jenis lainnya.

Ide inti dari strategi ini adalah untuk menentukan arah tren dan kekuatan dengan menggunakan beberapa konfirmasi tren dari rata-rata bergerak dari kerangka waktu dan jenis yang berbeda:

  • Ketika harga penutupan berada di atas rata-rata bergerak Tingkat 1, 2, dan 3, pergi panjang;
  • Bila harga penutupan berada di bawah rata-rata bergerak Tingkat 1, 2, dan 3, pergi pendek;
  • Ketika memegang posisi panjang, jika harga penutupan jatuh di bawah rata-rata bergerak Tingkat 1 dan 2, tutup posisi panjang;
  • Saat memegang posisi pendek, jika harga penutupan naik di atas rata-rata bergerak Tingkat 1 dan 2, tutup posisi pendek.

Selain itu, strategi ini akan menampilkan warna lilin sesuai dengan posisi saat ini:

  • Saat memegang posisi panjang, candlestick berwarna hijau;
  • Saat memegang posisi pendek, candlestick berwarna merah;
  • Dalam kasus lain, lilin berwarna abu-abu.

Keuntungan Strategi

  1. Kemampuan pelacakan tren yang kuat. Strategi ini menggunakan kombinasi dari beberapa rata-rata bergerak jangka menengah dan panjang untuk menentukan tren, dengan kemampuan pengenalan tren yang kuat, yang dapat secara efektif memahami tren pasar utama.
  2. Parameter yang dapat disesuaikan Fleksibel. Parameter strategi ini dapat diatur secara fleksibel, termasuk jenis, kerangka waktu, panjang rata-rata bergerak, dll, yang dapat dioptimalkan sesuai dengan karakteristik pasar yang berbeda dan preferensi investor.
  3. Adaptabilitas ke berbagai pasar. Strategi ini menilai tren terutama didasarkan pada pergerakan harga itu sendiri, dengan kemampuan beradaptasi yang kuat ke pasar, dan dapat digunakan di berbagai pasar seperti saham, berjangka, valuta asing, cryptocurrency, dll.
  4. Logika yang jelas dan sederhana. logika inti dari strategi ini sederhana dan jelas, mudah dipahami dan diterapkan, tanpa memerlukan model matematika yang terlalu kompleks.

Risiko Strategi

  1. Mencuci risiko perdagangan di pasar rangebound. Strategi ini umumnya dilakukan di pasar rangebound, dan dapat mengalami lebih banyak perdagangan kerugian kecil, yang mengakibatkan penurunan laba bersih.
  2. Risiko pengoptimalan parameter. Strategi ini menggunakan banyak parameter. Jika backtesting data historis yang cukup dan pengoptimalan parameter tidak dilakukan, itu dapat menyebabkan penarikan yang lebih besar dalam perdagangan langsung di masa depan.
  3. Risiko pembalikan tren. Strategi ini terutama cocok untuk pasar tren. Setelah tren pasar berbalik, strategi ini dapat terus berdagang dalam arah tren asli, menyebabkan kerugian.

Untuk mengurangi risiko di atas, perbaikan berikut dapat dipertimbangkan:

  1. Tambahkan deteksi pasar dan logika penilaian jangkauan untuk mengurangi jumlah perdagangan di pasar non-trending.
  2. Melakukan tes optimasi parameter yang cukup pada strategi ini untuk menemukan kombinasi parameter optimal yang kuat.
  3. Menetapkan tingkat stop loss yang wajar untuk mengendalikan risiko maksimum dari satu perdagangan. Pada saat yang sama, indikator atau sinyal lain dapat digunakan untuk mengkonfirmasi pembalikan tren dan menyesuaikan posisi secara tepat waktu.

Arah Optimasi Strategi

  1. Memperkenalkan lebih banyak indikator konfirmasi tren, seperti MACD, DMI, dll, untuk meningkatkan akurasi penilaian tren.
  2. Untuk pasar rangebound, pertimbangkan untuk memperkenalkan logika operasi yang dapat beradaptasi dengan pasar rangebound, seperti perdagangan grid.
  3. Untuk karakteristik pasar yang berbeda, optimalkan parameter strategi secara terpisah untuk meningkatkan kemampuan beradaptasi.
  4. Pertimbangkan untuk menggabungkan strategi ini dengan strategi lain, seperti kombinasi strategi tren + strategi rangebound, strategi tren + strategi countertrend, dll., untuk meningkatkan ketahanan strategi.

Ringkasan

Strategi Quintuple Strong Moving Average adalah strategi trading yang didasarkan pada beberapa konfirmasi tren. Dengan secara komprehensif mempertimbangkan tren dan hubungan posisi relatif dari rata-rata bergerak dari kerangka waktu dan jenis yang berbeda, ia dapat secara relatif akurat menentukan arah tren dan kekuatan pasar saat ini, dan menyesuaikan posisi tepat waktu sesuai dengan perubahan tren. Logika strategi sederhana dan jelas, parameternya fleksibel dan dapat disesuaikan, dan dapat disesuaikan dengan beberapa pasar. Namun, secara umum melakukan pasar rentang masuk, dan ada risiko optimasi parameter tertentu dan risiko pembalikan tren. Di masa depan, kita dapat mempertimbangkan untuk memperkenalkan lebih banyak indikator, mengoptimalkan parameter, menambahkan logika operasi untuk pasar rentang, dan menggabungkan dengan jenis strategi lain untuk meningkatkan ketahanan dan profitabilitas strategi ini.


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

//@version=5
strategy("Quintuple Strong Moving Average Strategy","QuisMa", overlay=true, margin_long=100, margin_short=100)

// 1
mav1_show = input.bool(true, 'Show Plot', group='Level 1 ', inline='mav1_0')
mav1_label = input.bool(true, 'Show Label', group='Level 1 ', inline='mav1_0')
mav1_source = input.source(close, '', group='Level 1 ', inline='mav1_1')
mav1_timeframe = input.timeframe('5', '', group='Level 1 ', inline='mav1_1')
mav1_length = input.int(50, 'Length', group='Level 1 ', inline='mav1_3')
mav1_size = input.int(2000, 'Size', minval=1, group='Level 1 ', inline='mav1_3')
mav1_width = input.int(2, '', minval=0, group='Level 1 ', inline='mav1_2')
mav1_color = input.color(color.new(#ffd000, 0), '', group='Level 1 ', inline='mav1_2')
mav1_type = input.string(title='Moving Average Type 1', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])

// 2
mav2_show = input.bool(true, 'Show Plot', group='Level 2', inline='mav2_0')
mav2_label = input.bool(true, 'Show Label', group='Level 2', inline='mav2_0')
mav2_source = input.source(close, '', group='Level 2', inline='mav2_1')
mav2_timeframe = input.timeframe('30', '', group='Level 2', inline='mav2_1')
mav2_length = input.int(50, 'Length', group='Level 2', inline='mav2_3')
mav2_size = input.int(2000, 'Size', minval=1, group='Level 2', inline='mav2_3')
mav2_width = input.int(2, '', minval=0, group='Level 2', inline='mav2_2')
mav2_color = input.color(color.new(#ffd000, 0), '', group='Level 2', inline='mav2_2')
mav2_type = input.string(title='Moving Average Type 2', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])

// 3
mav3_show = input.bool(true, 'Show Plot', group='Level 3', inline='mav3_0')
mav3_label = input.bool(true, 'Show Label', group='Level 3', inline='mav3_0')
mav3_source = input.source(close, '', group='Level 3', inline='mav3_1')
mav3_timeframe = input.timeframe('60', '', group='Level 3', inline='mav3_1')
mav3_length = input.int(50, 'Length', group='Level 3', inline='mav3_3')
mav3_size = input.int(2000, 'Size', minval=1, group='Level 3', inline='mav3_3')
mav3_width = input.int(2, '', minval=0, group='Level 3', inline='mav3_2')
mav3_color = input.color(color.new(#ffd000, 0), '', group='Level 3', inline='mav3_2')
mav3_type = input.string(title='Moving Average Type 3', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])

// 4
mav4_show = input.bool(true, 'Show Plot', group='Level 4', inline='mav4_0')
mav4_label = input.bool(true, 'Show Label', group='Level 4', inline='mav4_0')
mav4_source = input.source(close, '', group='Level 4', inline='mav4_1')
mav4_timeframe = input.timeframe('480', '', group='Level 4', inline='mav4_1')
mav4_length = input.int(50, 'Length', group='Level 4', inline='mav4_3')
mav4_size = input.int(2000, 'Size', minval=1, group='Level 4', inline='mav4_3')
mav4_width = input.int(2, '', minval=0, group='Level 4', inline='mav4_2')
mav4_color = input.color(color.new(#ffd000, 0), '', group='Level 4', inline='mav4_2')
mav4_type = input.string(title='Moving Average Type 4', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])

// 5
mav5_show = input.bool(true, 'Show Plot', group='Level 5', inline='mav5_0')
mav5_label = input.bool(true, 'Show Label', group='Level 5', inline='mav5_0')
mav5_source = input.source(close, '', group='Level 5', inline='mav5_1')
mav5_timeframe = input.timeframe('720', '', group='Level 5', inline='mav5_1')
mav5_length = input.int(50, 'Length', group='Level 5', inline='mav5_3')
mav5_size = input.int(2000, 'Size', minval=1, group='Level 5', inline='mav5_3')
mav5_width = input.int(2, '', minval=0, group='Level 5', inline='mav5_2')
mav5_color = input.color(color.new(#ffd000, 0), '', group='Level 5', inline='mav5_2')
mav5_type = input.string(title='Moving Average Type 5', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])


// FUNCTIONS {{{
candle_size_ms = time - time[1]  // milliseconds of a candle

timetostring(tms) =>
    d_ = math.floor(tms / 86400)
    h_ = math.floor((tms - d_ * 86400) / 3600)
    m_ = math.floor((tms - d_ * 86400 - h_ * 3600) / 60)
    s_ = math.floor(tms - d_ * 86400 - h_ * 3600 - m_ * 60)
    ret = d_ > 0 ? str.tostring(d_) + ' D ' : ''
    ret += (h_ > 0 ? str.tostring(h_) + ' H ' : '')
    ret += (m_ > 0 ? str.tostring(m_) + ' m ' : '')
    if d_ == 0
        ret += (s_ > 0 ? str.tostring(s_) + ' s ' : '')
        ret
    ret

tftostring(tf) =>
    tfa = str.split(tf, '')
    tfalast = array.get(tfa, array.size(tfa) - 1)
    tfalastIsNum = na(str.tonumber(tfalast)) ? false : true
    txt = tfalastIsNum ? timetostring(str.tonumber(tf) * 60) : tf
    txt

htfLabel(htfy, tf, col) =>
    txt = tftostring(tf)
    htftxt = 'ᐊ ' + txt
    htftip = 'HTF  [ ' + txt + ' ] ' + str.tostring(htfy, '#.##')
    label.new(x=time + candle_size_ms * 2, y=htfy, xloc=xloc.bar_time, yloc=yloc.price, color=color.new(color.black, 100), textcolor=col, style=label.style_label_left, size=size.normal, text=htftxt, tooltip=htftip)

// Moving Averages Functions {{{
Var_Func(src, length) =>
    valpha = 2 / (length + 1)
    vud1 = src > src[1] ? src - src[1] : 0
    vdd1 = src < src[1] ? src[1] - src : 0
    vUD = math.sum(vud1, 9)
    vDD = math.sum(vdd1, 9)
    vCMO = nz((vUD - vDD) / (vUD + vDD))
    VAR = 0.0
    VAR := nz(valpha * math.abs(vCMO) * src) + (1 - valpha * math.abs(vCMO)) * nz(VAR[1])
    VAR

Wwma_Func(src, length) =>
    wwalpha = 1 / length
    WWMA = 0.0
    WWMA := wwalpha * src + (1 - wwalpha) * nz(WWMA[1])
    WWMA

Zlema_Func(src, length) =>
    zxLag = length / 2 == math.round(length / 2) ? length / 2 : (length - 1) / 2
    zxEMAData = src + src - src[zxLag]
    ZLEMA = ta.ema(zxEMAData, length)
    ZLEMA

Tsf_Func(src, length) =>
    lrc = ta.linreg(src, length, 0)
    lrc1 = ta.linreg(src, length, 1)
    lrs = lrc - lrc1
    TSF = ta.linreg(src, length, 0) + lrs
    TSF

getMA(src, length, mav_type) =>
    ma = 0.0
    if mav_type == 'SMA'
        ma := ta.sma(src, length)
    if mav_type == 'EMA'
        ma := ta.ema(src, length)
    if mav_type == 'WMA'
        ma := ta.wma(src, length)
    if mav_type == 'TMA'
        ma := ta.sma(ta.sma(src, math.ceil(length / 2)), math.floor(length / 2) + 1)
    if mav_type == 'VAR'
        ma := Var_Func(src, length)
    if mav_type == 'WWMA'
        ma := Wwma_Func(src, length)
    if mav_type == 'ZLEMA'
        ma := Zlema_Func(src, length)
    if mav_type == 'TSF'
        ma := Tsf_Func(src, length)
    ma

mav1 = request.security(syminfo.tickerid, mav1_timeframe, getMA(mav1_source, mav1_length, mav1_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav1_show ? mav1 : na, 'mav 1', color=mav1_color, linewidth=mav1_width, show_last=mav1_size)
var label mav1lbl = na
label.delete(mav1lbl)
mav1lbl := mav1_label ? htfLabel(mav1, mav1_timeframe, mav1_color) : na

mav2 = request.security(syminfo.tickerid, mav2_timeframe, getMA(mav2_source, mav2_length, mav2_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav2_show ? mav2 : na, 'mav 2', color=mav2_color, linewidth=mav2_width, show_last=mav2_size)
var label mav2lbl = na
label.delete(mav2lbl)
mav2lbl := mav2_label ? htfLabel(mav2, mav2_timeframe, mav2_color) : na

mav3 = request.security(syminfo.tickerid, mav3_timeframe, getMA(mav3_source, mav3_length, mav3_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav3_show ? mav3 : na, 'mav 3', color=mav3_color, linewidth=mav3_width, show_last=mav3_size)
var label mav3lbl = na
label.delete(mav3lbl)
mav3lbl := mav3_label ? htfLabel(mav3, mav3_timeframe, mav3_color) : na

mav4 = request.security(syminfo.tickerid, mav4_timeframe, getMA(mav4_source, mav4_length, mav4_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav4_show ? mav4 : na, 'mav 4', color=mav4_color, linewidth=mav4_width, show_last=mav4_size)
var label mav4lbl = na
label.delete(mav4lbl)
mav4lbl := mav4_label ? htfLabel(mav4, mav4_timeframe, mav4_color) : na

mav5 = request.security(syminfo.tickerid, mav5_timeframe, getMA(mav5_source, mav5_length, mav5_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav5_show ? mav5 : na, 'mav 5', color=mav5_color, linewidth=mav5_width, show_last=mav5_size)
var label mav5lbl = na
label.delete(mav5lbl)
mav5lbl := mav5_label ? htfLabel(mav5, mav5_timeframe, mav5_color) : na

// Alış ve Satış Koşulları
alisKosulu = close > mav1 and close > mav2 and close > mav3
satisKosulu = close < mav1 and close < mav2 and close < mav3

// Alış ve Satış Sinyalleri
if (alisKosulu and not satisKosulu)
    strategy.entry("Alış", strategy.long)
if (satisKosulu and not alisKosulu)
    strategy.entry("Satış", strategy.short)

// Pozisyonları Kapatma Koşulları
if (strategy.opentrades > 0)
    if (close < mav1 and close < mav2 and strategy.position_size > 0)
        strategy.close("Alış")
    if (close > mav1 and close > mav2 and strategy.position_size < 0)
        strategy.close("Satış")

// Mum Rengi Ayarlama
longKosul = strategy.opentrades > 0 and strategy.position_size > 0
shortKosul = strategy.opentrades > 0 and strategy.position_size < 0

barcolor(longKosul ? color.green : shortKosul ? color.red : color.gray)


Berkaitan

Lebih banyak