Indicator · Pine Script v5 · On the chart

Portfolio Laboratory [Kioseff Trading]

by regalouisei· code credited to KioseffTrading

This indicator enables traders to construct and evaluate a custom multi-asset portfolio directly on the chart.

View on GitHub

GitHub stars2on the repository
Pine versionv5runs as is
Lines of code1,297
Settings40inputs
LicenceNone statedfile: MPL-2.0
Last update8 months ago25 Feb 2026

Add It to Your TradingView Chart

  1. 1Copy the scriptPress Copy script above, or the copy button on the code below.
  2. 2Open the Pine EditorOpen a TradingView chart and choose Pine Editor at the bottom of the screen.
  3. 3Paste over the templateCreate a new indicator, select all of the template text and paste. Press Save and give it a name.
  4. 4Add it to the chartPress Add to chart, then adjust the settings with the gear icon next to its name.

Source Code

1,297 lines of Pine Script v5 from pinescript/editors_picks/portfolio-laboratory-kioseff-trading.pine, published under MPL-2.0 (file header). Keep the author's credit and licence lines when you reuse it.

portfolio-laboratory-kioseff-trading.pine
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © KioseffTrading


//@version=5

//  ________________________________________________
// |                                               |  
// |       ---------------------------------       | 
// |      | K̲ i̲ o̲ s̲ e̲ f̲ f̲     T̲ r̲ a̲ d̲ i̲ n̲ g |      | 
// |      |                                 |      |  
// |      | ƃ u ᴉ p ɐ ɹ ꓕ     ⅎ ⅎ ǝ s o ᴉ ꓘ |      |  
// |       --------------------------------        |  
// |                                               | 
// |_______________________________________________|


indicator(title = "Portfolio Laboratory [Kioseff Trading]", overlay = true, precision = 2, max_labels_count = 500, max_lines_count = 500)

import TradingView/ta/1 as ta


lin                                            = input.string(defval = "Yes", title = "Show Percentage Line Performance? ", options = ["Yes", "No"])
tab                                            = input.string(defval = "Yes", title = "Show Table? ", options = ["Yes", "No"])
col                                            = input.string(defval = "No", title = "Color Table Cells on Better Performer?", options = ["Yes", "No"])
dex                                            = input.string(defval = "SPX", title = "Index Measured Against", options = ["SPX", "NASDAQ", "RUT", "NIFTY", "FTSE", "NIKKEI", "HSI", "DAX", "TSX", "IBOV"])
plo                                            = input.string(defval = "Yes", title = "Plot Index Return?", options = ["Yes", "No"])



// _______________________________________________________
//
// Portoflio Asset Selection 
// _______________________________________________________  


asset1                                         = input.symbol(title="", group = "Asset 1", defval="AAPL", inline="1")
wX1                                            = input.float(title="Return Weight", defval = 10, minval = 0.0, step = 0.1, maxval = 100.0, inline="1") 
ls1                                            = input.string(title = "Direction (Long/Short)", defval = "Long", options = ["Long", "Short"], inline="1")             
                               
asset2                                         = input.symbol(title="", group = "Asset 2", defval="MSFT", inline="2")
wX2                                            = input.float(title="Return Weight", defval = 10, minval = 0.0, step = 0.1, maxval = 100.0, inline="2") 
ls2                                            = input.string(title = "Direction (Long/Short)", defval = "Long", options = ["Long", "Short"], inline="2")             
                               
asset3                                         = input.symbol(title="", group = "Asset 3", defval="GOOG", inline="3")
wX3                                            = input.float(title="Return Weight", defval = 10, minval = 0.0, step = 0.1, maxval = 100.0, inline="3") 
ls3                                            = input.string(title = "Direction (Long/Short)", defval = "Long", options = ["Long", "Short"], inline="3")             
                               
asset4                                         = input.symbol(title="", group = "Asset 4", defval="AMZN", inline="4")
wX4                                            = input.float(title="Return Weight", defval = 10, minval = 0.0, step = 0.1, maxval = 100.0, inline="4") 
ls4                                            = input.string(title = "Direction (Long/Short)", defval = "Long", options = ["Long", "Short"], inline="4")             
                               
asset5                                         = input.symbol(title="", group = "Asset 5", defval="META", inline="5")
wX5                                            = input.float(title="Return Weight", defval = 10, minval = 0.0, step = 0.1, maxval = 100.0, inline="5") 
ls5                                            = input.string(title = "Direction (Long/Short)", defval = "Long", options = ["Long", "Short"], inline="5")             
                               
asset6                                         = input.symbol(title="", group = "Asset 6", defval="T", inline="6")
wX6                                            = input.float(title="Return Weight", defval = 10, minval = 0.0, step = 0.1, maxval = 100.0, inline="6") 
ls6                                            = input.string(title = "Direction (Long/Short)", defval = "Long", options = ["Long", "Short"], inline="6")             
                           
asset7                                         = input.symbol(title="", group = "Asset 7", defval="V", inline="7")
wX7                                            = input.float(title="Return Weight", defval = 10, minval = 0.0, step = 0.1, maxval = 100.0, inline="7") 
ls7                                            = input.string(title = "Direction (Long/Short)", defval = "Long", options = ["Long", "Short"], inline="7")             
                               
asset8                                         = input.symbol(title="", group = "Asset 8", defval="MA", inline="8")
wX8                                            = input.float(title="Return Weight", defval = 10, minval = 0.0, step = 0.1, maxval = 100.0, inline="8") 
ls8                                            = input.string(title = "Direction (Long/Short)", defval = "Long", options = ["Long", "Short"], inline="8")             
                           
asset9                                         = input.symbol(title="", group = "Asset 9", defval="TSLA", inline="9")
wX9                                            = input.float(title="Return Weight", defval = 10, minval = 0.0, step = 0.1, maxval = 100.0, inline="9") 
ls9                                            = input.string(title = "Direction (Long/Short)", defval = "Long", options = ["Long", "Short"], inline="9")             
                               
asset10                                        = input.symbol(title="", group = "Asset 10", defval="X", inline="10")
wX10                                           = input.float(title="Return Weight", defval = 10, minval = 0.0, step = 0.1, maxval = 100.0, inline="10") 
ls10                                           = input.string(title = "Direction (Long/Short)", defval = "Long", options = ["Long", "Short"], inline="10")             


// _______________________________________________________
//
// Identifiers                   
// _______________________________________________________  

