Strategi dagangan purata bergerak


Tarikh penciptaan: 2023-10-30 15:53:25 Akhirnya diubah suai: 2023-10-30 15:53:25
Salin: 3 Bilangan klik: 611
1
fokus pada
1617
Pengikut

Strategi dagangan purata bergerak

Gambaran keseluruhan

Strategi ini menggunakan sistem garis rata untuk menilai arah trend semasa, berdasarkan arah trend melakukan lebih banyak penyingkiran. Apabila rata-rata naik, penilaian sebagai kepercayaan yang lebih tinggi, lakukan lebih banyak; apabila rata-rata turun, penilaian sebagai kepercayaan yang lebih tinggi, penyingkiran. Strategi ini terutamanya melalui sistem garis rata untuk menilai arah pergerakan pasaran, termasuk strategi mengikuti trend.

Prinsip Strategi

  1. Hitung purata bergerak bertimbangan untuk tempoh tertentu (default 400 kitaran) vwma sebagai penunjuk garis rata-rata.

  2. Untuk menentukan sama ada garis rata-ratavwma naik, jika naik, tetapkan melihat banyak isyarat uptrend; jika turun, tetapkan melihat isyarat downtrend.

  3. Apabila uptrend adalah benar, lakukan lebih banyak; apabila downtrend adalah benar, kosongkan kedudukan kosong.

  4. Hitung kadar pulangan bar_pnl dan kadar pulangan bar_bh bagi setiap baris K.

  5. Bergantung pada titik putus suku dan tahunan, hasil strategi setiap suku dan tahun dikira sebagai quarter_pnl dan hasil tahunan sebagai year_pnl dan hasil pembelian dan pegangan yang sepadan sebagai quarter_bh dan year_bh.

  6. Di dalam jadual ini, kadar pulangan strategi dan kadar pulangan beli dan simpan untuk setiap suku tahunan ditunjukkan.

Analisis kelebihan strategi

Strategi ini bergantung kepada arah trend pasaran berdasarkan purata dan mempunyai kelebihan berikut:

  1. Operasi mudah, mudah difahami dan mudah dikuasai.

  2. Keupayaan kawalan penarikan balik yang kuat, mengikuti operasi trend, dapat mengawal kerugian pasaran bukan trend dengan berkesan.

  3. Lebih sedikit parameter yang boleh dikonfigurasi, terutamanya untuk menyesuaikan kitaran garis purata, mudah diuji dan dioptimumkan.

  4. Ia adalah satu cara yang mudah untuk melihat pendapatan secara langsung dengan menggunakan borang.

  5. Dalam borang pendapatan, tambah pendapatan beli dan memegang untuk perbandingan, untuk menentukan strategi pendapatan tambahan.

  6. Anda boleh menyesuaikan lokasi jadual dengan mudah untuk menggabungkannya dengan strategi lain.

Analisis risiko strategi

Strategi ini mempunyai beberapa risiko:

  1. Risiko pasaran besar-besaran, dalam pasaran lembu yang berterusan dalam jangka masa yang panjang, mungkin sedikit kurang daripada strategi beli dan pegang. Anda boleh menyesuaikan kitaran purata dengan betul untuk mengoptimumkannya.

  2. Risiko whipsaw lebih tinggi dalam keadaan gegaran. Anda boleh mempertimbangkan untuk menambah syarat penapisan, seperti titik tinggi sebelum pecah, untuk mengurangkan transaksi berulang.

  3. Sistem garis purata tidak sesuai dengan kurva dan mungkin terlepas titik perubahan trend. Anda boleh mencuba pelbagai jenis penunjuk garis purata.

  4. Tidak mempertimbangkan mekanisme penarikan diri dari kerugian, terdapat risiko penarikan balik yang besar. Anda boleh menetapkan stop loss dinamik atau mempertimbangkan untuk menurunkan kedudukan.

  5. Untuk mengoptimumkan borang, pertimbangkan untuk menambah penunjuk risiko seperti nisbah tajam, penarikan balik maksimum.

