基于符号和整数的字符串数组的时间戳输入

时间:2021-03-05 13:12:03

标签: pine-script

基于来自 Bjorn 的 this approach,我试图发送一个整数列表,用于在 PineScript 的 timestamp 函数中使用,以在下面代码的末尾生成一个锚定的 VWAP。此示例代码比 Bjorn 的原始代码小,因为它仅使用 x1x2 变量,在这种情况下应该生成月 (x1) 和日 (x2)数组组中的整数。使用包含的调试函数,我的数组 month_varday_var 仅在最后一个柱形处填充,其余值为 NaN,因此 timestamp 不会按预期处理常量。是否可以根据这些数组元素生成一个常量以在 timestamp 中使用,就像输入一样?

预期结果示例:

当 syminfo.ticker == SPY -> 从 2021 年 2 月 1 日起锚定 VWAP

当 syminfo.ticker == QQQ -> 自 2021 年 1 月 6 日起锚定 VWAP

//@version=4
study("Test", "Test", true)

//x1 = Month
//x2 = Day

int             i_max_lines         = input(10,    "Max number of lines drawn", minval=1, maxval=20)
bool            i_extend_lines      = input(true, "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 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 line[]      a_lines             = array.new_line()

var int[]       month_var           = array.new_int(1)
var int[]       day_var             = array.new_int(1)

// Initialize the data
f_init_data() =>

    array.push(a_str_set_ticker, "SPY,QQQ")
    array.push(a_str_set_x1, "2,1")
    array.push(a_str_set_x2, "1,6")
    
    array.push(a_str_set_ticker, "TSLA,AMZN")
    array.push(a_str_set_x1, "2,1")
    array.push(a_str_set_x2, "22,29")

// 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 int     x1          = na
        var int     x2          = 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))

        // 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)
            
            array.set(month_var, 0, x1)
            array.set(day_var, 0, x2)

// 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)))  )

// Debug info
f_debug(_show) =>
    if _show
        label_text = "month=" + tostring(array.get(month_var, 0)) + "day=" + tostring(array.get(day_var, 0))
        label.new(bar_index, high, label_text) 

if barstate.islast
    // Initialization
    f_init_data()

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

// Show debug info
f_debug(i_debug)  

getVwap(src,moment) =>
    start = time == moment
    sumSrc = src * volume
    sumVol = volume
    sumSrc := start ? sumSrc : sumSrc + sumSrc[1]
    sumVol := start ? sumVol : sumVol + sumVol[1]
    result = sumSrc / sumVol

plot(getVwap(high,timestamp(2021,array.get(month_var, 0),array.get(day_var, 0),9,30,0)))

1 个答案:

答案 0 :(得分:1)

这应该绘制 VWAP 线。

//@version=4
study("Test", "Test", true)

int             i_max_lines         = input(10,    "Max number of lines drawn", minval=1, maxval=20)
bool            i_extend_lines      = input(true, "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 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 line[]      a_lines             = array.new_line()

var int         ts                  = na // timestamp


// Initialize the data
f_init_data() =>
    array.push(a_str_set_ticker, "SPY,QQQ")
    array.push(a_str_set_x1, "2,1")
    array.push(a_str_set_x2, "1,6")
    
    array.push(a_str_set_ticker, "TSLA,AMZN")
    array.push(a_str_set_x1, "2,1")
    array.push(a_str_set_x2, "22,29")


// Calculate start timestamp for VWAP line
f_get_vwap_start() =>
    var int     x1          = na
    var int     x2          = na
    var int     start_ts    = na

    idx = array.indexof(a_ticker, syminfo.ticker)
    if idx >= 0
        x1       := array.get(a_x1, idx)
        x2       := array.get(a_x2, idx)
        start_ts := timestamp(2021, x1, x2, 09, 30, 00)

    start_ts

// 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)))  )

// Debug info
f_debug(_show) =>
    if _show
        label_text = "Month = " + tostring(month(ts)) + "\nDay = " + tostring(dayofmonth(ts))
        label.new(bar_index, high, label_text, style=label.style_label_left) 


getVwap(src,moment) =>
    var float   sumSrc = na
    var float   sumVol = na

    if moment
        start = time == moment
        sumSrc := src * volume
        sumVol := volume
        sumSrc := start ? sumSrc : sumSrc + sumSrc[1]
        sumVol := start ? sumVol : sumVol + sumVol[1]
        result = sumSrc / sumVol
    else
        na


if barstate.isfirst
    // Initialization
    f_init_data()

    // Process the data
    f_process_data()
    
    // Determine starting timestamp for current ticker
    ts := f_get_vwap_start()

if barstate.islast
    // Show debug info
    f_debug(i_debug)  

// This needs to be calculated on every bar
vwap_plot = getVwap(high, ts) 

// Plot VWAP line
plot(ts ? vwap_plot : na)