var float    [] d                               = array.new_float()
var float    [] x                               = array.new_float(10)
var float    [] x1                              = array.new_float()
var float    [] test                            = array.new_float(1)
var float    [] currentR                        = array.new_float()
var float    [] min                             = array.new_float(250)
var float    [] es                              = array.new_float()
var float    [] benMin                          = array.new_float(250)
var float    [] benEs                           = array.new_float()
var float    [] weight                          = array.new_float(10)
var float    [] sH                              = array.new_float()
var float    [] avg                             = array.new_float()
var float    [] sHigh                           = array.new_float()
var float    [] SsH                             = array.new_float()
var float    [] Savg                            = array.new_float()
var float    [] SsHigh                          = array.new_float()
var float    [] dd                              = array.new_float()
var float    [] sDD                             = array.new_float()
var float    [] w_Eight                         = array.new_float(10)
var float    [] w_Eight1                        = array.new_float(10)
var label    [] port                            = array.new_label(1)
var label    [] asset                           = array.new_label(1)
var label    [] assetDiff                       = array.new_label(1)
var label    [] mon                             = array.new_label()
var label    [] mon1                            = array.new_label()
var label    [] mon2                            = array.new_label()
var label    [] startDate                       = array.new_label()
var label    [] inL                             = array.new_label(1)
var line     [] pX                              = array.new_line(1)
var line     [] pX1                             = array.new_line(1)
var line     [] pX2                             = array.new_line(1)
var line     [] pX3                             = array.new_line(1)
var line     [] pX4                             = array.new_line(1)
var line     [] inLI                            = array.new_line(1)
var linefill [] pXL                             = array.new_linefill()
var linefill [] pXL1                            = array.new_linefill()
var string   [] strin                           = array.new_string(10)



var float w1                                    = wX1  
var float w2                                    = wX2
var float w3                                    = wX3
var float w4                                    = wX4
var float w5                                    = wX5
var float w6                                    = wX6
var float w7                                    = wX7
var float w8                                    = wX8
var float w9                                    = wX9
var float w10                                   = wX10  
var float xY                                    = 0.0
var bool cond2                                  = false 


matS                                            = ""
matX                                            = ""


// _______________________________________________________
//
// Percentage Gain/Loss Calculation                   
// _______________________________________________________  

PnLz(x, y) => 
    ((x / y) - 1)

PnL(x, y) => 
    ((x / y[1]) - 1)

// _______________________________________________________
//
// Time Window()
// _______________________________________________________  

sYear                                           = input.int(defval = 2018, title = "Calculation Start Year")
sMonth                                          = input.int(defval = 01, title = "Calculation Start Month", maxval = 12, minval = 1)
sDay                                            = input.int(defval = 02, title = "Calculation Start Day", maxval = 31, minval = 1)
eYear                                           = input.int(defval = 2080, title = "Calculation End Year")
eMonth                                          = input.int(defval = 01, title = "Calculation End Month", maxval = 12, minval = 1)
eDay                                            = input.int(defval = 02, title = "Calculation End Day", maxval = 31, minval = 1)
start()                                         => time >= timestamp(sYear, sMonth, sDay, 00, 00) and time <= timestamp(eYear, eMonth, eDay, 23, 59)
z                                               = ta.valuewhen(start()[1] == false and start() == true, close, 0)
zZ                                              = ta.valuewhen(year(time) == sYear and month(time) == sMonth and dayofmonth(time) == sDay, close, 0)


// _______________________________________________________
//
// Tuples                    
// _______________________________________________________


tuple(x, y) => 
    
    First   = x == "Long" ? nz(PnLz(close, z), -100) : nz(PnLz(close, z), -100) * -1 
    Second  = x == "Long" ? PnL(close, close) * y : PnL(close, close) * y * -1, 
    Third   = x == "Long" ? ((close / close[252]) - 1) * y : ((close / close[252]) - 1) * y * -1
    Fourth  = close
    Fifth   = syminfo.type
    Sixth   = ta.cagr(timestamp(sYear, sMonth, sDay), zZ, time <= timestamp(eYear, eMonth, eDay) ? time : timestamp(eYear, eMonth, eDay), close) * (y / 100)
    var int [] count   = array.new_int()

    if year(time) >= sYear and month(time) != month(time[1])
        array.push(count, 1)
    
    Seventh = (math.pow((close / zZ), 1 / (array.sum(count) - 1)) - 1) 
    
    [First, Second, Third, Fourth, Fifth, Sixth, Seventh]

request()  => tuple(ls1, wX1)
request1() => tuple(ls2, wX2)
request2() => tuple(ls3, wX3)
request3() => tuple(ls4, wX4)
request4() => tuple(ls5, wX5)
request5() => tuple(ls6, wX6)
request6() => tuple(ls7, wX7)
request7() => tuple(ls8, wX8)
request8() => tuple(ls9, wX9)
request9() => tuple(ls10, wX10)

// _______________________________________________________
//
// Data Requests()                    
// _______________________________________________________


[symcalc01x, f , annual ,  c,  type,  cagr, cmgr ]                   =  request.security(asset1, timeframe.period, request() ) 
[symcalc02x, f1, annual1, c1, type1, cagr1, cmgr1]                   =  request.security(asset2, timeframe.period, request1()) 
[symcalc03x, f2, annual2, c2, type2, cagr2, cmgr2]                   =  request.security(asset3, timeframe.period, request2()) 
[symcalc04x, f3, annual3, c3, type3, cagr3, cmgr3]                   =  request.security(asset4, timeframe.period, request3()) 
[symcalc05x, f4, annual4, c4, type4, cagr4, cmgr4]                   =  request.security(asset5, timeframe.period, request4()) 
[symcalc06x, f5, annual5, c5, type5, cagr5, cmgr5]                   =  request.security(asset6, timeframe.period, request5()) 
[symcalc07x, f6, annual6, c6, type6, cagr6, cmgr6]                   =  request.security(asset7, timeframe.period, request6()) 
[symcalc08x, f7, annual7, c7, type7, cagr7, cmgr7]                   =  request.security(asset8, timeframe.period, request7()) 
[symcalc09x, f8, annual8, c8, type8, cagr8, cmgr8]                   =  request.security(asset9, timeframe.period, request8()) 
[symcalc10x, f9, annual9, c9, type9, cagr9, cmgr9]                   =  request.security(asset10,timeframe.period, request9()) 



// _______________________________________________________
//
// Switch                    
// _______________________________________________________


mult1                                                  = switch ls1
    "Long"  =>                         1 
    "Short" =>                         0
mult2                                                  = switch ls2
    "Long"  =>                         1 
    "Short" =>                         0
mult3                                                  = switch ls3
    "Long"  =>                         1 
    "Short" =>                         0
mult4                                                  = switch ls4
    "Long"  =>                         1 
    "Short" =>                         0
mult5                                                  = switch ls5
    "Long"  =>                         1 
    "Short" =>                         0
mult6                                                  = switch ls6
    "Long"  =>                         1 
    "Short" =>                         0
mult7                                                  = switch ls7
    "Long"  =>                         1 
    "Short" =>                         0
mult8                                                  = switch ls8
    "Long"  =>                         1 
    "Short" =>                         0
mult9                                                  = switch ls9
    "Long"  =>                         1 
    "Short" =>                         0
mult10                                                 = switch ls10
    "Long"  =>                         1 
    "Short" =>                         0 
 
