Sumber dimuat naik... memuat...

Strategi purata bergerak lima kali lebih kuat

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

img

Ringkasan

Strategi purata bergerak lima kali kuat adalah strategi perdagangan berdasarkan pelbagai purata bergerak. Strategi ini menggunakan 5 purata bergerak dari pelbagai jangka masa dan jenis untuk mengenal pasti trend yang kuat di pasaran. 3 purata bergerak pertama adalah komponen teras strategi, terutama digunakan untuk pengenalan trend dan penjanaan isyarat, sementara purata bergerak ke-4 dan ke-5 digunakan terutamanya untuk penilaian tambahan dan analisis visual.

Dengan mempertimbangkan secara komprehensif trend dan hubungan kedudukan relatif purata bergerak dari pelbagai jangka masa dan jenis, strategi ini dapat menentukan dengan tepat hala tuju trend semasa dan kekuatan pasaran, dan menyesuaikan kedudukan tepat pada masanya mengikut perubahan trend, untuk mencapai keuntungan yang baik.

Prinsip Strategi

Strategi ini menggunakan lima purata bergerak dari pelbagai jangka masa dan jenis, iaitu:

  1. Purata bergerak peringkat 1: paparan yang boleh disesuaikan, label, sumber data, jangka masa, panjang, lebar baris, warna dan jenis.
  2. Purata bergerak peringkat 2: paparan yang boleh disesuaikan, label, sumber data, jangka masa, panjang, lebar baris, warna dan jenis.
  3. Purata bergerak peringkat 3: paparan yang boleh disesuaikan, label, sumber data, jangka masa, panjang, lebar baris, warna dan jenis.
  4. Purata bergerak peringkat 4: digunakan terutamanya untuk penilaian tambahan, paparan yang boleh disesuaikan, label, sumber data, jangka masa, panjang, lebar baris dan warna.
  5. Purata bergerak peringkat 5: digunakan terutamanya untuk penilaian tambahan, paparan yang boleh disesuaikan, label, sumber data, jangka masa, panjang, lebar baris dan warna.

Jenis 5 purata bergerak ini boleh ditetapkan dengan fleksibel, termasuk SMA, EMA, WMA, TMA, VAR, WWMA, ZLEMA, TSF dan 8 jenis lain.

Idea teras strategi ini adalah untuk menentukan arah trend dan kekuatan dengan menggunakan pelbagai pengesahan trend purata bergerak jangka masa dan jenis yang berbeza:

  • Apabila harga penutupan di atas purata bergerak Tahap 1, 2, dan 3, pergi panjang;
  • Apabila harga penutupan di bawah purata bergerak Tahap 1, 2, dan 3, pergi pendek;
  • Apabila memegang kedudukan panjang, jika harga penutupan jatuh di bawah purata bergerak Tahap 1 dan 2, tutup panjang;
  • Apabila memegang kedudukan pendek, jika harga penutupan meningkat di atas purata bergerak Tahap 1 dan 2, tutup pendek.

Di samping itu, strategi ini akan memaparkan warna lilin mengikut kedudukan semasa:

  • Apabila memegang kedudukan panjang, lilin berwarna hijau;
  • Apabila memegang kedudukan pendek, lilin adalah merah;
  • Dalam kes lain, candlestick adalah kelabu.

Kelebihan Strategi

  1. Keupayaan pengesanan trend yang kuat. Strategi ini menggunakan gabungan pelbagai purata bergerak jangka menengah dan panjang untuk menentukan trend, dengan keupayaan pengenalan trend yang kuat, yang dapat memahami dengan berkesan trend pasaran utama.
  2. Parameter yang boleh diselaraskan yang fleksibel. Parameter strategi ini boleh ditetapkan dengan fleksibel, termasuk jenis, jangka masa, tempoh purata bergerak, dan lain-lain, yang boleh dioptimumkan mengikut ciri pasaran yang berbeza dan pilihan pelabur.
  3. Kebolehsesuaian kepada pelbagai pasaran. Penghakiman trend strategi ini terutamanya berdasarkan pergerakan harga itu sendiri, dengan kebolehsesuaian yang kuat kepada pasaran, dan boleh digunakan di pelbagai pasaran seperti saham, niaga hadapan, pertukaran asing, cryptocurrency, dll.
  4. Logik yang jelas dan mudah. Logik teras strategi ini adalah mudah dan jelas, mudah difahami dan dilaksanakan, tanpa memerlukan model matematik yang terlalu kompleks.

