Strategi Perdagangan Dwi Arah Momentum Breakout


Tarikh penciptaan: 2023-10-27 17:04:48 Akhirnya diubah suai: 2023-10-27 17:04:48
Salin: 0 Bilangan klik: 655
1
fokus pada
1617
Pengikut

Strategi Perdagangan Dwi Arah Momentum Breakout

Gambaran keseluruhan

Strategi ini menggunakan purata bergerak mudah untuk menentukan arah trend, melakukan lebih banyak dalam keadaan kenaikan yang berterusan, melakukan shorting dalam keadaan penurunan yang berterusan, dan melakukan perdagangan dua hala.

Prinsip Strategi

Strategi ini menggunakan purata bergerak bertimbangan VWMA untuk menentukan arah trend pasaran. Apabila VWMA naik, buat lebih banyak; apabila VWMA turun, buat kurang.

Khususnya, strategi pertama mengira VWMA untuk satu tempoh tertentu, kemudian menilai sama ada VWMA meningkat lebih dari 5 hari, jika ya, ambil kedudukan lebih banyak; jika VWMA turun lebih dari 5 hari, ambil kedudukan kosong. Syarat kedudukan kosong adalah pengalihan arah VWMA lebih dari 5 hari selepas kedudukan kosong.

Untuk mengira prestasi pendapatan bulanan dan tahunan, strategi merekodkan pendapatan bulanan dan tahunan. Dengan membandingkan strategi ini dengan pendapatan asas pasaran, anda dapat melihat secara langsung bagaimana strategi itu berlawanan dengan pasaran.

Analisis kelebihan

Strategi ini mempunyai kelebihan berikut:

  1. Menggunakan VWMA untuk menilai trend, anda boleh menyaring bunyi pasaran dengan berkesan untuk menangkap trend utama.

  2. Hanya membuka kedudukan selepas trend disahkan, anda boleh mengelakkan risiko perubahan trend.

  3. Dengan menggunakan perdagangan dua hala, anda boleh mendapat keuntungan sama ada harga naik atau turun.

  4. Mencatat pendapatan bulanan dan tahunan untuk menilai kesan strategi.

  5. Menambah pendapatan asas pasaran ke dalam jadual pendapatan, anda boleh membandingkan strategi dengan prestasi relatif pasaran.

Analisis risiko

Strategi ini juga mempunyai risiko:

  1. Menggunakan VWMA untuk menilai trend mungkin terlewat dan mungkin terlepas peluang untuk memulakan trend.

  2. Jika anda membuka posisi hanya selepas trend telah disahkan, anda mungkin akan terlepas bahagian Movement.

  3. Perdagangan dua hala perlu menentukan titik berhenti, jika tidak, kerugian boleh meningkat.

  4. Kelemahan dalam pasaran besar boleh menyebabkan stop loss tercetus dan tidak dapat mengekalkan trend sepenuhnya.

  5. Penghakiman perubahan trend mungkin tidak tepat, menyebabkan kerugian meningkat.

Arah pengoptimuman

Strategi ini boleh dioptimumkan dengan:

  1. Mengoptimumkan parameter kitaran VWMA dan meningkatkan penilaian trend.

  2. Menyesuaikan jumlah hari untuk mengesahkan trend dan meningkatkan masa masuk dan keluar.

  3. Tambah strategi hentikan kerugian untuk mengawal kerugian tunggal.

  4. Ia juga boleh digunakan untuk menilai perubahan trend, dan meningkatkan kepastian.

  5. Mengoptimumkan pengurusan kedudukan, menyesuaikan kedudukan mengikut keadaan pasaran.

  6. Berfikir tentang kos urus niaga dan menetapkan MinimumProfit.

ringkaskan

Strategi ini mempunyai pemikiran yang jelas dan mudah, menggunakan VWMA untuk menentukan arah trend, perdagangan dua hala selepas trend disahkan, dapat mengesan pergerakan pasaran dengan berkesan. Tetapi ada risiko tertentu, perlu menguji dan mengoptimumkan parameter lebih lanjut, menyesuaikan logik keluar, dan mengawal saiz kedudukan dengan betul. Strategi ini berdasarkan strategi perdagangan dua hala, meletakkan asas untuk perdagangan kuantitatif, layak untuk penyelidikan dan penambahbaikan lebih lanjut.

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

