Ilja
Ilja

Reputation: 63

Using multiple array elements to produce multiple lines for the same symbols (Pine Script)

Based on this solution from Bjorn to include more array elements in the code while using float I am trying to plot several lines for the same symbol, but it seems that only the first set of array elements is processed. Is there a way to produce more lines for the same symbols (up to the number of occurrences of the symbol in the array)? The example arrays are included below. QQQ would have 3 lines, AMZN 2 lines, and MSFT just 1 line.

//@version=4
study("Lines", "LI", true)

x1_date = timestamp(2020, 10, 30, 9, 30)
x2_date = timestamp(2021, 2, 16, 9, 30)

var string[]    a_ticker            = array.new_string()
var int[]       a_x1                = array.new_int()
var int[]       a_x2                = array.new_int()
var float[]     a_y1                = array.new_float()
var float[]     a_y2                = array.new_float()
var string[]    a_str               = array.new_string()
var string[]    a_digits_str        = array.new_string()
var int[]       a_digits_int        = array.new_int()
var line        myLine              = line.new(x1_date, na, x2_date, na, extend=extend.both, color = color.yellow, xloc = xloc.bar_time)

var string[]    a_str_set_ticker    = array.new_string()
var string[]    a_str_set_x1        = array.new_string()
var string[]    a_str_set_x2        = array.new_string()
var string[]    a_str_set_y1        = array.new_string()
var string[]    a_str_set_y2        = array.new_string()


// Initializes the a_digits_int array
f_init_digits_int() =>
    for x = 0 to 9
        array.push(a_digits_str, tostring(x))
        array.push(a_digits_int, x)

// Converts a string containing a digit, to an integer
f_digitstr2int(_dstr) => 
    array.get(a_digits_int, array.indexof(a_digits_str, _dstr))

// Converts a string containing an integer, to an integer
f_str2int(_s) => 
    int multiplier = 1
    int number = 0

    // Initialize the a_digits_int array in case it hasn't been done yet.
    if not array.size(a_digits_int) 
        f_init_digits_int() 
        
    a = str.split(_s,"")
    array.reverse(a)

    for x = 0 to array.size(a)-1
        digit_str = array.get(a,x)
        number := number + multiplier * f_digitstr2int(digit_str)
        multiplier := multiplier * 10
        
    number        

// Converts a string containing a float, to a float
f_str2float(_s) =>
    float   number          = na
    string  s_absolute      = str.replace_all(_s,"-","")
    bool    is_negative     = str.length(s_absolute) != str.length(_s)
    
    a_split = str.split(s_absolute,".")
    if array.size(a_split) > 1 // _s has a decimal separator
        number := f_str2int(array.get(a_split,0)) + f_str2int(array.get(a_split,1)) / pow(10,str.length(array.get(a_split,1)))
    else // _s does not have a decimal separator, so it's an integer
        number := f_str2int(_s)
    
    number * (is_negative ? -1 : 1)

// Initialize the data
f_init_data() =>
    // 4000 tickers, broken down into 5 sets, because a string has a max size of 4096 characters.
    // 800 tickers, set 1
    array.push(a_str_set_ticker, "QQQ,QQQ,QQQ,AMZN,AMZN,MSFT")
    array.push(a_str_set_y1, "267,300,222,3000,2000,237")
    array.push(a_str_set_y2, "338.2,200,111,2500,1000,222")

if barstate.islast
    // Initialization
    f_init_data()

    // Process the data
    for z = 0 to array.size(a_str_set_ticker)-1
        a_ticker := array.concat(str.split(array.get(a_str_set_ticker, z),","), a_ticker)

        a_str := str.split(array.get(a_str_set_y1, z),",")
        for i = 0 to array.size(a_str)-1
            array.push(a_y1,f_str2float(array.get(a_str,i)))

        a_str := str.split(array.get(a_str_set_y2, z),",")
        for i = 0 to array.size(a_str)-1
            array.push(a_y2,f_str2float(array.get(a_str,i)))

    // Draw line 1
    if array.includes(a_ticker, syminfo.ticker)
        idx = array.indexof(a_ticker, syminfo.ticker)
        y1  = array.get(a_y1, idx)
        y2  = array.get(a_y2, idx)
        line.set_y1(myLine, y1)
        line.set_y2(myLine, y2)

Edit 1:

Using the solution from Bjorn with example array SET 1 and SET 2 does not produce expected results. SET 2 has the same elements as SET 1, but they are split into two array groups (important to use groups as strings are limited to 4096 characters). While SET 1 plots all lines correctly, SET 2 plots the same lines incorrectly for all symbols. This is especially visible when looking at SPY. Not clear why this is the case as the code looks correct. Is there a bug?

