Strategi Dagangan Pembalikan Pemindahan Momentum

Penulis:ChaoZhang, Tarikh: 2023-10-27 17:04:48
Tag:

img

Ringkasan

Strategi ini menggunakan purata bergerak mudah untuk menentukan arah trend dan pergi panjang dalam trend menaik dan pergi pendek dalam trend menurun untuk melaksanakan perdagangan pembalikan.

Logika Strategi

Strategi ini menggunakan Purata Bergerak Bertimbang (VWMA) untuk menentukan arah trend pasaran. Ia pergi panjang apabila VWMA meningkat dan pergi pendek apabila VWMA jatuh.

Secara khusus, ia mula-mula mengira VWMA dari tempoh tertentu, dan kemudian menilai jika VWMA telah meningkat selama lebih dari 5 hari. Jika ya, ia membuka kedudukan panjang. Jika VWMA telah jatuh selama lebih dari 5 hari, ia membuka kedudukan pendek. Keadaan penutupan adalah apabila arah VWMA berbalik selama lebih daripada 5 hari.

Untuk mengira pulangan bulanan dan tahunan, strategi mencatat keuntungan / kerugian setiap bulan dan tahun. Dengan membandingkan pulangan strategi ini dengan penanda aras pasaran, kita dapat melihat prestasi relatif.

Analisis Kelebihan

Kelebihan strategi ini termasuk:

  1. Menggunakan VWMA untuk menentukan trend boleh menapis bunyi pasaran dengan berkesan dan menangkap trend utama.

  2. Pembukaan kedudukan hanya selepas trend disahkan dapat mengelakkan risiko yang berkaitan dengan pembalikan trend.

  3. Perdagangan pembalikan boleh mendapat keuntungan dari kedua-dua aliran naik dan turun.

  4. Mencatatkan pulangan bulanan dan tahunan memudahkan penilaian prestasi strategi.

  5. Menambah pulangan penanda aras pasaran membolehkan perbandingan langsung antara strategi dan pasaran.

Analisis Risiko

Beberapa risiko strategi ini:

  1. Menggunakan VWMA untuk menentukan trend boleh tertinggal dan terlepas peluang pada awal trend.

  2. Posisi pembukaan hanya selepas pengesahan mungkin terlepas beberapa pergerakan.

  3. Perdagangan pembalikan perlu menetapkan stop loss, jika tidak, kerugian boleh meningkat.

  4. Fluktuasi pasaran yang ketara boleh mencetuskan stop loss dan tidak dapat mengekalkan keseluruhan trend.

  5. Penghakiman pembalikan trend mungkin tidak tepat, meningkatkan kerugian.

Arahan pengoptimuman

Beberapa aspek yang boleh mengoptimumkan strategi:

  1. Mengoptimumkan parameter tempoh VWMA untuk meningkatkan penentuan trend.

  2. Sesuaikan bilangan hari untuk mengesahkan trend, meningkatkan masa masuk dan keluar.

  3. Tambah strategi stop loss untuk mengawal kerugian perdagangan tunggal.

  4. Masukkan penunjuk lain untuk menentukan pembalikan, meningkatkan kepastian.

  5. Mengoptimumkan saiz kedudukan berdasarkan keadaan pasaran.

  6. Pertimbangkan kos dagangan, tetapkan sasaran keuntungan minimum.

Ringkasan

Logik keseluruhan strategi ini adalah mudah dan jelas, menggunakan VWMA untuk menentukan arah trend dan perdagangan pembalikan selepas pengesahan, yang dapat dengan berkesan mengesan pergerakan pasaran. Tetapi ia juga mempunyai beberapa risiko, yang memerlukan ujian lanjut dan penyesuaian parameter, menyesuaikan logik masuk / keluar, dan saiz kedudukan yang sesuai.


/*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)

Lebih lanjut