//@version=4
strategy(title="Monthly Returns in Strategies with Market Benchmark", shorttitle="Monthly P&L With Market", 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")//

///////////////////
// MONTHLY TABLE //

new_month = month(time) != month(time[1])
new_year  = year(time)  != year(time[1])

eq = strategy.equity

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

cur_month_pnl = 0.0
cur_year_pnl  = 0.0
cur_month_bh = 0.0
cur_year_bh  = 0.0

// Current Monthly P&L
cur_month_pnl := new_month ? 0.0 : 
                 (1 + cur_month_pnl[1]) * (1 + bar_pnl) - 1 
cur_month_bh := new_month ? 0.0 : 
                 (1 + cur_month_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 Monthly P&Ls
var month_pnl  = array.new_float(0)
var month_time = array.new_int(0)
var month_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)

last_computed = false

if (not na(cur_month_pnl[1]) and (new_month or time_close + (time_close - time_close[1]) > timenow or barstate.islastconfirmedhistory))
    if (last_computed[1])
        array.pop(month_pnl)
        array.pop(month_time)
        
    array.push(month_pnl , cur_month_pnl[1])
    array.push(month_time, time[1])
    array.push(month_bh , cur_month_bh[1])

if (not na(cur_year_pnl[1]) and (new_year or time_close + (time_close - time_close[1]) > timenow or barstate.islastconfirmedhistory))
    if (last_computed[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])

last_computed := (time_close + (time_close - time_close[1]) > timenow or barstate.islastconfirmedhistory) ? true : nz(last_computed[1])

// Monthly P&L Table    
var monthly_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
            color.new(color.red, transp = 20)
        else if pnl < bh
            color.new(color.red, transp = 50)
        else
            color.new(color.red, transp = 80)

if last_computed
    monthly_table := table.new(position.bottom_right, columns = 14, rows = array.size(year_pnl) + 1, border_width = 1)

    table.cell(monthly_table, 0,  0, "",     bgcolor = #cccccc)
    table.cell(monthly_table, 1,  0, "Jan",  bgcolor = #cccccc)
    table.cell(monthly_table, 2,  0, "Feb",  bgcolor = #cccccc)
    table.cell(monthly_table, 3,  0, "Mar",  bgcolor = #cccccc)
    table.cell(monthly_table, 4,  0, "Apr",  bgcolor = #cccccc)
    table.cell(monthly_table, 5,  0, "May",  bgcolor = #cccccc)
    table.cell(monthly_table, 6,  0, "Jun",  bgcolor = #cccccc)
    table.cell(monthly_table, 7,  0, "Jul",  bgcolor = #cccccc)
    table.cell(monthly_table, 8,  0, "Aug",  bgcolor = #cccccc)
    table.cell(monthly_table, 9,  0, "Sep",  bgcolor = #cccccc)
    table.cell(monthly_table, 10, 0, "Oct",  bgcolor = #cccccc)
    table.cell(monthly_table, 11, 0, "Nov",  bgcolor = #cccccc)
    table.cell(monthly_table, 12, 0, "Dec",  bgcolor = #cccccc)
    table.cell(monthly_table, 13, 0, "Year", bgcolor = #999999)


    for yi = 0 to array.size(year_pnl) - 1
        table.cell(monthly_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(monthly_table, 13, yi + 1, tostring(round(array.get(year_pnl, yi) * 100)) + " (" + tostring(round(array.get(year_bh, yi) * 100)) + ")", bgcolor = y_color)
        
    for mi = 0 to array.size(month_time) - 1
        m_row   = year(array.get(month_time, mi))  - year(array.get(year_time, 0)) + 1
        m_col   = month(array.get(month_time, mi)) 
        m_color = getCellColor(array.get(month_pnl, mi), array.get(month_bh, mi))
        
        table.cell(monthly_table, m_col, m_row, tostring(round(array.get(month_pnl, mi) * 100)) + " (" + tostring(round(array.get(month_bh, mi) * 100)) +")", bgcolor = m_color)