Strategi Perdagangan Dua Arah Momentum Breakout


Tanggal Pembuatan: 2023-10-27 17:04:48 Akhirnya memodifikasi: 2023-10-27 17:04:48
menyalin: 0 Jumlah klik: 655
1
fokus pada
1617
Pengikut

Strategi Perdagangan Dua Arah Momentum Breakout

Ringkasan

Strategi ini menggunakan rata-rata bergerak sederhana untuk menentukan arah tren, melakukan lebih banyak dalam situasi yang terus meningkat, melakukan shorting dalam situasi yang terus menurun, dan melakukan perdagangan dua arah.

Prinsip Strategi

Strategi ini menggunakan rata-rata bergerak berbobot VWMA untuk menentukan arah tren pasar. Bila VWMA naik, lakukan over; bila VWMA turun, lakukan short.

Secara khusus, strategi pertama menghitung VWMA untuk periode tertentu, dan kemudian menilai apakah VWMA naik lebih dari 5 hari, jika ya, maka membuka posisi lebih banyak; Jika VWMA turun lebih dari 5 hari, maka membuka posisi kosong.

Untuk menghitung kinerja pendapatan bulanan dan tahunan, strategi mencatat pendapatan bulanan dan tahunan. Dengan membandingkan strategi ini dengan pendapatan acuan pasar, Anda dapat melihat secara langsung kinerja strategi terhadap pasar.

Analisis Keunggulan

Strategi ini memiliki keuntungan sebagai berikut:

  1. Menggunakan VWMA untuk menilai tren, Anda dapat secara efektif menyaring kebisingan pasar dan menangkap tren utama.

  2. Hanya membuka posisi setelah tren dikonfirmasi, Anda dapat menghindari risiko dari pembalikan tren.

  3. Dengan menggunakan perdagangan dua arah, Anda bisa mendapatkan keuntungan dari naik atau turunnya harga.

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

  5. Dengan menambahkan pendapatan acuan pasar ke dalam tabel pendapatan, Anda dapat secara intuitif membandingkan kinerja relatif strategi dengan pasar.

Analisis risiko

Strategi ini juga memiliki beberapa risiko:

  1. Menggunakan VWMA untuk menilai tren mungkin ada keterlambatan, mungkin kehilangan kesempatan di tahap awal tren.

  2. Jika Anda hanya membuka posisi setelah trend dikonfirmasi, Anda mungkin akan kehilangan bagian dari Movement.

  3. Perdagangan dua arah perlu menentukan titik berhenti, jika tidak, kerugian dapat meningkat.

  4. Pergeseran pasar besar dapat menyebabkan stop loss yang dipicu, tidak dapat memegang tren penuh.

  5. Penghitungan pembalikan tren mungkin tidak akurat, sehingga meningkatkan kerugian.

Arah optimasi

Strategi ini dapat dioptimalkan dengan:

  1. Optimalkan parameter siklus VWMA untuk meningkatkan penilaian tren.

  2. Mengubah jumlah hari untuk mengkonfirmasi tren dan memperbaiki waktu masuk dan keluar.

  3. Menambahkan strategi stop loss untuk mengendalikan kerugian tunggal.

  4. Ini adalah indikator lain yang dapat digunakan untuk menilai perubahan tren dan meningkatkan kepastian.

  5. Mengoptimalkan manajemen posisi, menyesuaikan posisi sesuai dengan kondisi pasar.

  6. Pertimbangkan biaya transaksi dan tetapkan MinimumProfit.

Meringkaskan

Strategi ini secara keseluruhan jelas dan sederhana, menggunakan VWMA untuk menentukan arah tren, perdagangan dua arah setelah konfirmasi tren, dapat secara efektif melacak pergerakan pasar. Namun, ada risiko tertentu, perlu pengujian dan pengoptimalan parameter lebih lanjut, penyesuaian logika keluar, dan pengendalian ukuran posisi yang tepat. Strategi ini didasarkan pada strategi perdagangan dua arah, meletakkan dasar untuk perdagangan kuantitatif, layak untuk penelitian dan perbaikan lebih lanjut.

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