// _______________________________________________________
//
// Dividends                    
// _______________________________________________________
 
 
div1                                                   =  (request.financial(asset1 ,"DIVIDENDS_YIELD" ,"FQ", ignore_invalid_symbol = true) / 100) * wX1  * mult1    
div2                                                   =  (request.financial(asset2 ,"DIVIDENDS_YIELD" ,"FQ", ignore_invalid_symbol = true) / 100) * wX2  * mult2  
div3                                                   =  (request.financial(asset3 ,"DIVIDENDS_YIELD" ,"FQ", ignore_invalid_symbol = true) / 100) * wX3  * mult3  
div4                                                   =  (request.financial(asset4 ,"DIVIDENDS_YIELD" ,"FQ", ignore_invalid_symbol = true) / 100) * wX4  * mult4  
div5                                                   =  (request.financial(asset5 ,"DIVIDENDS_YIELD" ,"FQ", ignore_invalid_symbol = true) / 100) * wX5  * mult5  
div6                                                   =  (request.financial(asset6 ,"DIVIDENDS_YIELD" ,"FQ", ignore_invalid_symbol = true) / 100) * wX6  * mult6  
div7                                                   =  (request.financial(asset7 ,"DIVIDENDS_YIELD" ,"FQ", ignore_invalid_symbol = true) / 100) * wX7  * mult7  
div8                                                   =  (request.financial(asset8 ,"DIVIDENDS_YIELD" ,"FQ", ignore_invalid_symbol = true) / 100) * wX8  * mult8  
div9                                                   =  (request.financial(asset9 ,"DIVIDENDS_YIELD" ,"FQ", ignore_invalid_symbol = true) / 100) * wX9  * mult9  
div10                                                  =  (request.financial(asset10,"DIVIDENDS_YIELD" ,"FQ", ignore_invalid_symbol = true) / 100) * wX10 * mult10  






// _______________________________________________________
//
// Indices                   
// _______________________________________________________

requestIndex()                                         => [(PnL(close, close) * 100), nz(PnLz(close, z) * 100, 0), close]

[SPX1,SPXx   ,  spClose]                               = request.security("SPX",       timeframe.period,     requestIndex())  
[ND1, NASDAQx, ndClose]                                = request.security("NDX",       timeframe.period,     requestIndex())  
[RT1, RUTx   , rtClose]                                = request.security("RUT",       timeframe.period,     requestIndex())  
[NY1, NIFTYx , nyClose]                                = request.security("NIFTY",     timeframe.period,     requestIndex()) 
[FT1, FTSEx  , ftClose]                                = request.security("UKX",       timeframe.period,     requestIndex())  
[HA1, HANGx  , haClose]                                = request.security("HSI",       timeframe.period,     requestIndex())   
[NI1, NIKKEIx, niClose]                                = request.security("NI225",     timeframe.period,     requestIndex()) 
[DE1, DEx    , deClose]                                = request.security("DAX",       timeframe.period,     requestIndex())   
[CA1, TSXx   , caClose]                                = request.security("TSX",       timeframe.period,     requestIndex())   
[IN1, IBOVx  , ibClose]                                = request.security("IBOV",      timeframe.period,     requestIndex())  



symcalc01                                              = symcalc01x > -100 ? symcalc01x : -100, SPX    = SPXx       > -100 ? SPXx       : -100 
symcalc02                                              = symcalc02x > -100 ? symcalc02x : -100, NASDAQ = NASDAQx    > -100 ? NASDAQx    : -100 
symcalc03                                              = symcalc03x > -100 ? symcalc03x : -100, RUT    = RUTx       > -100 ? RUTx       : -100
symcalc04                                              = symcalc04x > -100 ? symcalc04x : -100, NIFTY  = NIFTYx     > -100 ? NIFTYx     : -100 
symcalc05                                              = symcalc05x > -100 ? symcalc05x : -100, FTSE   = FTSEx      > -100 ? FTSEx      : -100
symcalc06                                              = symcalc06x > -100 ? symcalc06x : -100, HANG   = HANGx      > -100 ? HANGx      : -100
symcalc07                                              = symcalc07x > -100 ? symcalc07x : -100, NIKKEI = NIKKEIx    > -100 ? NIKKEIx    : -100 
symcalc08                                              = symcalc08x > -100 ? symcalc08x : -100, DE     = DEx        > -100 ? DEx        : -100 
symcalc09                                              = symcalc09x > -100 ? symcalc09x : -100, TSX    = TSXx       > -100 ? TSXx       : -100
symcalc10                                              = symcalc10x > -100 ? symcalc10x : -100, IBOV   = IBOVx      > -100 ? IBOVx      : -100 

// _______________________________________________________
//
// User-Defined Identifiers                    
// _______________________________________________________


comb() =>
    
    symcalc01x * wX1 +
         symcalc02x * wX2 +
         symcalc03x * wX3 +
         symcalc04x * wX4 +
         symcalc05x * wX5 +
         symcalc06x * wX6 +
         symcalc07x * wX7 +
         symcalc08x * wX8 +
         symcalc09x * wX9 +
         symcalc10x * wX10


World() => 
   
    "SPX "        + 
      "\nNDX "    + 
      "\nRUT "    + 
      "\nNIFTY "  + 
      "\nFTSE "   + 
      "\nHSI "    +
      "\nNIKKEI " +
      "\nDAX "    +
      "\nTSX "    +
      "\nIBOV "  

WorldP() =>
   
    str.tostring (SPX,    format.percent) +    "\n" +
     str.tostring(NASDAQ, format.percent) +    "\n" +
     str.tostring(RUT,    format.percent) +    "\n" +
     str.tostring(NIFTY,  format.percent) +    "\n" +
     str.tostring(FTSE,   format.percent) +    "\n" +
     str.tostring(HANG,   format.percent) +    "\n" +
     str.tostring(NIKKEI, format.percent) +    "\n" +
     str.tostring(DE,     format.percent) +    "\n" +
     str.tostring(TSX,    format.percent) +    "\n" +
     str.tostring(IBOV,   format.percent)       

cond() => 
   
    symcalc01      == -100 or symcalc02 == -100 
      or symcalc03 == -100 or symcalc04 == -100 
      or symcalc05 == -100 or symcalc06 == -100 
      or symcalc07 == -100 or symcalc08 == -100 
      or symcalc09 == -100 or symcalc10 == -100 


change(x) =>
    x != x[1] and not cond() 

if 
  change(div1)
    array.push(d,  div1)    
if 
   change(div2)
    array.push(d, div2)
if 
   change(div3)
    array.push(d, div3)
if 
   change(div4)
    array.push(d, div4)
if 
   change(div5)
    array.push(d, div5)
if 
   change(div6)
    array.push(d, div6)
if 
   change(div7)
    array.push(d, div7)
if 
   change(div8)
    array.push(d, div8)
if 
   change(div9)
    array.push(d, div9)

finDiv()                                                   => array.sum(d)

