
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.
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.
Strategi ini memiliki keuntungan sebagai berikut:
Menggunakan VWMA untuk menilai tren, Anda dapat secara efektif menyaring kebisingan pasar dan menangkap tren utama.
Hanya membuka posisi setelah tren dikonfirmasi, Anda dapat menghindari risiko dari pembalikan tren.
Dengan menggunakan perdagangan dua arah, Anda bisa mendapatkan keuntungan dari naik atau turunnya harga.
Mencatat pendapatan bulanan dan tahunan untuk menilai efektivitas strategi.
Dengan menambahkan pendapatan acuan pasar ke dalam tabel pendapatan, Anda dapat secara intuitif membandingkan kinerja relatif strategi dengan pasar.
Strategi ini juga memiliki beberapa risiko:
Menggunakan VWMA untuk menilai tren mungkin ada keterlambatan, mungkin kehilangan kesempatan di tahap awal tren.
Jika Anda hanya membuka posisi setelah trend dikonfirmasi, Anda mungkin akan kehilangan bagian dari Movement.
Perdagangan dua arah perlu menentukan titik berhenti, jika tidak, kerugian dapat meningkat.
Pergeseran pasar besar dapat menyebabkan stop loss yang dipicu, tidak dapat memegang tren penuh.
Penghitungan pembalikan tren mungkin tidak akurat, sehingga meningkatkan kerugian.
Strategi ini dapat dioptimalkan dengan:
Optimalkan parameter siklus VWMA untuk meningkatkan penilaian tren.
Mengubah jumlah hari untuk mengkonfirmasi tren dan memperbaiki waktu masuk dan keluar.
Menambahkan strategi stop loss untuk mengendalikan kerugian tunggal.
Ini adalah indikator lain yang dapat digunakan untuk menilai perubahan tren dan meningkatkan kepastian.
Mengoptimalkan manajemen posisi, menyesuaikan posisi sesuai dengan kondisi pasar.
Pertimbangkan biaya transaksi dan tetapkan MinimumProfit.
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.
/*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)