var 不会保持它的价值

var does NOT keep it's value across bars

//@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 结束。

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

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

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

我在这里错过了什么?

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

请注意,要逐条检查值,就像您在这里想要的那样,如果您还打开数据 Window 来检查值,我们的 plotchar() 技巧会更有用,因为您当您将鼠标移动到条形图时,可以检查每个条形图的值。如果您有 Windows 设置并且感兴趣,请参阅我们的 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[=32= 生成 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)