// _______________________________________________________
//
// Arrays                     
// _______________________________________________________  


array.set(strin, 0, asset1), array.set(strin, 1, asset2)
array.set(strin, 2, asset3), array.set(strin, 3, asset4)
array.set(strin, 4, asset5), array.set(strin, 5, asset6)
array.set(strin, 6, asset7), array.set(strin, 7, asset8)
array.set(strin, 8, asset9), array.set(strin, 9, asset10)

sort(x, x1) =>
    
    s  = array.new_string(array.size(x))
    s1 = array.copy(x1)
    if array.size(x) == array.size(x1)
        array.sort(s1, order.descending)
        for i = 0 to array.size(x) - 1
            s3 = array.get(x, math.max(0, array.indexof(x1, array.get(s1, i))))
            array.set(s, i, s3)
    
    [s, s1]


// _______________________________________________________
//
// Array Fills                     
// _______________________________________________________  


   
array.push(x1, symcalc01x * wX1 +
     
     symcalc02x * wX2 +
     symcalc03x * wX3 +
     symcalc04x * wX4 +
     symcalc05x * wX5 +
     symcalc06x * wX6 +
     symcalc07x * wX7 +
     symcalc08x * wX8 +
     symcalc09x * wX9 +
     symcalc10x * wX10)
array.push(currentR, symcalc01x * wX1 +
     
     symcalc02x * wX2 +
     symcalc03x * wX3 +
     symcalc04x * wX4 +
     symcalc05x * wX5 +
     symcalc06x * wX6 +
     symcalc07x * wX7 +
     symcalc08x * wX8 +
     symcalc09x * wX9 +
     symcalc10x * wX10)

array.set(x,0, symcalc01x * wX1)
array.set(x,1, symcalc02x * wX2)
array.set(x,2, symcalc03x * wX3)
array.set(x,3, symcalc04x * wX4)
array.set(x,4, symcalc05x * wX5)
array.set(x,5, symcalc06x * wX6)
array.set(x,6, symcalc07x * wX7)
array.set(x,7, symcalc08x * wX8)
array.set(x,8, symcalc09x * wX9)
array.set(x,9, symcalc10x * wX10)
array.push(test, PnLz(close, z))


[xSort, xSort1]                                 = sort(strin, x)



// _______________________________________________________
//
// Data for Plots                     
// _______________________________________________________  



xY := cond() == true ? 0 : 
        
         z +
         symcalc01 * wX1 +
         symcalc02 * wX2 +
         symcalc03 * wX3 +
         symcalc04 * wX4 +
         symcalc05 * wX5 +
         symcalc06 * wX6 +
         symcalc07 * wX7 +
         symcalc08 * wX8 +
         symcalc09 * wX9 +
         symcalc10 * wX10
         

         
array.set(weight, 0, wX1), array.set(weight, 1, wX2), array.set(weight, 2, wX3)
array.set(weight, 3, wX4), array.set(weight, 4, wX5), array.set(weight, 5, wX6)
array.set(weight, 6, wX7), array.set(weight, 7, wX8), array.set(weight, 8, wX9)
array.set(weight, 9, wX10)




wString                                       = array.sum(weight) == 100.00 ? na : "\n(Summed Weight Should Equal 100%)"

for i = 0 to array.size(xSort) - 1
    matS                                      := matS + array.get(xSort, i) + "\n" 
    matX                                      := matX + str.tostring(array.get(xSort1, i), format.percent) + "\n"

// _______________________________________________________
//
// Beta                    
// _______________________________________________________  


ind() => 
    switch dex
        "SPX"       => SPX1
        "NASDAQ"    => ND1 
        "RUT"       => RT1
        "NIFTY"     => NY1
        "FTSE"      => FT1
        "HSI"       => HA1
        "NIKKEI"    => NI1
        "DAX"       => DE1
        "TSX"       => CA1
        "IBOV"      => IN1

clo() => 
    switch dex
        "SPX"       => spClose
        "NASDAQ"    => ndClose
        "RUT"       => rtClose
        "NIFTY"     => nyClose
        "FTSE"      => ftClose
        "HSI"       => haClose
        "NIKKEI"    => niClose
        "DAX"       => deClose
        "TSX"       => caClose
        "IBOV"      => ibClose

ret() => 
    switch dex
        "SPX"       => SPXx   
        "NASDAQ"    => NASDAQx
        "RUT"       => RUTx   
        "NIFTY"     => NIFTYx 
        "FTSE"      => FTSEx  
        "HSI"       => HANGx  
        "NIKKEI"    => NIKKEIx
        "DAX"       => DEx    
        "TSX"       => TSXx   
        "IBOV"      => IBOVx  

combX() =>
  
    nz(f)  + 
     nz(f1) + 
     nz(f2) + 
     nz(f3) + 
     nz(f4) + 
     nz(f5) + 
     nz(f6) + 
     nz(f7) + 
     nz(f8) + 
     nz(f9)

cagrCalc() =>
    
    math.avg(
    
     cagr, 
     cagr1, 
     cagr2, 
     cagr3, 
     cagr4, 
     cagr5, 
     cagr6, 
     cagr7, 
     cagr8, 
     cagr9
    
     )
     
     * (
     
     w1 +
                 w2 +
                 w3 +
                 w4 +
                 w5 +
                 w6 +
                 w7 +
                 w8 +
                 w9 +
                 w10
                 
                 ) 
                 
                 / 10
    
cmgrCalc() =>
    
    math.avg(
    
     cmgr, 
     cmgr1, 
     cmgr2, 
     cmgr3, 
     cmgr4, 
     cmgr5, 
     cmgr6, 
     cmgr7, 
     cmgr8, 
     cmgr9
    
     )
     
     * (
     
     w1 +
                 w2 +
                 w3 +
                 w4 +
                 w5 +
                 w6 +
                 w7 +
                 w8 +
                 w9 +
                 w10
                 
                 ) 
                 
                  



beta() =>
    correlation                               = ta.correlation(combX(), ind(), 252)
    correlationFin                            = correlation * (ta.stdev(combX(), 252) / ta.stdev(ind(), 252))
    correlationFin


finCAGR                                          = fixnan(cagrCalc())
finCMGR                                          = fixnan(cmgrCalc())
beta                                          = str.tostring(beta(), format.mintick)

// _______________________________________________________
//
// VaR & CVaR            
// _______________________________________________________  


if change(bar_index)
   
    array.push(min, combX())
    array.push(benMin, (ind()))
   
    if array.size(min) > 250
        array.shift(min)
   
    if array.size(benMin) > 250
        array.shift(benMin)

fin                                          = array.percentile_nearest_rank(min, 5)
finBen                                       = array.percentile_nearest_rank(benMin, 5)

if 
   combX() < fin
    array.push(es, combX())

if 
   ind() < finBen
    array.push(benEs, ind())