Set 1 for SPY

enter image description here

Set 2 for SPY

enter image description here

Following arrays were used with the 2 sets:

//SET 1

// array.push(a_str_set_ticker, "TSLA,TSLA,TSLA,SPY,SPY,SPY,SPY,AAPL,AAPL,AAPL")
// array.push(a_str_set_x1, "2,2,2,2,2,2,2,2,2,2")
// array.push(a_str_set_x2, "1,1,1,1,1,1,1,1,1,1")
// array.push(a_str_set_y1, "872.94,874.37,643.0,392.01,391.88,378.81,374.8,130.65,131.07,120.1")
// array.push(a_str_set_y2, "872.47,873.18,659.51,391.8,391.52,378.23,375.16,129.89,130.36,121.2")

//SET 2

array.push(a_str_set_ticker, "TSLA,TSLA,TSLA,SPY")
array.push(a_str_set_x1, "2,2,2,2")
array.push(a_str_set_x2, "1,1,1,1")
array.push(a_str_set_y1, "872.94,874.37,643.0,392.01")
array.push(a_str_set_y2, "872.47,873.18,659.51,391.8")

array.push(a_str_set_ticker, "SPY,SPY,SPY,AAPL,AAPL,AAPL")
array.push(a_str_set_x1, "2,2,2,2,2,2")
array.push(a_str_set_x2, "1,1,1,1,1,1")
array.push(a_str_set_y1, "391.88,378.81,374.8,130.65,131.07,120.1")
array.push(a_str_set_y2, "391.52,378.23,375.16,129.89,130.36,121.2")

Edit 2

Bjorn's revised solution works correctly for array groups, but when using this approach for many elements, Pine Script now produces the error "Loop takes too long to execute (> 200ms)" Below is a theoretical example for 1316 coordinates groups. The original code allowed for 4000+ coordinates and it worked for more before the fix. Is there a way around this?

array.push(a_str_set_ticker, "SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY")
array.push(a_str_set_x1, "2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2")
array.push(a_str_set_x2, "1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1")
array.push(a_str_set_y1, "360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360")
array.push(a_str_set_y2, "400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400")

array.push(a_str_set_ticker, "SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY,SPY")
array.push(a_str_set_x1, "2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2")
array.push(a_str_set_x2, "1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1")
array.push(a_str_set_y1, "360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360")
array.push(a_str_set_y2, "400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400")

Upvotes: 0

Views: 4139

Answers (2)

G.Lebret
G.Lebret

Reputation: 3088

