绘制每日最高价、最低价、收盘价的手动水平

Plotting manual levels for daily high,low,close

由于我已经在这里问了几个问题以试图解决我的问题,这个新问题将它们联系在一起并提供了一些背景信息。
以前与此相关的问题:

我有一个程序(在 TradingView 之外)试图估计下一个交易日 SPX 的 high/low/close 水平。
我打算仅在日内时间范围内绘制此图(从 1 分钟到 4 小时不等)。
我要绘制的唯一代码是 SPX

现在我正尝试在 TradingView 中绘制这些水平,以直观地表示预测水平的准确性。
这意味着我每个交易日都有一个 high/low/close 值。
当前数据集包含大约 50 个条目(所以 50 天我有一个 high/low/close 水平来绘制)并且每个交易日将增加 1 个条目。
因此在 1 年内,数据集将包含大约 200 个条目。

因为数据集大于TradingView可以显示的绘图对象的数量,我已经排除了使用像line.new()这样的绘图对象。
垃圾收集器只会显示最后 50 个左右绘制的对象,我希望显示完整的数据集。
因此,我想我需要求助于 plot() 函数。

这意味着我最终将绘制 3 个系列:highlowclose
每一个在每个交易日都有不同的价值。
所以基本上,我试图通过为每个日期分配一个值来手动创建这 3 个系列。
但是到目前为止,我没能做到。
我还试图在每个交易日只输入 1 行数据,以避免混乱并保持代码整洁和可维护。
因此,我尝试仅使用 1 个函数在每个交易日设置这 3 个数据点。

为了清楚起见,下面的脚本是我最近的尝试,只使用了 5 个交易日的缩减数据集。
我知道下面的脚本是错误的,因为一个变量不能被重复使用。
这就是为什么它说 line 19: 'h' is already defined.
我没有解决方法,我真的很想找到一个。

//@version=4
study("Study", overlay=true)

// Variables    
var float dh = na
var float dl = na
var float dc = na

// Functions
isDate(y,m,d) => y==year and m==month and d==dayofmonth ? true:false 
d(y,m,d,h,l,c) => // Daily Levels
    if isDate(y,m,d)
        [h,l,c]
    else
        [na,na,na] 

// Set data for Daily High,Low,Close
[h,l,c] = d(2020,04,13,2800,2700,2725), dh:=h,dl:=l,dc:=c
[h,l,c] = d(2020,04,14,2850,2810,2825), dh:=h,dl:=l,dc:=c
[h,l,c] = d(2020,04,15,2800,2750,2710), dh:=h,dl:=l,dc:=c
[h,l,c] = d(2020,04,16,2850,2700,2790), dh:=h,dl:=l,dc:=c
[h,l,c] = d(2020,04,17,2900,2800,2850), dh:=h,dl:=l,dc:=c

// Plot Daily High,Low,Close
plot(dh, color=color.red)
plot(dl, color=color.green)
plot(dc, color=color.blue)

另一种尝试是下面的代码,它编译正常。

//@version=4
study("Functions test", overlay=true)

var float h = na
var float l = na
var float c = na

isDate(y,m,d) => y==year and m==month and d==dayofmonth ? true:false
setData() => 
    if isDate(2020,04,13)
        [2800,2700,2725]
    if isDate(2020,04,14)
        [2850,2810,2825]
    if isDate(2020,04,15)
        [2800,2750,2710]
    if isDate(2020,04,16)
        [2850,2700,2790]
    if isDate(2020,04,17)
        [2900,2800,2850]

[h1,l1,c1] = setData()

h := h1
l := l1
c := c1

plot(h,color=color.red)
plot(l,color=color.green)
plot(c,color=color.blue)

这里的问题是它只绘制最后日期的值。

这应该可以扩展。只需用很多行 POC 即可确定:

//@version=4
study("HLC Levels", "", true)

initOnDate(_y, _m, _d, _prev, _init) => 
    if _y == year and _m == month and _d == dayofmonth
        _init
    else
        _prev

float h = na
float l = na
float c = na
int   y = 0
int   m = 0
int   d = 0

y := 2020, m := 03, d := 31, h := initOnDate(y, m, d, h, 2600), l := initOnDate(y, m, d, l, 2500), c := initOnDate(y, m, d, c, 2525)
y := 2020, m := 04, d := 01, h := initOnDate(y, m, d, h, 2610), l := initOnDate(y, m, d, l, 2510), c := initOnDate(y, m, d, c, 2535)
y := 2020, m := 04, d := 02, h := initOnDate(y, m, d, h, 2620), l := initOnDate(y, m, d, l, 2520), c := initOnDate(y, m, d, c, 2545)

plot(h, "h", change(h) ? na : color.green,  1)
plot(l, "l", change(l) ? na : color.red,    1)
plot(c, "c", change(c) ? na : color.orange, 1)