if 
   change(year(time))
    
    if 
      array.size(es) > 0
        array.shift(es)
    
    if 
      array.size(benEs) > 0 
        array.shift(benEs)

// _______________________________________________________
//
// Sharpe and Classic Correlation            
// _______________________________________________________  


rf                                                      = request.security("DGS10", "D", ((close / 252)))

if 
  change(bar_index)

    array.push(sH, combX() - rf)
    array.push(avg, array.avg(sH))
    array.push(SsH, (ind()) - rf)
    array.push(Savg, array.avg(SsH))
    array.push(dd, combX())
    array.push(sDD, SPXx)
    
    if 
      array.size(sH) > 30
    
        array.push(sHigh, (array.avg(sH)) / array.stdev(avg))
        array.push(SsHigh, (array.avg(SsH)) / array.stdev(Savg))
        
    if 
      array.size(sH) > 252
        
        array.shift(sH)
        array.shift(avg)
        array.shift(SsH)
        array.shift(Savg)

sharpe                                                     = (array.avg(sH)) / array.stdev(avg)
Ssharpe                                                    = (array.avg(SsH)) / array.stdev(Savg)

pE                                                         = request.quandl("MULTPL/SP500_PE_RATIO_MONTH")

// _______________________________________________________
//
// Drawdown & Correlation & R-Squared 
// _______________________________________________________  

corr                                                       = ta.correlation(combX(), ind(), 252)
maxDD                                                      = array.min(currentR)
maxSDD                                                     = array.min(sDD)

R2() =>
    math.pow(ta.correlation(combX(), ind(), 252), 2) 

Rx2 = R2() * 100


spDraw                                                      = .0
spDrawDown                                                  = .0
spMaxDrawDown                                               = .0 

if 
  array.size(x1) > 0
    spDraw                                                  := spDraw[1] > clo() ? spDraw[1] : clo()
    spDrawDown                                              := clo() / spDraw - 1
    spMaxDrawDown                                           := spMaxDrawDown[1] < spDrawDown ? spMaxDrawDown[1] : spDrawDown



// _______________________________________________________
//
// Table                    
// _______________________________________________________  

merge(v, w, x, y, z) =>
    table.merge_cells(v, w, x, y, z)

y = array.new_table(
    
     1, 
     table.new(
     position.bottom_right, 
     6, 
     12, 
     bgcolor = na, 
     frame_width = 1, 
     border_width = 1, 
     border_color = color.white, 
     frame_color = color.white)
     
     )

