基于来自 Bjorn 的 this approach,我试图发送一个整数列表,用于在 PineScript 的 timestamp 函数中使用,以在下面代码的末尾生成一个锚定的 VWAP。此示例代码比 Bjorn 的原始代码小,因为它仅使用 x1 和 x2 变量,在这种情况下应该生成月 (x1) 和日 (x2)数组组中的整数。使用包含的调试函数,我的数组 month_var 和 day_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)))
答案 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)