Chiến lược lịch trình hiệu suất hàng tháng PnL

Tác giả:ChaoZhang, Ngày: 2024-01-08 16:16:58
Tags:

img

Tổng quan

Chức năng chính của chiến lược này là theo dõi và hiển thị hiệu suất hàng tháng trong thời gian thực. Nó sẽ cập nhật lợi nhuận và lỗ của mỗi tháng trong một bảng trong thời gian thực.

Nguyên tắc

Chiến lược đạt được việc theo dõi hiệu suất hàng tháng thông qua các bước sau:

  1. Định nghĩa các biến để ghi lại liệu có giao dịch đóng trong tháng này.
  2. Xác định các biến để ghi lại giá trị lợi nhuận và lỗ cụ thể của mỗi tháng.
  3. Định nghĩa các biến để ghi lại tháng tương ứng với thời gian.
  4. Khi có các giao dịch đóng trong tháng này, ghi lại PnL hàng tháng và tháng vào mảng tương ứng.
  5. Hiển thị tiêu đề tháng ở các vị trí được chỉ định trong bảng.
  6. Đi qua mảng PnL hàng tháng và hiển thị các giá trị PnL trong các cột tháng tương ứng trong bảng.
  7. Hiển thị thông tin năm tương ứng cùng một lúc.
  8. Tóm lại PnL của mỗi năm.
  9. Sử dụng màu sắc để phân biệt PnL dương và âm.

Trên đây là các bước cơ bản và nguyên tắc làm việc của chiến lược này.

Phân tích lợi thế

Loại chiến lược theo dõi hiệu suất hàng tháng này có những lợi thế sau:

  1. Cập nhật thời gian thực để xem trạng thái PnL hàng tháng mới nhất bất cứ lúc nào.
  2. Hiển thị trực quan PnL tháng cụ thể trong bảng.
  3. Nhỏ để thấy chi tiết của mỗi tháng rõ ràng.
  4. So sánh trực quan bằng cách sử dụng màu sắc để tương phản PnL hàng tháng một cách trực quan hơn.
  5. Tổng hợp thống kê cũng cung cấp tổng hợp PnL hàng năm.
  6. Hiển thị tùy chỉnh để điều chỉnh vị trí bàn, kích thước vv

Phân tích rủi ro

Chiến lược này cũng có một số rủi ro:

  1. Lý thuyết phức tạp có thể gây ra dữ liệu không chính xác do lỗi.
  2. Việc làm mới bảng quá thường xuyên có thể ảnh hưởng đến hiệu suất.
  3. Lưu trữ dữ liệu mảng ít hiệu quả hơn.
  4. Tính toán chuyển đổi thời gian và tháng có thể sai.

Các rủi ro có thể được giảm bằng cách:

  1. Đánh giá mã nghiêm ngặt để đảm bảo logic chính xác.
  2. Tối ưu hóa tần suất làm mới để tránh làm mới quá mức.
  3. Sử dụng các cấu trúc dữ liệu hiệu quả hơn để lưu trữ dữ liệu.
  4. Thêm xử lý ngoại lệ cho chuyển đổi thời gian và tháng.

Tối ưu hóa

Tối ưu hóa chiến lược này:

  1. Sử dụng các cấu trúc dữ liệu hiệu quả hơn như từ điển để lưu trữ dữ liệu hàng tháng.
  2. Thêm tính lợi nhuận hàng năm.
  3. Thêm các số liệu khác như tỷ lệ thay đổi.
  4. Hiển thị đường cong trở lại.
  5. Hỗ trợ phạm vi thời gian tùy chỉnh cho thống kê.
  6. Hỗ trợ xuất dữ liệu sang tệp CSV.

Những điều này có thể cải thiện chức năng của chiến lược và trải nghiệm người dùng.

Kết luận

Chiến lược này đạt được chức năng cốt lõi theo dõi và hiển thị lợi nhuận hàng tháng theo thời gian thực bằng cách sử dụng mảng và bảng. Nó đơn giản, hiệu quả và dễ sử dụng. Nó cũng có một số lợi thế nhưng vẫn có một số rủi ro để ngăn ngừa. Với tối ưu hóa trong logic và hiệu suất, nó có thể trở nên hoàn hảo và mạnh mẽ hơn. Nhìn chung là một chiến lược theo dõi hiệu suất hàng tháng rất thực tế.