if 
  
  tab == "Yes"

    if 
      
      barstate.islast
          
        if 
          
          array.size(x1) > 0
            log.info("DASDA")
        
            table.cell(array.get(y, 0), 2, 0, 
            
             text = "Total Return\n" + str.tostring(array.get(x1, array.size(x1) - 1) + nz(finDiv()), format.percent) ,
             bgcolor = array.get(x1, array.size(x1) - 1) > (((close / z) - 1) * 100) ? color.new(color.green, 90) : color.new(color.red, 90), 
             text_color = color.white)
        
            table.cell(array.get(y, 0), 1, 1, 
            
             text = "Constituents",
             bgcolor = array.get(x1, array.size(x1) - 1) > (((close / z) - 1) * 100) ? color.new(color.green, 90) : color.new(color.red, 90), 
             text_color = color.white)
        
            table.cell(array.get(y, 0), 2, 1, 
            
             text = "Component Returns",
             bgcolor = array.get(x1, array.size(x1) - 1) > (((close / z) - 1) * 100) ? color.new(color.green, 90) : color.new(color.red, 90), 
             text_color = color.white)
        
             
             
            table.cell(array.get(y, 0), 1, 2, 
            
             text =  matS + "\n",
             bgcolor = array.get(x1, array.size(x1) - 1) > (((close / z) - 1) * 100) ? color.new(color.green, 90) : color.new(color.red, 90), 
             text_color = color.white)
            
            table.cell(array.get(y, 0), 2, 2, 
            
             text =  "\n" + matX + "\nDividend Yield: " + str.tostring(nz(finDiv()), format.percent),
             bgcolor = array.get(x1, array.size(x1) - 1) > (((close / z) - 1) * 100) ? color.new(color.green, 90) : color.new(color.red, 90), 
             text_color = color.white)
             
             
            table.cell(array.get(y, 0), 1, 4, 
             text =  "Portfolio Beta: " + beta,
             bgcolor = color.new(color.blue, 90), 
             text_color = color.white)
             
            table.cell(array.get(y, 0), 3, 4, 
             text =  str.tostring(dex) + " Beta: 1.00" ,
             bgcolor = color.new(color.blue, 90), 
             text_color = color.white)
                  
            table.cell(array.get(y, 0), 1, 5, 
                
             text =  "Portfolio VaR: " + str.tostring(fin, format.percent),
             bgcolor = col == "Yes" and fin > finBen ? color.new(color.green, 90) : col == "Yes" and fin < finBen ? color.new(color.red, 90) : 
             array.get(x1, array.size(x1) - 1) > (((close / z) - 1) * 100) ? color.new(color.green, 90) : color.new(color.red, 90), 
             text_color = color.white)
            
            table.cell(array.get(y, 0), 1, 6, 
                
             text =  "Portfolio CVaR: " + str.tostring(array.avg(es), format.percent),
             bgcolor = col == "Yes" and array.avg(es) > array.avg(benEs) ? color.new(color.green, 90) : col == "Yes" and array.avg(es) < array.avg(benEs) ? color.new(color.red, 90) :
             array.get(x1, array.size(x1) - 1) > (((close / z) - 1) * 100) ? color.new(color.green, 90) : color.new(color.red, 90), 
             text_color = color.white)
            
            table.cell(array.get(y, 0), 3, 5, 
                
             text =  str.tostring(dex) + " VaR: " + str.tostring(finBen, format.percent),
             bgcolor = col == "Yes" and fin > finBen ? color.new(color.red, 90) : col == "Yes" and fin < finBen ? color.new(color.green, 90) :
             array.get(x1, array.size(x1) - 1) < (((close / z) - 1) * 100) ? color.new(color.green, 90) : color.new(color.red, 90), 
             text_color = color.white)
            
            table.cell(array.get(y, 0), 3, 6, 
                
             text =  str.tostring(dex) + " CVaR: " + str.tostring(array.avg(benEs), format.percent),
             bgcolor = col == "Yes" and array.avg(es) > array.avg(benEs) ? color.new(color.red, 90) : col == "Yes" and array.avg(es) < array.avg(benEs) ? color.new(color.green, 90) :
             array.get(x1, array.size(x1) - 1) < (((close / z) - 1) * 100) ? color.new(color.green, 90) : color.new(color.red, 90), 
             text_color = color.white)
            
            table.cell(array.get(y, 0), 1, 7, 
                
             text =  "Portfolio Sharpe Ratio: " + str.tostring(sharpe, format.mintick) + " (Highest: " + str.tostring(array.max(sHigh), format.mintick) + ")",
             bgcolor = col == "Yes" and sharpe > Ssharpe ? color.new(color.green, 90) : col == "Yes" and sharpe < Ssharpe ? color.new(color.red, 90) :
             array.get(x1, array.size(x1) - 1) > (((close / z) - 1) * 100) ? color.new(color.green, 90) : color.new(color.red, 90), 
             text_color = color.white)
            table.cell(array.get(y, 0), 3, 7, 
                
             text =  str.tostring(dex) + " Sharpe Ratio: "  + str.tostring(Ssharpe, format.mintick),
             bgcolor =col == "Yes" and sharpe < Ssharpe ? color.new(color.green, 90) : col == "Yes" and sharpe > Ssharpe ? color.new(color.red, 90) :
             array.get(x1, array.size(x1) - 1) < (((close / z) - 1) * 100) ? color.new(color.green, 90) : color.new(color.red, 90),
             text_color = color.white)
            
            table.cell(array.get(y, 0), 1, 10, 
                
             text =  "Portfolio Correlation to " + str.tostring(dex) + ": " + str.tostring(corr * 100, format.percent),
             bgcolor = col == "Yes" ? color.from_gradient(corr, 0.0, 1.0, color.new(color.green, 90) , color.new(color.red, 90)) : 
             array.get(x1, array.size(x1) - 1) > (((close / z) - 1) * 100) ? color.new(color.green, 90) : color.new(color.red, 90), 
             text_color = color.white)
            table.cell(array.get(y, 0), 1, 8, 
                
             text =  "Max % Loss on Initial Investment: " + str.tostring(maxDD, format.percent) + "\n(When Holding Since Start Date)",
             bgcolor = col == "Yes" and maxDD > maxSDD ? color.new(color.green, 90) : col == "Yes" and maxDD < maxSDD ? color.new(color.red, 90) :
             array.get(x1, array.size(x1) - 1) > (((close / z) - 1) * 100) ? color.new(color.green, 90) : color.new(color.red, 90), 
             text_color = color.white)
        
            table.cell(array.get(y, 0), 1, 11, 
                
             text =  "Portfolio R²: " + str.tostring(Rx2, format.percent),
             bgcolor = col == "Yes" ? color.from_gradient(Rx2, 0, 100, color.new(color.red, 90), color.new(color.green, 90)) : 
             array.get(x1, array.size(x1) - 1) > (((close / z) - 1) * 100) ? color.new(color.green, 90) : color.new(color.red, 90), 
             text_color = color.white)    
    
            table.cell(array.get(y, 0), 1, 9, 
                
             text =  "CAGR: " + str.tostring(finCAGR, format.percent) + "\n" + "\nCMGR: " + str.tostring(finCMGR, "#0.0000") + "%",
             bgcolor = array.get(x1, array.size(x1) - 1) > (((close / z) - 1) * 100) ? color.new(color.green, 90) : color.new(color.red, 90), 
             text_color = color.white)    
        
            table.cell(array.get(y, 0), 3, 9, 
                
             text =  str.tostring(dex) + " Max Drawdown : " + str.tostring(spMaxDrawDown * 100, format.percent) + "\n(Highest Close to Lowest Close)",
             bgcolor = array.get(x1, array.size(x1) - 1) < (((close / z) - 1) * 100) ? color.new(color.green, 90) : color.new(color.red, 90),  
             text_color = color.white)    
            
        
            table.cell(array.get(y, 0), 3, 10, 
                
             text =  "Risk-Free Rate: " + str.tostring(rf * 252, format.percent),
             bgcolor = col == "Yes" ? color.new(color.white, 90) : array.get(x1, array.size(x1) - 1) < (((close / z) - 1) * 100) ? color.new(color.green, 90) : color.new(color.red, 90), 
             text_color = color.white)
        
            table.cell(array.get(y, 0), 3, 8, 
                
             text =  str.tostring(dex) + " Max % Loss on Initial Investment: " + str.tostring(maxSDD, format.percent) + "\n(When Holding Since Start Date)",
             bgcolor = col == "Yes" and maxDD < maxSDD ? color.new(color.green, 90) : col == "Yes" and maxDD < maxSDD ? color.new(color.red, 90) :
             array.get(x1, array.size(x1) - 1) < (((close / z) - 1) * 100) ? color.new(color.green, 90) : color.new(color.red, 90), 
             text_color = color.white)
             
        
            table.cell(array.get(y, 0), 3, 11, 
                
             text =  "S&P 500 P/E: " + str.tostring(pE, format.mintick),
             bgcolor = col == "Yes" ? color.new(color.blue, 90) : array.get(x1, array.size(x1) - 1) < (((close / z) - 1) * 100) ? color.new(color.green, 90) : color.new(color.red, 90), 
             text_color = color.white)
    
    
         
            table.cell(array.get(y, 0), 1, 0, 
        
                 text = 
                 w1 +
                 w2 +
                 w3 +
                 w4 +
                 w5 +
                 w6 +
                 w7 +
                 w8 +
                 w9 +
                 w10 == 100.0 ?  
                 str.tostring(
                 w1 +
                 w2 +
                 w3 +
                 w4 +
                 w5 +
                 w6 +
                 w7 +
                 w8 +
                 w9 +
                 w10 , format.percent) + " Weight " + 
                 wString + "\n\n" :
                 str.tostring(
                 w1 +
                 w2 +
                 w3 +
                 w4 +
                 w5 +
                 w6 +
                 w7 +
                 w8 +
                 w9 +
                 w10 , format.percent) + "Weight " + "\n"+ wString + "\n",
                 bgcolor = color.new(color.white, 90)  , 
                 text_color = color.white)
    

        
            table.cell(array.get(y, 0), 3, 0, 
                
                 text =  "Asset Total Return\n" + str.tostring((((close / z) - 1) * 100), format.percent),
                 bgcolor = array.get(x1, array.size(x1) - 1) < (((close / z) - 1) * 100) ? color.new(color.green, 90) : color.new(color.red, 90), 
                 text_color = color.white)

        
            table.cell(array.get(y, 0), 3, 1, 
                
                 text =  "Indices",
                 bgcolor = array.get(x1, array.size(x1) - 1) < (((close / z) - 1) * 100) ? color.new(color.green, 90) : color.new(color.red, 90), 
                 text_color = color.white)    
            
            table.cell(array.get(y, 0), 3, 2, 
                
                 text =  World(),
                 bgcolor = array.get(x1, array.size(x1) - 1) < (((close / z) - 1) * 100) ? color.new(color.green, 90) : color.new(color.red, 90), 
                 text_color = color.white)
           
            table.cell(array.get(y, 0), 4, 2, 
                
                 text =  WorldP(),
                 bgcolor = array.get(x1, array.size(x1) - 1) < (((close / z) - 1) * 100) ? color.new(color.green, 90) : color.new(color.red, 90), 
                 text_color = color.white)
           
            table.cell(array.get(y, 0), 4, 1, 
                
                 text =  "Index Returns",
                 bgcolor = array.get(x1, array.size(x1) - 1) < (((close / z) - 1) * 100) ? color.new(color.green, 90) : color.new(color.red, 90), 
                 text_color = color.white)
           
           
            merge(array.get(y, 0), 3, 4, 4,  4 )
            merge(array.get(y, 0), 3, 5, 4,  5 )  
            merge(array.get(y, 0), 3, 6, 4,  6 )
            merge(array.get(y, 0), 1, 5, 2,  5 )
            merge(array.get(y, 0), 1, 6, 2,  6 )
            merge(array.get(y, 0), 1, 7, 2,  7 ) 
            merge(array.get(y, 0), 1, 4, 2,  4 )
            merge(array.get(y, 0), 3, 7, 4,  7 )  
            merge(array.get(y, 0), 1, 8, 2,  8 )
            merge(array.get(y, 0), 1, 9, 2,  9 ) 
            merge(array.get(y, 0), 3, 9, 4,  9 )
            merge(array.get(y, 0), 3, 8, 4,  8 )     
            merge(array.get(y, 0), 1, 10, 2, 10)
            merge(array.get(y, 0), 3, 10, 4, 10)
            merge(array.get(y, 0), 3, 11, 4, 11)
            merge(array.get(y, 0), 1, 11, 2, 11)    
            merge(array.get(y, 0), 3, 0, 4, 0)     

    
