Strategi perdagangan rata-rata bergerak


Tanggal Pembuatan: 2023-10-30 15:53:25 Akhirnya memodifikasi: 2023-10-30 15:53:25
menyalin: 3 Jumlah klik: 611
1
fokus pada
1617
Pengikut

Strategi perdagangan rata-rata bergerak

Ringkasan

Strategi ini menggunakan sistem garis rata untuk menilai arah tren saat ini, sesuai dengan arah tren melakukan lebih banyak shorting. Ketika rata-rata naik, penilaian sebagai kepercayaan yang tinggi, melakukan lebih banyak; Ketika rata-rata turun, penilaian sebagai kepercayaan yang tinggi, shorting. Strategi ini terutama menggunakan sistem garis rata untuk menilai arah pergerakan pasar, termasuk strategi mengikuti tren.

Prinsip Strategi

  1. Hitung rata-rata bergerak berbobot untuk periode tertentu (default 400 periode) dengan vwma sebagai indikator rata-rata.

  2. Untuk menentukan apakah rata-rata linear vwma naik, jika naik, aturlah melihat sinyal uptrend; jika turun, aturlah melihat sinyal downtrend.

  3. Ketika uptrend benar, lakukan lebih banyak; ketika downtrend benar, kosongkan posisi.

  4. Perhitungkan strategi yield bar_pnl dan buy-hold yield bar_bh‬ untuk setiap garis K.

  5. Berdasarkan titik putus kuartal dan tahunan, perhitungkan strategi yield quarter_pnl dan yield year_pnl untuk setiap kuartal dan tahunan dan yield buy-hold quarter_bh dan year_bh yang sesuai.

  6. Tabel ini menampilkan strategi yield dan buy-hold yield untuk setiap kuartal setiap tahun.

Analisis Keunggulan Strategi

Strategi ini bergantung pada garis rata untuk menentukan arah tren pasar, dengan keuntungan sebagai berikut:

  1. Operasi sederhana, dengan indikator rata-rata untuk menilai pergerakan pasar, mudah dipahami dan dikuasai.

  2. Kekuatan pengendalian penarikan yang kuat, mengikuti operasi tren, dapat secara efektif mengendalikan kerugian di pasar non-trend.

  3. Parameter yang dapat dikonfigurasi lebih sedikit, terutama untuk menyesuaikan siklus rata-rata, mudah diuji dan dioptimalkan.

  4. Dengan menggunakan formulir, Anda bisa melihat langsung hasil dari hasil penjualan.

  5. Tambahkan pendapatan pembelian dan kepemilikan dalam tabel pendapatan untuk membandingkannya, sehingga Anda dapat menentukan strategi pendapatan tambahan.

  6. Fleksibel dalam pengaturan posisi tabel, mudah untuk dikombinasikan dengan kebijakan lain.

Analisis Risiko Strategi

Strategi ini juga memiliki beberapa risiko:

  1. Risiko pasar massal, dalam pasar banteng yang berlanjut dalam jangka panjang, mungkin sedikit lebih rendah dari strategi beli dan pegang. Anda dapat menyesuaikan siklus rata-rata dengan tepat untuk mengoptimalkan.

  2. Risiko whipsaw lebih besar dalam situasi yang bergolak. Anda dapat mempertimbangkan untuk menambahkan kondisi penyaringan, seperti titik tinggi sebelum terobosan, untuk mengurangi transaksi berulang.

  3. Sistem garis rata tidak cocok dengan kurva dan mungkin melewatkan titik balik tren. Anda dapat mencoba berbagai jenis indikator garis rata.

  4. Tidak mempertimbangkan mekanisme stop loss dan exit, ada risiko besar untuk menarik kembali. Anda dapat mengatur stop loss dinamis atau mempertimbangkan untuk menurunkan posisi.

  5. Untuk optimasi tabel, pertimbangkan untuk menambahkan indikator risiko seperti rasio tajam, maksimum penarikan balik.

Arah optimasi strategi

Strategi ini dapat dioptimalkan dalam beberapa hal:

  1. Optimalkan parameter rata-rata, menyesuaikan siklus rata-rata untuk menyesuaikan dengan lingkungan pasar yang berbeda.

  2. Tambahkan kondisi penyaringan, seperti titik tinggi sebelum terobosan, untuk mengurangi whipsaw.

  3. Cobalah berbagai jenis rata-rata, seperti rata-rata bergerak berbobot, rata-rata bergerak dua indeks, dan lain-lain.

  4. Anda dapat mengatur stop loss dinamis atau mempertimbangkan untuk menurunkan posisi.

  5. Meningkatkan konten tabel, menambahkan indikator seperti sharpe ratio, maksimum penarikan balik, dll.

  6. Dalam kombinasi dengan indikator lain, seperti MACD, Bollinger Bands, dan lain-lain untuk menilai tren.

  7. Mengoptimalkan manajemen posisi, menyesuaikan posisi secara dinamis sesuai dengan kondisi pasar.

  8. Uji operasional dari berbagai standar untuk mencari ruang lingkup yang optimal.

Meringkaskan

Strategi perdagangan linier ini secara keseluruhan lebih sederhana dan langsung, dengan operasi tren penilaian linier, kemampuan kontrol pengunduran diri yang kuat, cocok untuk mengikuti pedagang gaya tren. Ruang optimasi masih sangat besar, dapat dioptimalkan dari sistem linier, mekanisme stop loss, manajemen posisi, dan sebagainya, sehingga strategi lebih sesuai dengan lingkungan pasar yang kompleks. Desain tabel menunjukkan strategi dibandingkan dengan pendapatan dan pendapatan, secara visual menunjukkan nilai tambah strategi.

Kode 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)