Arah pengoptimuman strategi

Strategi ini boleh dioptimumkan dalam beberapa aspek:

  1. Mengoptimumkan parameter garis rata, menyesuaikan kitaran garis rata untuk menyesuaikan diri dengan keadaan pasaran yang berbeza.

  2. Tambah syarat penapisan, seperti titik tinggi sebelum pecah, untuk mengurangkan whipsaw.

  3. Cuba pelbagai jenis rata-rata, seperti rata-rata bergerak berat, rata-rata bergerak dua indeks, dan lain-lain.

  4. Menyertai mekanisme hentian kerugian, anda boleh menetapkan hentian dinamik atau mempertimbangkan untuk menurunkan kedudukan.

  5. Meningkatkan kandungan borang, menambah penunjuk seperti nisbah tajam, maksimum penarikan balik.

  6. Kaedah ini digunakan untuk menilai trend dalam kombinasi dengan indikator lain seperti MACD, Bollinger Bands dan sebagainya.

  7. Mengoptimumkan pengurusan kedudukan, menyesuaikan kedudukan mengikut keadaan pasaran yang dinamik.

  8. Uji prestasi operasi standard yang berbeza untuk mencari penggunaan yang terbaik.

ringkaskan

Strategi perdagangan garis rata ini secara keseluruhan lebih mudah, lebih langsung, melalui operasi trend penilaian garis rata, mempunyai keupayaan kawalan mundur yang kuat, sesuai untuk mengikuti pedagang gaya trend. Ruang pengoptimuman masih besar, dapat dioptimumkan dari sistem garis rata, mekanisme hentikan kerugian, pengurusan kedudukan, dan lain-lain, menjadikan strategi lebih sesuai dengan persekitaran pasaran yang rumit. Reka bentuk jadual menunjukkan strategi dan membandingkan pendapatan dan pembelian, secara visual menunjukkan nilai tambah strategi.

