# How to Display Monthly Returns for PineScript Strategies?

Based on my experience, PineScript strategies output appears to be quite limited. Performance is displayed by the plot and measured on a trade-by-trade basis. It is not uncommon that you want to see something that is not available by default. So it can get quite tricky to understand when the strategy works well and when it does not.

### Build Additional Tools and Metrics With Tables

A simple solution might be to look at the monthly performance of the strategy. Unfortunately, there is no way to get it with basic TradingView tools,

A simple solution to this challenge might be to look at the monthly performance of the strategy. However, there is no way to do that with basic TradingView Tools. That’s where PineScript tables come in handy. They allow you to add metrics and tools and super easily evaluate the monthly performance of your strategy.

Here’s some simple PineScript code that I created just to do that. You only need to copy a few lines to your strategy and save it (then you’re good to go).

```///////////////////
// MONTHLY TABLE //

prec      = input(2, title = "Return Precision")

new_month = month(time) != month(time[1])
new_year  = year(time)  != year(time[1])

eq = strategy.equity

bar_pnl = eq / eq[1] - 1

cur_month_pnl = 0.0
cur_year_pnl  = 0.0

// Current Monthly P&L
cur_month_pnl := new_month ? 0.0 :
(1 + cur_month_pnl[1]) * (1 + bar_pnl) - 1

// Current Yearly P&L
cur_year_pnl := new_year ? 0.0 :
(1 + cur_year_pnl[1]) * (1 + bar_pnl) - 1

// Arrays to store Yearly and Monthly P&Ls
var month_pnl  = array.new_float(0)
var month_time = array.new_int(0)

var year_pnl  = array.new_float(0)
var year_time = array.new_int(0)

if (not na(cur_month_pnl[1]) and (new_month or barstate.islast))
array.push(month_pnl , cur_month_pnl[1])
array.push(month_time, time[1])

if (not na(cur_year_pnl[1]) and (new_year or barstate.islast))
array.push(year_pnl , cur_year_pnl[1])
array.push(year_time, time[1])

// Monthly P&L Table
var monthly_table = table(na)

if (barstate.islast)
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 = array.get(year_pnl, yi) > 0 ? color.new(color.green, transp = 50) : color.new(color.red, transp = 50)
table.cell(monthly_table, 13, yi + 1, tostring(round(array.get(year_pnl, yi) * 100, prec)), 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 = array.get(month_pnl, mi) > 0 ? color.new(color.green, transp = 70) : color.new(color.red, transp = 70)

table.cell(monthly_table, m_col, m_row, tostring(round(array.get(month_pnl, mi) * 100, prec)), bgcolor = m_color)```

Paste this code to the end of your strategy’s code then save and add it to the chart. You get a nice table displaying your strategy’s monthly returns on your chart.

Note: Make sure that your strategy is in V4 or V5 of PineScript because it won’t work in earlier versions.