/// _______________________________________________________
//
// Plots                     
// _______________________________________________________  

t                                                        = plot(lin == "Yes" and cond() == false ? xY : na)
t1                                                       = plot(lin == "Yes" ? z + (((close / z) - 1) *  100) : na, color = color.red)
t2                                                       = plot(plo == "Yes" ? z + ret() : na, color = color.green)

fill(

     t, 
     t1, 
     color = xY > z + (((close / z) - 1) *  100) and lin == "Yes" ? color.new(color.blue, 97) :
     xY < z + (((close / z) - 1) *  100) and lin == "Yes" ? color.new(color.red, 97) :
     na
     
     )

Q1                                                        = month(time) != month(time[1]) and month(time) == 01
Q2                                                        = month(time) != month(time[1]) and month(time) == 04
Q3                                                        = month(time) != month(time[1]) and month(time) == 07
Q4                                                        = month(time) != month(time[1]) and month(time) == 10


if 
  cond() == false 
     and array.size(x1) > 0
    
    if 
      
      lin == "Yes"
                                
        if Q1
            
            array.push(mon, label.new(bar_index, xY, style = label.style_circle, size = size.auto, color = color.white))
            array.push(mon1, label.new(bar_index, z + (((close / z) - 1) *  100), style = label.style_circle, color = color.white, size = size.auto))
            
            if 
            
              plo == "Yes"
                
                array.push(mon2, label.new(bar_index, z + ret(), style = label.style_circle, size = size.auto, color = color.white)) 
        if Q2 
            
            array.push(mon, label.new(bar_index, xY, style = label.style_circle, size = size.auto, color = color.white))
            array.push(mon1, label.new(bar_index, z + (((close / z) - 1) *  100), style = label.style_circle, color = color.white, size = size.auto))
            
            if 
            
              plo == "Yes"
              
                array.push(mon2, label.new(bar_index, z + ret(), style = label.style_circle, size = size.auto, color = color.white)) 

        if Q3 
            
            array.push(mon, label.new(bar_index, xY, style = label.style_circle, size = size.auto, color = color.white)) 
            array.push(mon1, label.new(bar_index, z + (((close / z) - 1) *  100), style = label.style_circle, color = color.white, size = size.auto))
            
            if 
            
              plo == "Yes"
                
                array.push(mon2, label.new(bar_index, z + ret(), style = label.style_circle, size = size.auto, color = color.white)) 
        if Q4
            
            array.push(mon, label.new(bar_index, xY, style = label.style_circle, size = size.auto, color = color.white))
            array.push(mon1, label.new(bar_index, z + (((close / z) - 1) *  100), style = label.style_circle, color = color.white, size = size.auto))
            
            if 
            
              plo == "Yes"
               
                array.push(mon2, label.new(bar_index, z + ret(), style = label.style_circle, size = size.auto, color = color.white))

        if 
          
          barstate.islast
            
            array.push(
            
             port, label.new(
             x = bar_index + 50, 
             y = xY > z + (((close / z) - 1) *  100) ? xY * 1.01 : xY * .99, 
             text = "Portfolio Return: " + str.tostring(array.get(x1, array.size(x1) - 1) + nz(finDiv()), format.percent), 
             style = xY > z + (((close / z) - 1) *  100) ? label.style_label_down : label.style_label_up, 
             color = color.new(color.blue, 50), 
             textcolor = color.white)
             
             )
             
             
            array.push(
            
             asset, label.new(
             x = bar_index + 50, 
             y = xY > z + (((close / z) - 1) *  100) ? z + (((close / z) - 1) *  100) * .99 : z + (((close / z) - 1) *  100) * 1.01, 
             text = "Asset Return: " + str.tostring((((close / z) - 1) * 100), format.percent), 
             color = color.new(color.red, 50), 
             style = z + (((close / z) - 1) *  100) < xY ? label.style_label_up : label.style_label_down, 
             textcolor = color.white)
             
             )
            
            array.push(
             pX, line.new(
             x1 = bar_index, 
             y1 = xY, 
             x2= bar_index + 50, 
             y2 = xY, 
             color = color.blue)
            
             )
            
            
            array.push(
            
             pX1, line.new(
             x1 = bar_index,  
             y1 = z + (((close / z) - 1) *  100), 
             x2 = bar_index + 50,  
             y2 = z + (((close / z) - 1) *  100), 
             color = color.red)
            
             )
            
            array.push(
            
             pX2, line.new(
             x1 = 
             bar_index + 50,  
             y1 = xY, 
             x2 = bar_index + 50,  
             y2 = math.avg(z + (((close / z) - 1) *  100), xY), 
             color = color.blue)
            
             )
            
            
            array.push(
            
             pX3, line.new(
             x1 = bar_index + 50,  
             y1 = z + (((close / z) - 1) *  100), 
             x2 = bar_index + 50,  
             y2= math.avg(z + (((close / z) - 1) *  100), xY), 
             color = color.red)
            
             )
            
            
            array.push(
            
             pX4, line.new(
             x1 = bar_index,  
             y1 = math.avg(z + (((close / z) - 1) *  100), xY), 
             x2 = bar_index + 50,  
             y2 = math.avg(z + (((close / z) - 1) *  100), xY), 
             color = na)
            
             )
            



        if 
          
          plo == "Yes"
        
            array.push(
            
             inLI, line.new(
             x1 = bar_index, 
             y1 = z + ret(), 
             x2= bar_index + 50, 
             y2 = z + ret(), 
             color = color.green)
             
             )
            
            array.push(
        
             inL, label.new(
             x = bar_index + 50, 
             y = z + ret(), 
             text = str.tostring(dex) +" Return: " + str.tostring(ret(), format.percent), 
             color = color.new(color.green, 50), 
             style = label.style_label_left, 
             textcolor = color.white)
                 
                 )