/*backtest
start: 2023-01-01 00:00:00
end: 2024-01-07 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © MAURYA_ALGO_TRADER

//@version=5
strategy("Monthly Performance", overlay=true)

period = input(20, "Length")

longCondition =   close > high[20]  //ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)

shortCondition = close < low[20]  //ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
if (shortCondition)
    strategy.entry("My Short Entry Id", strategy.short)



// Copy below code to end of the desired strategy script
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//                                 monthly pnl performance  by Dr. Maurya @MAURYA_ALGO_TRADER                        //
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
show_performance = input.bool(true, 'Show Monthly Monthly Performance ?', group='Monthly Performance')

dash_loc_mp = input("Bottom Right","Location"  ,options=["Top Right","Bottom Right","Top Left","Bottom Left", "Middle Right","Bottom Center"]  ,group='Monthly Performance', inline = "performance")

text_size_mp = input('Small',"Size"  ,options=["Tiny","Small","Normal","Large"]  ,group='Monthly Performance', inline = "performance")

var table_position_mp = dash_loc_mp == 'Top Left' ? position.top_left :
  dash_loc_mp == 'Bottom Left' ? position.bottom_left :
  dash_loc_mp == 'Middle Right' ? position.middle_right :
  dash_loc_mp == 'Bottom Center' ? position.bottom_center :
  dash_loc_mp == 'Top Right' ? position.top_right : position.bottom_right
  
var table_text_size_mp = text_size_mp == 'Tiny' ? size.tiny :
  text_size_mp == 'Small' ? size.small :
  text_size_mp == 'Normal' ? size.normal : size.large

/////////////////
text_c = color.white

/////////////////////////////////////////////

// var bool new_month = na
new_month = ta.change(month) //> 0 ? true : false
newest_month = new_month and strategy.closedtrades >= 1
strategy.initial_capital = 50000
// profit
only_profit = strategy.netprofit
initial_balance = strategy.initial_capital

// month number
var int month_number = na
month_number := (ta.valuewhen(newest_month, month(time), 0)) //and month(time) > 1 ? (ta.valuewhen(newest_month, month(time), 0) - 1) :  12 //1 to 12

//month_year
var int month_time = na
month_time := ta.valuewhen(newest_month, time, 0) - 2419200000 


var int m_counter = 0
if newest_month
    m_counter += 1



// current month values
var bool new_year = na
new_year := ta.change(year)
curr_m_pnl = only_profit - nz(ta.valuewhen(newest_month, only_profit, 0), 0)
curr_m_number = newest_month ? ta.valuewhen(newest_month, month(time), 0) : month(time)
curr_y_pnl = (only_profit - nz(ta.valuewhen(new_year, only_profit, 0),0)) 



var float [] net_profit_array = array.new_float()
var int [] month_array = array.new_int()
var int [] month_time_array = array.new_int()


if newest_month
    array.push(net_profit_array, only_profit)
    array.push(month_array, month_number)
    array.push(month_time_array, month_time)



var float [] y_pnl_array = array.new_float()
var int [] y_number_array = array.new_int()
var int [] y_time_array = array.new_int()

newest_year = ta.change(year) and strategy.closedtrades >= 1
get_yearly_pnl = nz(ta.valuewhen(newest_year, strategy.netprofit, 0) - nz(ta.valuewhen(newest_year, strategy.netprofit, 1), 0), 0)
get_m_year = ta.valuewhen(newest_year, year(time), 1)
get_y_time = ta.valuewhen(newest_year, time, 0)

if newest_year
    array.push(y_pnl_array, get_yearly_pnl)
    array.push(y_number_array, get_m_year)
    array.push(y_time_array, get_y_time)
var float monthly_profit = na
var int column_month_number = na
var int row_month_time = na

 


var testTable = table.new(position = table_position_mp, columns = 14, rows = 40, bgcolor = color.rgb(7, 226, 242, 38), border_color = color.white, border_width = 1)
if barstate.islastconfirmedhistory and show_performance
    table.cell(table_id = testTable, column = 0, row = 0, text = "YEAR", text_color = text_c, text_size=table_text_size_mp)
    table.cell(table_id = testTable, column = 1, row = 0, text = "JAN", text_color = text_c, text_size=table_text_size_mp)
    table.cell(table_id = testTable, column = 2, row = 0, text = "FEB", text_color = text_c, text_size=table_text_size_mp)
    table.cell(table_id = testTable, column = 3, row = 0, text = "MAR", text_color = text_c, text_size=table_text_size_mp)
    table.cell(table_id = testTable, column = 4, row = 0, text = "APR", text_color = text_c, text_size=table_text_size_mp)
    table.cell(table_id = testTable, column = 5, row = 0, text = "MAY", text_color = text_c, text_size=table_text_size_mp)
    table.cell(table_id = testTable, column = 6, row = 0, text = "JUN", text_color = text_c, text_size=table_text_size_mp)
    table.cell(table_id = testTable, column = 7, row = 0, text = "JUL", text_color = text_c, text_size=table_text_size_mp)
    table.cell(table_id = testTable, column = 8, row = 0, text = "AUG", text_color = text_c, text_size=table_text_size_mp)
    table.cell(table_id = testTable, column = 9, row = 0, text = "SEP", text_color = text_c, text_size=table_text_size_mp)
    table.cell(table_id = testTable, column = 10, row = 0, text = "OCT", text_color = text_c, text_size=table_text_size_mp)
    table.cell(table_id = testTable, column = 11, row = 0, text = "NOV", text_color = text_c, text_size=table_text_size_mp)
    table.cell(table_id = testTable, column = 12, row = 0, text = "DEC", text_color = text_c, text_size=table_text_size_mp)
    table.cell(table_id = testTable, column = 13, row = 0, text = "YEAR P/L", text_color = text_c, text_size=table_text_size_mp)

    for i = 0 to (array.size(y_number_array) == 0 ? na : array.size(y_number_array) - 1)
        row_y = year(array.get(y_time_array, i)) - year(array.get(y_time_array, 0)) + 1
        table.cell(table_id = testTable, column = 13, row = row_y, text = str.tostring(array.get(y_pnl_array , i), "##.##") + '\n' + '(' + str.tostring(array.get(y_pnl_array , i)*100/initial_balance, "##.##") + ' %)', bgcolor = array.get(y_pnl_array , i) > 0 ? color.green : array.get(y_pnl_array , i) < 0 ? color.red : color.gray, text_color = color.rgb(0, 0, 0), text_size=table_text_size_mp)
    curr_row_y = array.size(month_time_array) == 0 ? 1 : (year(array.get(month_time_array, array.size(month_time_array) - 1))) - (year(array.get(month_time_array, 0))) + 1
    table.cell(table_id = testTable, column = 13, row = curr_row_y, text = str.tostring(curr_y_pnl, "##.##") + '\n' + '(' + str.tostring(curr_y_pnl*100/initial_balance, "##.##") + ' %)', bgcolor = curr_y_pnl > 0 ? color.green : curr_y_pnl < 0 ? color.red : color.gray, text_color = color.rgb(0, 0, 0), text_size=table_text_size_mp)
    

    for i = 0 to (array.size(net_profit_array) == 0 ? na : array.size(net_profit_array) - 1)
        monthly_profit := i > 0 ? ( array.get(net_profit_array, i) - array.get(net_profit_array, i - 1) ) : array.get(net_profit_array, i) 
        column_month_number := month(array.get(month_time_array, i)) 
        row_month_time :=((year(array.get(month_time_array, i))) - year(array.get(month_time_array, 0)) ) + 1 
        table.cell(table_id = testTable, column = column_month_number, row = row_month_time, text = str.tostring(monthly_profit, "##.##") + '\n' + '(' + str.tostring(monthly_profit*100/initial_balance, "##.##") + ' %)', bgcolor = monthly_profit > 0 ? color.green : monthly_profit < 0 ? color.red : color.gray, text_color = text_c, text_size=table_text_size_mp)
        table.cell(table_id = testTable, column = 0, row =row_month_time, text = str.tostring(year(array.get(month_time_array, i)), "##.##"), text_color = text_c, text_size=table_text_size_mp)
       
    curr_row_m = array.size(month_time_array) == 0 ? 1 : (year(array.get(month_time_array, array.size(month_time_array) - 1))) - (year(array.get(month_time_array, 0))) + 1
    table.cell(table_id = testTable, column = curr_m_number, row = curr_row_m, text = str.tostring(curr_m_pnl, "##.##") + '\n' + '(' + str.tostring(curr_m_pnl*100/initial_balance, "##.##") + ' %)', bgcolor = curr_m_pnl > 0 ? color.green : curr_m_pnl < 0 ? color.red : color.gray, text_color = text_c, text_size=table_text_size_mp)
    table.cell(table_id = testTable, column = 0, row =curr_row_m, text = str.tostring(year(time), "##.##"), text_color = text_c, text_size=table_text_size_mp)

//============================================================================================================================================================================

Thêm nữa