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
。
由于 canGoShort
和 canGoLong
总是 true
,我希望 myTest
的值在每个柱上增加 1,两次:
一次在 if canGoShort
,一次在 if canGoLong
.
假设我们有 5000 个柱,那么我希望它以 5 + (5000 * 2) = 10005 结束。
但是,当 运行ning 脚本时,会打印 myTest=7
?
我的印象是声明 var int myTest = 5
在每个柱上执行。
据我了解,使用关键字 var
定义的变量在所有条形图上都保持其值,但似乎并非如此。
文档清楚地表明它应该保持它的价值:
- https://www.tradingview.com/pine-script-reference/#op_var
var 是用于变量赋值和一次性初始化的关键字。
- https://www.pinecoders.com/faq_and_code/#techniques
从 v4 开始,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)
//@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
。
由于 canGoShort
和 canGoLong
总是 true
,我希望 myTest
的值在每个柱上增加 1,两次:
一次在 if canGoShort
,一次在 if canGoLong
.
假设我们有 5000 个柱,那么我希望它以 5 + (5000 * 2) = 10005 结束。
但是,当 运行ning 脚本时,会打印 myTest=7
?
我的印象是声明 var int myTest = 5
在每个柱上执行。
据我了解,使用关键字 var
定义的变量在所有条形图上都保持其值,但似乎并非如此。
文档清楚地表明它应该保持它的价值:
- https://www.tradingview.com/pine-script-reference/#op_var
var 是用于变量赋值和一次性初始化的关键字。 - https://www.pinecoders.com/faq_and_code/#techniques
从 v4 开始,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)