Strategi ini menggunakan rata-rata bergerak sederhana untuk menentukan arah tren dan pergi panjang dalam tren naik dan pergi pendek dalam tren turun untuk menerapkan perdagangan pembalikan.
Strategi ini menggunakan VWMA untuk menentukan arah tren pasar.
Secara khusus, pertama-tama menghitung VWMA dari periode tertentu, dan kemudian menilai apakah VWMA telah naik selama lebih dari 5 hari. Jika demikian, ia membuka posisi panjang. Jika VWMA telah turun selama lebih dari 5 hari, ia membuka posisi pendek. Kondisi penutupan adalah ketika arah VWMA berbalik selama lebih dari 5 hari.
Untuk menghitung pengembalian bulanan dan tahunan, strategi mencatat keuntungan / kerugian setiap bulan dan tahun. Dengan membandingkan pengembalian strategi ini dengan acuan pasar, kita dapat secara visual melihat kinerja relatif.
Keuntungan dari strategi ini meliputi:
Menggunakan VWMA untuk menentukan tren dapat menyaring kebisingan pasar secara efektif dan menangkap tren utama.
Posisi pembukaan hanya setelah tren dikonfirmasi dapat menghindari risiko yang terkait dengan pembalikan tren.
Perdagangan reversal dapat mendapat keuntungan dari tren naik dan turun.
Mencatat pengembalian bulanan dan tahunan memudahkan evaluasi kinerja strategi.
Menambahkan hasil pasar benchmark memungkinkan perbandingan langsung antara strategi dan pasar.
Beberapa risiko dari strategi ini:
Menggunakan VWMA untuk menentukan tren dapat tertinggal dan melewatkan peluang di awal tren.
Posisi pembukaan hanya setelah konfirmasi mungkin melewatkan beberapa gerakan.
Perdagangan reversal perlu mengatur stop loss, jika tidak kerugian bisa meningkat.
Fluktuasi pasar yang signifikan dapat memicu stop loss dan tidak dapat mempertahankan keseluruhan tren.
Penghakiman pembalikan tren mungkin tidak akurat, memperbesar kerugian.
Beberapa aspek yang dapat mengoptimalkan strategi:
Mengoptimalkan parameter periode VWMA untuk meningkatkan penentuan tren.
Sesuaikan jumlah hari untuk mengkonfirmasi tren, meningkatkan waktu masuk dan keluar.
Tambahkan strategi stop loss untuk mengendalikan kerugian perdagangan tunggal.
Masukkan indikator lain untuk menentukan pembalikan, meningkatkan kepastian.
Mengoptimalkan ukuran posisi berdasarkan kondisi pasar.
Pertimbangkan biaya perdagangan, tetapkan target keuntungan minimum.
Logika keseluruhan strategi ini sederhana dan jelas, menggunakan VWMA untuk menentukan arah tren dan perdagangan pembalikan setelah konfirmasi, yang dapat secara efektif melacak pergerakan pasar. Tetapi juga memiliki beberapa risiko, yang membutuhkan pengujian lebih lanjut dan penyesuaian parameter, penyesuaian logika masuk / keluar, dan ukuran posisi yang tepat.
/*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)