PineScript-无法在函数内部获取全局范围变量

时间:2020-09-14 16:47:10

标签: pine-script

例如,以下脚本:

//@version=4
study("sample")
func(val)=>
    label l1= label.new(bar_index, high, text=tostring(val[2]), style=label.style_circle) 
trigger_condition = barstate.islast
if(barstate.islast)
    func(close)

这总是显示nan作为结果。是什么原因呢?将xyz_[2]更改为xyz[2]都不起作用。

1 个答案:

答案 0 :(得分:1)

您的问题不是函数范围内全局变量的可见性,因为函数使用的值作为参数传递给它。

您的代码无法按预期工作,因为您仅在数据集的最后一个小节上调用了该函数,并且由于它是第一次被调用,因此创建时没有要引用的历史val值标签。

解决方案是在每个小节上执行该功能。这段代码显示了两种等效的方法,第二种是最有效的。查看代码中的注释:

//@version=4
study("sample")

func1(val)=>
    // Create label on first bar.
    var label l1 = label.new(bar_index, high, "", style=label.style_circle)
    // Redefine label's position and text on each bar.
    label.set_text(l1, tostring(val[2]))
    label.set_xy(l1, bar_index, high)

func2(val)=>
    // Track history of the values on every bar but do nothing else.
    _v = val[2]
    if barstate.islast
        // Create label on last bar only.
        l1 = label.new(bar_index, high, tostring(_v), style=label.style_circle)

func1(close)

[EDIT:2020.09.15 15:26 — LucF]
第三等价示例,说明在评论中的评论以回答:

func3(_val)=>
    if barstate.islast
        // Create label on last bar only.
        l1 = label.new(bar_index, high, tostring(_val), style=label.style_circle)

func3(close[2])

该方法也将起作用,因为历史缓冲区的当前默认值为250,可确保在偏移量2处存在close的值。

if barstate.islast
    label.new(bar_index, high, tostring(close[2]), style=label.style_circle)