条件安全 () 调用
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
将导致脚本在当前安全解析参数期间重新绘制。
我正在尝试通过 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
将导致脚本在当前安全解析参数期间重新绘制。