Since Pinescript V5 and April 2022, the new fonction matrix allow tu use bi dimensionnal arrays (cf https://www.tradingview.com/pine-script-docs/en/v5/Release_notes.html?highlight=entry_id#id10)

Upvotes: 0

Bjorn Mistiaen
Bjorn Mistiaen

Reputation: 6875

Solution below.
I was able to remove my f_str2float() and f_str2int() functions, because yesterday they released a new built-in function tonumber().
Script looks cleaner now.

//@version=4
study("Lines", "LI", true)

int             i_max_lines         = input(10,    "Max number of lines drawn", minval=1, maxval=20)
bool            i_extend_lines      = input(false, "Extend lines")

var string[]    a_ticker            = array.new_string()
var int[]       a_x1                = array.new_int()
var int[]       a_x2                = array.new_int()
var float[]     a_y1                = array.new_float()
var float[]     a_y2                = array.new_float()
var string[]    a_str               = array.new_string()

var string[]    a_str_set_ticker    = array.new_string()
var string[]    a_str_set_x1        = array.new_string()
var string[]    a_str_set_x2        = array.new_string()
var string[]    a_str_set_y1        = array.new_string()
var string[]    a_str_set_y2        = array.new_string()

var line[]      a_lines             = array.new_line()

// Initialize the data
f_init_data() =>
    // 4000 tickers, broken down into 5 sets, because a string has a max size of 4096 characters.
    // 800 tickers, set 1
    array.push(a_str_set_ticker, "QQQ,QQQ,QQQ,AMZN,AMZN")
    array.push(a_str_set_x1, "20,30,40,20,30")
    array.push(a_str_set_x2, "2,3,4,2,3")
    array.push(a_str_set_y1, "267,300,222,3000,2000")
    array.push(a_str_set_y2, "338.2,200,111,2500,1000")

// Initialize the lines
f_init_lines() =>
    for x = 0 to i_max_lines-1
        array.push(a_lines, line.new(na, na, na, na, extend=i_extend_lines ? extend.both : extend.none))

// Draw lines
f_draw_lines() =>
    if array.includes(a_ticker, syminfo.ticker)
        var int[]   subarray_x1 = array.new_int()
        var int[]   subarray_x2 = array.new_int()
        var float[] subarray_y1 = array.new_float()
        var float[] subarray_y2 = array.new_float()
        var int     x1          = na
        var int     x2          = na
        var float   y1          = na
        var float   y2          = na

        // Get elements with current ticker and put in a subarray.
        for x = array.indexof(a_ticker, syminfo.ticker) to array.lastindexof(a_ticker, syminfo.ticker)
            if array.get(a_ticker, x) == syminfo.ticker
                array.push(subarray_x1, array.get(a_x1, x))
                array.push(subarray_x2, array.get(a_x2, x))
                array.push(subarray_y1, array.get(a_y1, x))
                array.push(subarray_y2, array.get(a_y2, x))

        // Draw all lines in the subarray.
        for x = 0 to min(array.size(subarray_x1),i_max_lines)-1
            x1 := array.get(subarray_x1, x)
            x2 := array.get(subarray_x2, x)
            y1 := array.get(subarray_y1, x)
            y2 := array.get(subarray_y2, x)
            line.set_xy1(array.get(a_lines, x), bar_index - x1, y1)
            line.set_xy2(array.get(a_lines, x), bar_index - x2, y2)     


if barstate.islast
    // Initialization
    f_init_data()
    f_init_lines()

    // Process the data
    for z = 0 to array.size(a_str_set_ticker)-1
        a_ticker := array.concat(str.split(array.get(a_str_set_ticker, z),","), a_ticker)
    
        a_str := str.split(array.get(a_str_set_x1, z),",")
        for i = 0 to array.size(a_str)-1
            array.push(a_x1,int(tonumber(array.get(a_str,i))))
    
        a_str := str.split(array.get(a_str_set_x2, z),",")
        for i = 0 to array.size(a_str)-1
            array.push(a_x2,int(tonumber(array.get(a_str,i))))
    
        a_str := str.split(array.get(a_str_set_y1, z),",")
        for i = 0 to array.size(a_str)-1
            array.push(a_y1,tonumber(array.get(a_str,i)))
    
        a_str := str.split(array.get(a_str_set_y2, z),",")
        for i = 0 to array.size(a_str)-1
            array.push(a_y2,tonumber(array.get(a_str,i)))
            
    // Draw lines
    f_draw_lines()

Edit 1
In response to this comment.
It seems there was a problem with the array.concat() function, which inverted the ticker sequence. I solved it by processing the tickers the same way as the x/y values.
Also added a debug checkbox in the inputs, to show the content of the arrays.

//@version=4
study("Lines", "LI", true)

int             i_max_lines         = input(10,    "Max number of lines drawn", minval=1, maxval=20)
bool            i_extend_lines      = input(false, "Extend lines")
bool            i_debug             = input(false, "Show debug info")

var string[]    a_ticker            = array.new_string()
var int[]       a_x1                = array.new_int()
var int[]       a_x2                = array.new_int()
var float[]     a_y1                = array.new_float()
var float[]     a_y2                = array.new_float()

var string[]    a_str_set_ticker    = array.new_string()
var string[]    a_str_set_x1        = array.new_string()
var string[]    a_str_set_x2        = array.new_string()
var string[]    a_str_set_y1        = array.new_string()
var string[]    a_str_set_y2        = array.new_string()

var line[]      a_lines             = array.new_line()

// Initialize the data
f_init_data() =>

    //SET 1
    // array.push(a_str_set_ticker, "TSLA,TSLA,TSLA,SPY,SPY,SPY,SPY,AAPL,AAPL,AAPL")
    // array.push(a_str_set_x1, "2,2,2,2,2,2,2,2,2,2")
    // array.push(a_str_set_x2, "1,1,1,1,1,1,1,1,1,1")
    // array.push(a_str_set_y1, "872.94,874.37,643.0,392.01,391.88,378.81,374.8,130.65,131.07,120.1")
    // array.push(a_str_set_y2, "872.47,873.18,659.51,391.8,391.52,378.23,375.16,129.89,130.36,121.2")
    
    //SET 2
    array.push(a_str_set_ticker, "TSLA,TSLA,TSLA,SPY")
    array.push(a_str_set_x1, "2,2,2,2")
    array.push(a_str_set_x2, "1,1,1,1")
    array.push(a_str_set_y1, "872.94,874.37,643.0,392.01")
    array.push(a_str_set_y2, "872.47,873.18,659.51,391.8")
    
    array.push(a_str_set_ticker, "SPY,SPY,SPY,AAPL,AAPL,AAPL")
    array.push(a_str_set_x1, "2,2,2,2,2,2")
    array.push(a_str_set_x2, "1,1,1,1,1,1")
    array.push(a_str_set_y1, "391.88,378.81,374.8,130.65,131.07,120.1")
    array.push(a_str_set_y2, "391.52,378.23,375.16,129.89,130.36,121.2")


// Initialize the lines
f_init_lines() =>
    for x = 0 to i_max_lines-1
        array.push(a_lines, line.new(na, na, na, na, extend=i_extend_lines ? extend.both : extend.none))

// Draw lines
f_draw_lines() =>
    if array.includes(a_ticker, syminfo.ticker)
        var int[]   subarray_x1 = array.new_int()
        var int[]   subarray_x2 = array.new_int()
        var float[] subarray_y1 = array.new_float()
        var float[] subarray_y2 = array.new_float()
        var int     x1          = na
        var int     x2          = na
        var float   y1          = na
        var float   y2          = na

        // Get elements with current ticker and put in a subarray.
        for x = array.indexof(a_ticker, syminfo.ticker) to array.lastindexof(a_ticker, syminfo.ticker)
            if array.get(a_ticker, x) == syminfo.ticker
                array.push(subarray_x1, array.get(a_x1, x))
                array.push(subarray_x2, array.get(a_x2, x))
                array.push(subarray_y1, array.get(a_y1, x))
                array.push(subarray_y2, array.get(a_y2, x))

        // Draw all lines in the subarray.
        for x = 0 to min(array.size(subarray_x1),i_max_lines)-1
            x1 := array.get(subarray_x1, x)
            x2 := array.get(subarray_x2, x)
            y1 := array.get(subarray_y1, x)
            y2 := array.get(subarray_y2, x)
            line.set_xy1(array.get(a_lines, x), bar_index - x1, y1)
            line.set_xy2(array.get(a_lines, x), bar_index - x2, y2)     

// Process the data
f_process_data() =>
    for z = 0 to array.size(a_str_set_ticker)-1
        for i = 0 to array.size(str.split(array.get(a_str_set_ticker, z),","))-1
            array.push(a_ticker,              array.get(str.split(array.get(a_str_set_ticker, z),","),i)    )
            array.push(a_x1,     int(tonumber(array.get(str.split(array.get(a_str_set_x1,     z),","),i)))  )
            array.push(a_x2,     int(tonumber(array.get(str.split(array.get(a_str_set_x2,     z),","),i)))  )
            array.push(a_y1,         tonumber(array.get(str.split(array.get(a_str_set_y1,     z),","),i))   )
            array.push(a_y2,         tonumber(array.get(str.split(array.get(a_str_set_y2,     z),","),i))   )

// Debug info
f_debug(_show) =>
    if _show
        label_text = "a_ticker=" + tostring(a_ticker) + "\n" + "a_x1=" + tostring(a_x1) + "\n" + "a_x2=" + tostring(a_x2) + "\n" + "a_y1=" + tostring(a_y1) + "\n" + "a_y2=" + tostring(a_y2)
        label.new(bar_index, high, label_text) 


if barstate.islast
    // Initialization
    f_init_data()
    f_init_lines()

    // Process the data
    f_process_data()
    
    // Draw lines
    f_draw_lines()

    // Show debug info
    f_debug(i_debug)    

Edit 2
In response to this comment.
Loops made smaller to avoid Loop takes too long to execute error.
Please update the f_process_data() function to the one below.

// Process the data
f_process_data() =>
    var string[]    a_str = array.new_string()
    
    for z = 0 to array.size(a_str_set_ticker)-1
        a_size  = array.size(str.split(array.get(a_str_set_ticker, z),","))
        
        a_str := str.split(array.get(a_str_set_ticker, z),",")
        for i = 0 to a_size-1
            array.push(a_ticker,              array.get(a_str,i)    )

        a_str := str.split(array.get(a_str_set_x1, z),",")
        for i = 0 to a_size-1
            array.push(a_x1,     int(tonumber(array.get(a_str,i)))  )

        a_str := str.split(array.get(a_str_set_x2, z),",")
        for i = 0 to a_size-1
            array.push(a_x2,     int(tonumber(array.get(a_str,i)))  )

        a_str := str.split(array.get(a_str_set_y1, z),",")
        for i = 0 to a_size-1
            array.push(a_y1,         tonumber(array.get(a_str,i))   )

        a_str := str.split(array.get(a_str_set_y2, z),",")
        for i = 0 to a_size-1
            array.push(a_y2,         tonumber(array.get(a_str,i))   )

Upvotes: 2

Related Questions