Kod sumber strategi
/*backtest
start: 2022-10-23 00:00:00
end: 2023-10-29 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Dannnnnnny

//@version=4
strategy(title="Quarterly Returns in Strategies vs Buy & Hold", initial_capital= 1000, overlay=true,default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, commission_value = 0.1)
maLength= input(400)

wma= vwma(hl2,maLength)
uptrend= rising(wma, 5)
downtrend= falling(wma,5)

plot(wma)

if uptrend
    strategy.entry("Buy", strategy.long)
else
    strategy.close("Buy")//

///////////////////
// QUARTERLY TABLE //
enableQuarterlyTable = input(title="Enable Quarterly Return table", type=input.bool, defval=false)
enableCompareWithMarket = input(title="Compare with Market Benchmark", type=input.bool, defval=false)
table_position = input(title="Table Position", type=input.string, defval='bottom_right', options=['bottom_right','bottom_left','top_right', 'top_left'])
precision = 2
new_quarter = ceil(month(time)/3)  != ceil(month(time[1])/3)
new_year  = year(time)  != year(time[1])

eq = strategy.equity

bar_pnl = eq / eq[1] - 1
bar_bh = (close-close[1])/close[1]

cur_quarter_pnl = 0.0
cur_year_pnl  = 0.0
cur_quarter_bh = 0.0
cur_year_bh  = 0.0

// Current Quarterly P&L
cur_quarter_pnl := new_quarter ? 0.0 : 
                 (1 + cur_quarter_pnl[1]) * (1 + bar_pnl) - 1 
cur_quarter_bh := new_quarter ? 0.0 : 
                 (1 + cur_quarter_bh[1]) * (1 + bar_bh) - 1

// Current Yearly P&L
cur_year_pnl := new_year ? 0.0 : 
                 (1 + cur_year_pnl[1]) * (1 + bar_pnl) - 1
cur_year_bh := new_year ? 0.0 : 
                 (1 + cur_year_bh[1]) * (1 + bar_bh) - 1

// Arrays to store Yearly and Quarterly P&Ls
var quarter_pnl  = array.new_float(0)
var quarter_time = array.new_int(0)
var quarter_bh  = array.new_float(0)

var year_pnl  = array.new_float(0)
var year_time = array.new_int(0)
var year_bh  = array.new_float(0)

end_time = false

end_time:= time_close + (time_close - time_close[1]) > timenow or barstate.islastconfirmedhistory

if (not na(cur_quarter_pnl[1]) and (new_quarter or end_time))
    if (end_time[1])
        array.pop(quarter_pnl)
        array.pop(quarter_time)
        
    array.push(quarter_pnl , cur_quarter_pnl[1])
    array.push(quarter_time, time[1])
    array.push(quarter_bh , cur_quarter_bh[1])

if (not na(cur_year_pnl[1]) and (new_year or end_time))
    if (end_time[1])
        array.pop(year_pnl)
        array.pop(year_time)
        
    array.push(year_pnl , cur_year_pnl[1])
    array.push(year_time, time[1])
    array.push(year_bh , cur_year_bh[1])

// Quarterly P&L Table    
var quarterly_table = table(na)

getCellColor(pnl, bh)  => 
    if pnl > 0
        if bh < 0 or pnl > 2 * bh
            color.new(color.green, transp = 20)
        else if pnl > bh
            color.new(color.green, transp = 50)
        else
            color.new(color.green, transp = 80)
    else
        if bh > 0 or pnl < 2 * bh
            color.new(color.red, transp = 20)
        else if pnl < bh
            color.new(color.red, transp = 50)
        else
            color.new(color.red, transp = 80)

if (end_time and enableQuarterlyTable)
    quarterly_table := table.new(table_position, columns = 14, rows = array.size(year_pnl) + 1, border_width = 1)

    table.cell(quarterly_table, 0,  0, "",     bgcolor = #cccccc)
    table.cell(quarterly_table, 1,  0, "Q1",  bgcolor = #cccccc)
    table.cell(quarterly_table, 2,  0, "Q2",  bgcolor = #cccccc)
    table.cell(quarterly_table, 3,  0, "Q3",  bgcolor = #cccccc)
    table.cell(quarterly_table, 4,  0, "Q4",  bgcolor = #cccccc)
    table.cell(quarterly_table, 5,  0, "Year", bgcolor = #999999)


    for yi = 0 to array.size(year_pnl) - 1
        table.cell(quarterly_table, 0,  yi + 1, tostring(year(array.get(year_time, yi))), bgcolor = #cccccc)
        
        y_color = getCellColor(array.get(year_pnl, yi), array.get(year_bh, yi))
        table.cell(quarterly_table, 5, yi + 1, enableCompareWithMarket ? tostring(round(array.get(year_pnl, yi) * 100, precision)) + " (" + tostring(round(array.get(year_bh, yi) * 100, precision)) + ")" : tostring(round(array.get(year_pnl, yi) * 100, precision)), bgcolor = y_color, text_color=#bfbfbf)
        
    for mi = 0 to array.size(quarter_time) - 1
        m_row   = year(array.get(quarter_time, mi))  - year(array.get(year_time, 0)) + 1
        m_col   = ceil(month(array.get(quarter_time, mi)) / 3)
        m_color = getCellColor(array.get(quarter_pnl, mi), array.get(quarter_bh, mi))
        
        table.cell(quarterly_table, m_col, m_row, enableCompareWithMarket ?  tostring(round(array.get(quarter_pnl, mi) * 100, precision)) + " (" + tostring(round(array.get(quarter_bh, mi) * 100,precision)) +")" : tostring(round(array.get(quarter_pnl, mi) * 100, precision)), bgcolor = m_color, text_color=#bfbfbf)