条件安全 () 调用

Conditional security() call

我正在尝试通过 security() 调用(使用 lookahead_on)获取每日 High/Low/Close
这些每日 hlc 值对于同一天内的每个盘中柱保持不变。
因此,我试图每天只调用一次 security 函数(当日期更改时)。
但是,我不断收到错误 Cannot read property 'isTuple' of undefined.
我不明白为什么,而且似乎无法修复它。
有什么想法吗?

这是我的示例代码

//@version=4
study("My Script")

f_sec() => security(syminfo.ticker, "D", [high,low,close], lookahead = barmerge.lookahead_on)

bar_date_ts = timestamp(year(time),month(time),dayofmonth(time),0,0,0)
is_new_date = change(bar_date_ts)

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

if (is_new_date)
    [x,y,z] = f_sec()
    h := x
    l := y
    c := z
    
plot(h)
plot(l)
plot(c)

应该在全局范围内调用安全函数。

如果您删除元组,您将收到正确的编译器错误: Cannot call 'security' or 'financial' inside 'if' or 'for'

if (is_new_date)
    x := security(syminfo.ticker, "D", high, lookahead = barmerge.lookahead_on)
    y := security(syminfo.ticker, "D", low, lookahead = barmerge.lookahead_on)
    z := security(syminfo.ticker, "D", close, lookahead = barmerge.lookahead_on)
    h := x
    l := y
    c := z

所以将您的 f_sec 函数移到 if 语句之外,但是该函数将在每个柱上调用,而不是每天调用一次。

解决方案是使用条件运算符 ? :,它不适用于元组,因此您必须进行 3 次安全调用。我也不确定以这种方式节省计算能力,编译器可以评估两者。

var float x = na
var float y = na
var float z = na

x := is_new_date ? security(syminfo.ticker, "D", high,  lookahead = barmerge.lookahead_on) : nz(x[1])
y := is_new_date ? security(syminfo.ticker, "D", low,   lookahead = barmerge.lookahead_on) : nz(y[1])
z := is_new_date ? security(syminfo.ticker, "D", close, lookahead = barmerge.lookahead_on) : nz(z[1])

plot(x)
plot(y)
plot(z)

请注意,在不使用 history reference operator 的情况下使用 lookahead 将导致脚本在当前安全解析参数期间重新绘制。