// _______________________________________________________
//
// Lines & Labels                    
// _______________________________________________________

    
        if 
          
          array.size(pX) > 0
        
            array.push(
            
             pXL, linefill.new(
             line1 = array.get(pX, array.size(pX) - 1), 
             line2 = array.get(pX4, array.size(pX4) - 1), 
             color = color.new(color.blue, 92))
             
             )
            
            array.push(
            
             pXL1, linefill.new(
             line1 = array.get(pX1, array.size(pX1) - 1), 
             line2 = array.get(pX4, array.size(pX4) - 1), 
             color = color.new(color.red, 92))
              
             )


            if 
              
              array.size(port) > 1
   
                label.delete(array.shift(port))
                label.delete(array.shift(asset))
                line.delete (array.shift(pX))
                line.delete (array.shift(pX1))
                line.delete (array.shift(pX2))
                line.delete (array.shift(pX3))
                line.delete (array.shift(pX4))
           
            if 
              
              array.size(inLI) > 0
           
                line.delete (array.shift(inLI))
                label.delete(array.shift(inL))


// _______________________________________________________
//
// Time Start Marker                    
// _______________________________________________________


if
 
  c  > 0 
  
     and c1 > 0 
     and c2 > 0
     and c3 > 0
     and c4 > 0
     and c5 > 0
     and c6 > 0
     and c7 > 0
     and c8 > 0
     and c9 > 0
    
    cond2 :=  true

if 
  cond2[1] == false 
    if 
      cond2 == true 
        
        array.push(
        
         startDate, label.new(
         
         x =bar_index, 
         y =high * 1.20, 
         text = "All Assets Started \nTrading by This Session\n" + str.tostring(year(time)) + "/" + str.tostring(month(time)) + "/" + str.tostring(dayofmonth(time)),
         textcolor = color.black, color = color.new(color.white, 50), 
         style = label.style_label_right)
         
         )

bgcolor(cond2[1] == false and cond2 == true ? color.white : cond2 == true ? color.new(color.white, 99) : na)

Overview

Users can select multiple symbols, assign specific weighting percentages, and designate long or short positions. It calculates cumulative percentage returns for the portfolio and plots performance lines alongside a selected benchmark index such as SPX or NASDAQ. A customizable on-screen table summarizes key performance comparisons.

Details

Published by

regalouisei on GitHub

Code credit

KioseffTrading, as written in the script's header

Type

Indicator, Pine Script v5

Draws

On the price chart

Category

Screeners & dashboards

Markets

Stocks, Indices

Timeframes

Any timeframe

Risk Notes

No repainting, lookahead or stacked entries were found in its code or README. That says nothing about how well it works: test it first.

Settings

The inputs you can change from the gear icon on the chart. Defaults are the author's.

SettingTypeDefaultVariable
Show Percentage Line Performance? stringYeslin
Show Table? stringYestab
Color Table Cells on Better Performer?stringNocol
Index Measured AgainststringSPXdex
Plot Index Return?stringYesplo
asset1symbolAAPLasset1
Return Weightfloat10wX1
Direction (Long/Short)stringLongls1
asset2symbolMSFTasset2
Return Weightfloat10wX2
Direction (Long/Short)stringLongls2
asset3symbolGOOGasset3
Show all 40 settings
SettingTypeDefaultVariable
Return Weightfloat10wX3
Direction (Long/Short)stringLongls3
asset4symbolAMZNasset4
Return Weightfloat10wX4
Direction (Long/Short)stringLongls4
asset5symbolMETAasset5
Return Weightfloat10wX5
Direction (Long/Short)stringLongls5
asset6symbolTasset6
Return Weightfloat10wX6
Direction (Long/Short)stringLongls6
asset7symbolVasset7
Return Weightfloat10wX7
Direction (Long/Short)stringLongls7
asset8symbolMAasset8
Return Weightfloat10wX8
Direction (Long/Short)stringLongls8
asset9symbolTSLAasset9
Return Weightfloat10wX9
Direction (Long/Short)stringLongls9
asset10symbolXasset10
Return Weightfloat10wX10
Direction (Long/Short)stringLongls10
Calculation Start Yearint2018sYear
Calculation Start Monthint01sMonth
Calculation Start Dayint02sDay
Calculation End Yearint2080eYear
Calculation End Monthint01eMonth
Third-party code. ForexR did not write, test or endorse this script, and the summary above was generated automatically from its code and README. Indicators describe the past, and a strategy's backtest can look better than live trading, especially when a script repaints. Check it in the Strategy Tester and on a demo account before you rely on it.

Similar Pine Scripts

Symbol Info Helper

by everget
948 stars

Symbol Info Helper is an informational utility script that displays metadata about the currently selected instrument directly on the main price chart. It gathers built-in symbol properties including ticker identifier, description, instrument type, point value,

Indicator v4 Screeners & dashboards
Updated 10 days ago · GPL-3.0 GitHub repository of Symbol Info Helper
575 stars

The indicator plots ICT displacement candles on the price chart and can switch to retracement scanning. Displacement requires a move larger than a set share of the 14-bar average high-low range, lasting at least a chosen number of bars, with optional close, pr

Indicator v6 SMC / ICT / price actionCandlestick patterns
Updated 1 year ago · MPL-2.0 GitHub repository of ICT Displacement Candles Indicator
330 stars

This indicator monitors multiple cryptocurrency symbols for trading signals. It calculates and plots entry prices, take profit, and stop loss levels for each symbol including BTCUSDT, ETHUSDT, BNBUSDT and others. Price crossovers trigger buy, sell or close ale

Indicator v5 Support & resistanceScreeners & dashboards
Updated 2 months ago · None stated GitHub repository of Multi Alert Long/Short [Alorse]

Pricing Table

by namuan
318 stars

This indicator calculates theoretical options contract values and in-the-money probabilities using historical realized volatility across multiple standard deviations. It displays these metrics in a table overlay directly on the price chart. Users can adjust th

Indicator v4 Volatility & bandsScreeners & dashboards
Updated 2 months ago · MIT GitHub repository of Pricing Table

3938 Tracker

by Allen1212
303 stars

3938 Tracker visualizes historical buying and selling activity from ARK Invest funds directly on the main price chart. It plots labels at specific timestamps corresponding to trade dates, indicating buy or sell actions along with the count of participating ETF

Indicator v4 Screeners & dashboards
Updated 2 years ago · None stated GitHub repository of 3938 Tracker

More indicators

Trade Your Charts With a Regulated Broker

Compare brokers that connect to TradingView, with spreads, minimum deposits and leverage side by side.

Compare brokers