Risiko Strategi

  1. Mencuci risiko dagangan di pasaran jangkauan. Strategi ini biasanya dilakukan di pasaran jangkauan, dan mungkin mengalami lebih banyak perdagangan kerugian kecil, mengakibatkan penurunan keuntungan bersih.
  2. Risiko pengoptimuman parameter. Strategi ini menggunakan banyak parameter. Jika ujian semula data sejarah yang mencukupi dan pengoptimuman parameter tidak dilakukan, ia mungkin membawa kepada penarikan yang lebih besar dalam perdagangan langsung masa depan.
  3. Risiko pembalikan trend. Strategi ini terutamanya sesuai untuk pasaran trend. Sebaik sahaja trend pasaran berbalik, strategi ini boleh terus berdagang dalam arah trend asal, menyebabkan kerugian.

Untuk mengurangkan risiko di atas, penambahbaikan berikut boleh dipertimbangkan:

  1. Tambah pengesanan pasaran yang terhad dan logik penilaian untuk mengurangkan bilangan dagangan di pasaran bukan trend.
  2. Melakukan ujian pengoptimuman parameter yang mencukupi pada strategi ini untuk mencari kombinasi parameter optimum yang kukuh.
  3. Tetapkan tahap stop loss yang munasabah untuk mengawal risiko maksimum satu perdagangan. Pada masa yang sama, penunjuk atau isyarat lain boleh digunakan untuk mengesahkan pembalikan trend dan menyesuaikan kedudukan dengan tepat pada masanya.

Arahan Pengoptimuman Strategi

  1. Memperkenalkan lebih banyak penunjuk pengesahan trend, seperti MACD, DMI, dan lain-lain, untuk meningkatkan ketepatan penilaian trend.
  2. Untuk pasaran terhad, pertimbangkan untuk memperkenalkan logik operasi yang boleh menyesuaikan diri dengan pasaran terhad, seperti perdagangan grid.
  3. Untuk ciri pasaran yang berbeza, optimumkan parameter strategi secara berasingan untuk meningkatkan kesesuaian.
  4. Pertimbangkan untuk menggabungkan strategi ini dengan strategi lain, seperti gabungan strategi trend + strategi jangkauan, strategi trend + strategi kontra-trend, dan lain-lain, untuk meningkatkan ketahanan strategi.

Ringkasan

Strategi purata bergerak kuat lima kali adalah strategi dagangan berdasarkan beberapa pengesahan trend. Dengan mempertimbangkan secara komprehensif trend dan hubungan kedudukan relatif purata bergerak dari jangka masa dan jenis yang berbeza, ia dapat menentukan arah trend semasa dan kekuatan pasaran dengan agak tepat, dan menyesuaikan kedudukan tepat pada masanya mengikut perubahan trend. Logik strategi adalah mudah dan jelas, parameternya fleksibel dan boleh disesuaikan, dan ia dapat disesuaikan dengan pelbagai pasaran. Walau bagaimanapun, ia menjalankan pasaran jangkauan masuk secara amnya, dan terdapat risiko pengoptimuman parameter tertentu dan risiko pembalikan trend. Pada masa akan datang, kita boleh mempertimbangkan untuk memperkenalkan lebih banyak penunjuk, mengoptimumkan parameter, menambah logik operasi untuk pasaran jangkauan, dan menggabungkan dengan jenis strategi lain untuk meningkatkan lagi ketahanan dan keuntungan 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 lanjut