【问题标题】:var does NOT keep it's value across barsvar 不会跨栏保持其值
【发布时间】:2020-04-16 19:30:59
【问题描述】:
//@version=4
study("Keep data across bars (var)", overlay=true)

// Variables
var bool canGoShort = true
var bool canGoLong = true
var int myTest = 5

// Functions
f_print(_txt) => t = time + (time - time[1]) * 3, var _lbl = label.new(t, high, _txt, xloc.bar_time, yloc.price, #00000000, label.style_none, color.gray, size.large), label.set_xy(_lbl, t, high + 3 * tr)

// MAIN
if canGoShort
    myTest := myTest + 1

if canGoLong
    myTest := myTest + 1

f_print("myTest=" + tostring(myTest))

我对这个似乎无法按预期工作的简单脚本感到困惑。

我用值 5 初始化了一个 var 变量 myTest
由于canGoShortcanGoLong 总是true,我希望myTest 的值在每个柱上增加1,两次:
一次在if canGoShort,一次在if canGoLong
假设我们有 5000 个柱,那么我希望它以 5 + (5000 * 2) = 10005 结束。

但是,在运行脚本时,会打印myTest=7

我的印象是声明 var int myTest = 5 在每个柱上执行。
据我了解,使用关键字var 定义的变量在所有条形图中都保持其值,但似乎并非如此。

文档清楚地表明它应该保持它的价值:

我在这里错过了什么?

【问题讨论】:

    标签: pine-script


    【解决方案1】:

    计算按预期进行。我们的f_print() 函数出了什么问题。对此表示歉意。您选择的版本不会刷新文本。这段代码有一个更新版本的f_print() 可以做到这一点。

    请注意,要逐条检查值,正如您在这里所希望的那样,如果您还打开数据窗口来检查值,我们的 plotchar() 技巧会更有用,因为您可以在鼠标时检查每个条的值酒吧到酒吧。如果您有 Windows 设置并感兴趣,请参阅我们的回答 here 了解我们的 AHK 宏,该宏从变量名生成语句。

    //@version=4
    study("Keep data across bars (var)", overlay=true)
    
    // Variables
    var bool canGoShort = true
    var bool canGoLong = true
    var int myTest = 5
    
    // Functions
    f_print(_txt) => var _lbl = label.new(bar_index, highest(10)[1], _txt, xloc.bar_index, yloc.price, #00000000, label.style_none, color.gray, size.large, text.align_left), label.set_xy(_lbl, bar_index, highest(10)[1]), label.set_text(_lbl, _txt)
    // MAIN
    if canGoShort
        myTest := myTest + 1
    
    if canGoLong
        myTest := myTest + 1
    
    f_print("myTest=" + tostring(myTest, "0.0"))
    plotchar(myTest, "myTest", "", location.top)
    

    再次为麻烦道歉。我们在常见问题解答中更新了 f_print() 的所有实例。请注意,顺便说一句,我们使用该版本主要用于调试,因为它只包含一行。这是我们使用 Ctrl+Shift+p 生成 f_print() 的 AHK 代码,用于调试:

    ^+P:: SendInput f_print(_txt) => var _lbl = label.new(bar_index, highest(10)[1], _txt, xloc.bar_index, yloc.price, {#}00000000, label.style_none, color.gray, size.large, text.align_left), label.set_xy(_lbl, bar_index, highest(10)[1]), label.set_text(_lbl, _txt)`nf_print(){Left}
    

    在即将发布的脚本中,我们使用这个版本,更灵活、更高效,但由于if语句,无法压缩到一行:

    // ————— Print a label at end of chart.
    f_print(_txt, _y, _color, _offsetLabels) => 
        var label _lbl = na
        _t = int(time + (time - time[1]) * _offsetLabels)
        if barstate.islast
            if na(_lbl)
                // Only create label once.
                _lbl := label.new(_t, _y, _txt, xloc.bar_time, yloc.price, #00000000, label.style_none, color.gray, size.large)
                // Fudge return type of `if` block so compiler doesn't complain (thx midtownsk8rguy for the trick).
                int(na)
            else
                // Rather than delete and recreate the label on every realtime bar update, update the label's information; it's more efficient.
                label.set_xy(_lbl, _t, _y)
                label.set_text(_lbl, _txt)
                label.set_textcolor(_lbl, _color)
                int(na)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多