barstate.islast:判断图表的最后一根K线
当一个 TradingView 脚本在图表上运行时,它的计算从第一根K线开始,然后依次向后,一直处理到图表的最后一根K线。
通过 barstate.islast 变量,我们可以判断脚本是否已经运行到了图表的最后一根价格K线 。
该变量会返回以下两个值之一 :
true:当脚本当前正在图表的最后一根K线上计算时。false:当脚本处理的并非最后一根K线时。(即最后一根K线之前的所有K线。)
让我们看看这在图表上是如何具体表现的。
barstate.islast 的图表示例
下面的这个快速指标,会用文本标签高亮显示图表的最后一根K线:
//@version=5
indicator(title="barstate.islast example", overlay=true)
// 只在图表的最后一根(或多根)K线上创建标签
if barstate.islast
label.new(x=bar_index, y=high, color=color.black,
textcolor=color.white, text="最后一根K线!")
这个脚本首先通过 indicator() 函数来配置其属性,例如命名脚本 (title) 并将其叠加到主图的交易品种上 (overlay=true)。
接着,一个 if 语句用来评估 barstate.islast 变量。该变量仅在最后一根K线上为 true,在任何其他K线上均为 false。
当值为 true 时,label.new() 函数便会创建一个新的文本标签。这个黑色的 (color.black) 标签会在图表上显示”最后一根K线!”文本。
当我们将此脚本添加到图表时,它会用一个标签高亮显示最后一根K线:
当市场休市、交易品种不交易时,图表上只存在唯一一根最后一根K线。
但是,如果该交易品种正在活跃交易中,新的价格K线就会不断出现在图表上。这些新出现的K线同样会被标记为图表的最后一根K线。毕竟,每一根新生成的实时K线,都是当下那一刻的最后一根K线。
一段时间后,图表上就会出现好几个最后一根K线的标记:
因为每根新生成的实时K线都会创造出一个新的最后一根K线,所以图表上并非只有一个最后一根K线。恰恰相反,如果我们让图表长时间保持打开状态,可能会出现数百个被标记为最后一根K线的K线。
barstate.islast 的实际用途
barstate.islast 变量使得一些实用的功能成为可能,包括:
- 优化计算:仅在图表的最后一根K线上处理数组数据,从而节省在其他价格K线上的计算资源。
- 移动绘图对象:更新绘图对象的位置,使它们能够跟随新生成的实时K线移动。
- 推迟输出计算:推迟为绘图输出进行的计算。因为我们只有在脚本运行到最后一根K线后才能看到标签和表格,所以没有必要提前为它们计算内容。
由于 barstate.islast 标记着脚本已遍历完所有K线,我们可以利用这个时点,来处理那些只需要在脚本计算流程末端才需执行的工作。
barstate.islast 在策略中的局限性
barstate.islast 对于策略而言并非总是有用。策略默认在K线收盘时才进行计算。这意味着,只有当最后一根K线也收盘时,策略才能知晓它已到达最后一根K线。但这要求我们必须等到最后一根K线走完。
对于策略来说,一个更好的替代方案是 barstate.islastconfirmedhistory 变量。该变量在最后一根历史K线上为 true,这是策略在回测计算流程末端总能立刻遇到的。这使得它成为在回测结束时执行最终计算的理想位置。
barstate.islast 的特性
- 与
barstate.islastconfirmedhistory的区别:barstate.islast不一定能找到最后一根历史K线。毕竟,当市场正在交易时,最后一根K线是实时K线。而barstate.islastconfirmedhistory变量则能精确地捕获到最后一根历史K线。 - 历史值访问:通过历史操作符(
[]),我们可以访问barstate.islast在之前K线上的值。这可以告诉我们,在当时那个时间点,之前某根K线是否是图表的最后一根K线。 - 执行一次性任务:如果只想在图表末尾执行一次代码,我们应该使用
barstate.islastconfirmedhistory变量。该变量只会出现一次true的情况,而barstate.islast则会在每一根新生成的最后一根K线上都变为true。 - 在K线回放中的行为:在使用 TradingView 的K线回放功能时,
barstate.islast对每一根被回放的价格K线都为true。
注意事项
barstate.islast 变量,与其他K线状态变量一样,可能导致脚本在未来我们再次打开相同图表时行为发生变化。这种情况会导致所谓的重绘(repainting)效应。
barstate.islast 与其他K线状态变量的对比
Pine Script 拥有比识别最后一根K线更多的变量。脚本还可以检查第一根K线或实时K线等。那么,barstate.islast 与其他K线状态变量之间有何关联呢?让我们逐一来看:
-
第一根K线 (
barstate.isfirst) 在第一根K线上,barstate.islast的值为false。第一根和最后一根K线几乎总是不同的K线。一个例外是当某个交易品种在图表上只有一个K线数据时(例如 IPO 当天),此时第一根和最后一根K线是同一根。 -
历史K线 (
barstate.ishistory) 在历史K线上,只有当这根历史K线是图表的最后一根时,barstate.islast的值才为true。对于其他历史K线,其值为false。当市场开盘交易时,所有历史K线上的barstate.islast值均为false,因为此时的最后一根K线是实时K线。 -
已收盘K线 (
barstate.isconfirmed) 在一根已收盘的K线上,只有当这根已收盘的K线同时也是图表的最后一根时,barstate.islast的值才为true。对于任何在此之前的已收盘K线,其值均为false。 -
最后一根历史K线 (
barstate.islastconfirmedhistory) 在最后一根历史K线上,只有当这根历史K线同时也是图表的最后一根时,barstate.islast的值才为true。如果该品种正在交易中,那么最后一根历史K线便不再是图表的最后一根K线,此时在最后一根历史K线上barstate.islast的值为false。 -
新K线 (
barstate.isnew) 在一根新K线上,只有当这根新K线同时也是图表的最后一根K线时,barstate.islast的值才为true。对于脚本遇到的其他新K线(例如历史K线),其值为false。 -
实时K线 (
barstate.isrealtime) 在实时K线上,barstate.islast的值始终为true。这是因为实时K线必然是图表的最后一根K线;我们不可能在除了最后一根K线以外的位置看到实时K线。
总结
barstate.islast 变量用于判断脚本当前是否正在图表的最后一根K线上进行计算。
- 当我们刚把脚本添加到图表时,只有一根最后一根K线:即图表窗口最右侧的那根K线。
- 之后,每根新出现的实时K线,也都会成为图表当时的最后一根K线。这就是为何一个图表最终会有多个被标记为最后一根K线的原因。
barstate.islastconfirmedhistory:判断最后一根历史K线
为了处理价格图表,一个 TradingView 的指标或策略会在每一根K线上进行计算。它的计算从第一根K线开始,然后是下一根,再下一根,如此依次处理完价格图表上的所有K线。
在这个计算流程接近尾声时,它会到达最后一根历史K线。通过 barstate.islastconfirmedhistory 变量,我们便可以判断脚本当前是否正在这根K线上进行计算 。
该变量会返回以下两个值之一 :
true:当脚本在一根由历史数据构成的最后一根K线上计算时。如果市场已休市,那么这根K线就是图表的最后一根K线。如果该品种正在交易中,那么这根K线就是第一根实时K线紧邻的前一根K线。false:当脚本处理的是一根实时K线或任何其他的历史K线时。
为了更好地理解,让我们看看这在图表上的具体表现。
barstate.islastconfirmedhistory 的图表示例
下面的这个快速指标,会在图表的最后一根历史K线上创建一个标签:
//@version=5
indicator(title="barstate.islastconfirmedhistory example", overlay=true)
// 用标签注释图表的最后一根历史价格K线
if barstate.islastconfirmedhistory
label.new(x=bar_index, y=high, color=color.green,
textcolor=color.white, text="最后一根\n历史K线")
这个脚本首先通过 indicator() 函数来配置其属性。title 用于命名脚本,而 overlay 则使指标显示在图表的主交易品种上。
接着,一个 if 语句检查 barstate.islastconfirmedhistory 变量。这个变量仅在图表的最后一根历史K线上返回 true,在任何其他K线上,其值均为 false。
当其值为 true 时,if 语句内的代码便会调用 label.new() 函数,这会绘制一个新的文本标签。这个绿色的 (color.green) 标签会在图表上显示最后一根历史K线的文本。
当我们将这个脚本添加到一个市场已休市的交易品种上时,它会将图表的最后一根K线标记为最后一根历史K线。
但是,如果该交易品种当前正在交易中,那么在我们加载图表后,位于当前实时K线紧邻的前一根K线,就是最后一根历史K线:
如果我们让图表保持打开状态,后续会形成更多根实时K线。但这些新K线并不会成为最后一根历史K线。
原因在于这些K线并非由历史数据构成。由于 TradingView 是用实时数据创建它们的,所以它们不具备历史K线的属性。
对于我们的脚本而言,这意味着同一根K线会始终保持其作为图表最后一根历史K线的状态:
此外,还有另外两个 TradingView 的特性会影响到哪一根K线是最后一根历史K线。
首先,当一根实时K线收盘时,它并不会转变为一根历史K线。对于 TradingView 而言,历史K线专指由历史数据构成的K线。一根仅仅发生在不久前的过去的K线,不一定就是历史K线。
当一根实时K线收盘时,它确实变成了一根不久前的过去的K线。但因为它是由实时数据而非历史数据构成的,所以它不会变为历史K线。
其次,当我们从图表上移除脚本再重新添加回去时,那些早先由实时数据生成的K线,依旧不会被视为历史K线。
这是因为这些K线是在图表打开期间,由 TradingView 接收实时数据而生成的。但如果我们关闭 TradingView 应用再重新启动它,那么 TradingView 会从其历史数据服务器抓取这些K线的数据。这时,它们才会真正转变为历史K线。
注意事项
barstate.islastconfirmedhistory 变量用于识别由历史数据构成的最后一根K线。
这根K线不一定是图表上物理位置的最后一根K线。而且这根K线的位置也不是恒定不变的:重新启动 TradingView 会改变哪一根K线是最后一根历史K线。
barstate.islastconfirmedhistory 的实际用途
通常,我们使用 barstate.islastconfirmedhistory 将计算密集型操作推迟到脚本运行至最后一根历史K线时再执行 。通过这种方式,脚本就无需在每一根K线上都重复进行那些耗时较长的计算。
barstate.islastconfirmedhistory 对于那些我们希望在图表末尾只执行一次的任务也同样大有帮助。
以下是我们可以使用该变量的一些具体场景:
- 创建一个表格,用以汇总脚本在历史数据上处理后的信息。
- 在图表末尾,利用数组执行计算密集型的工作。
- 在策略回测的末尾,计算自定义的回测性能指标。
- 创建一个绘图对象(例如标签),之后随着传入的实时价格更新来动态更新它。
barstate.islastconfirmedhistory 的特性
- 唯一性:在脚本的整个计算过程中,从第一根K线到最后一根K线,再到后续的实时计算,有且仅有一次计算会使得
barstate.islastconfirmedhistory的值为true。 - 位置:在最后一根历史K线(
barstate.islastconfirmedhistory) 的左侧,是图表上所有的历史K线;在其右侧,是所有在实时行情中生成的K线。 - 历史值访问:通过历史操作符(
[]),我们可以访问barstate.islastconfirmedhistory在之前K线上的值,从而判断之前的某一根特定K线是否是图表的最后一根历史K线。 - 在K线回放中的行为:在使用 TradingView 的K线回放功能时,
barstate.islastconfirmedhistory在倒数第二根K线上为true。也就是说,其顺序是:最后一根历史K线,然后是最后一根K线,再然后是按下回放按钮后新回放的K线。(在被回放的K线上,barstate.islastconfirmedhistory的值为false。)
注意事项
barstate.islastconfirmedhistory 变量,与其他K线状态变量一样,可能因K线是由实时数据还是历史数据构成而导致脚本行为不一致。这种情况可能会产生所谓的重绘(repainting)效应。
barstate.islastconfirmedhistory 与其他K线状态变量的对比
Pine Script 还能识别K线的其他状态特征,例如已收盘K线和实时K线。那么,barstate.islastconfirmedhistory 与其他K线状态变量之间有何关联呢?我们来逐一探究:
-
第一根K线 (
barstate.isfirst) 在第一根K线上,barstate.islastconfirmedhistory的值为false。因为第一根K线几乎永远不可能是最后一根历史K线。一个例外是当图表上只有一个历史K线数据时(例如 IPO 上市首日),此时第一根K线和最后一根历史K线是同一根。 -
历史K线 (
barstate.ishistory) 在历史K线上,只有当这根历史K线是最后一根历史K线时,barstate.islastconfirmedhistory的值才为true。对于在此之前的所有历史K线,其值均为false。 -
已收盘K线 (
barstate.isconfirmed) 在一根已收盘的K线上,只有当这根K线同时也是最后一根历史K线时,barstate.islastconfirmedhistory的值才为true。对于其他已收盘的历史K线,以及所有已收盘的实时K线,其值均为false。 -
最后一根K线 (
barstate.islast) 在最后一根K线上,只有当图表的最后一根K线恰好也是最后一根历史K线时,barstate.islastconfirmedhistory的值才为true。这种情况发生在市场休市时。当交易品种正在接收实时数据时,最后一根K线是实时K线,这使得barstate.islastconfirmedhistory在最后一根K线上的值为false。 -
新K线 (
barstate.isnew) 在一根新K线上,只有当这根新K线恰好是最后一根历史K线时,barstate.islastconfirmedhistory的值才为true。对于脚本遇到的其他新K线(无论是历史K线还是实时K线),其值均为false。 -
实时K线 (
barstate.isrealtime) 在实时K线上,barstate.islastconfirmedhistory的值始终为false。实时K线永远不可能是历史K线。
总结
barstate.islastconfirmedhistory 变量用于判断脚本当前是否正在一根由历史数据构成的最后一根K线上进行计算。
- 当我们刚为一个交易品种打开图表时,这根最后一根历史K线要么是图表的最后一根K线(当市场休市时),要么是实时K线紧邻的前一根K线(当市场正在交易时)。
- 在脚本的整个计算过程中,从第一根到最后一根K线,有且仅有一次计算会将
barstate.islastconfirmedhistory的值视为true。这使得该变量成为实现仅执行一次特定代码逻辑的绝佳方式。
barstate.isnew:判断新K线
当一个 TradingView 的指标或策略处理图表时,它会逐一遍历所有的价格K线,从第一根开始,一直持续到最后一根。
barstate.isnew 变量能够告诉我们,脚本在其计算过程中是否遇到了一根新的价格K线 。
该变量会返回以下两个值之一 :
true:当脚本在某一根特定的K线上进行第一次计算时。- 对于历史K线,这第一次计算发生在K线收盘时。
- 对于实时K线,这第一次计算可能发生在K线开盘时(适用于在每个tick上都计算的指标和策略),也可能发生在K线收盘时(策略的默认行为)。
false:当脚本此前已经在这根K线上进行过计算。- 这种情况只发生在实时K线上:在脚本处理完K线的开盘价后,后续的实时价格更新都属于同一根旧K线的范畴。
注意事项
所谓新K线,指的是对于脚本当前的计算流程而言是新的一根价格K线。也就是说,它是脚本此前尚未计算过的一根K线。因此,这个新是从脚本的视角定义的,与这根K线本身的日期和时间无关。
例如,如果一个日线图的数据始于1997年,那么在我们把脚本添加到图表的那一刻,它会从97年、98年、99年的数据开始处理。这些年份的K线对于脚本而言都是新的,因为当它从97年开始计算时,它还从未见过这些K线。(尽管从我们的角度来看,这些K线当然已经非常古老了。)
为了更好地理解,让我们看看该变量在图表上的实际运作情况。
barstate.isnew 的图表示例
下面的这个迷你指标会在每一根新K线上放置一个标签。
//@version=5
indicator(title="barstate.isnew example", overlay=true)
// 当脚本还未见过这根K线时(即,这是一根新K线),
// 就用标签高亮这根K线
if barstate.isnew
label.new(x=bar_index, y=high, color=color.teal,
textcolor=color.white, text="新K线")
这个脚本首先通过 indicator() 函数来定义其设置,例如使用 title 命名脚本,并通过 overlay 使脚本叠加显示在主图的交易品种上。
接着,一个 if 语句检查 barstate.isnew 变量。该变量仅在一根价格K线的第一次计算时为 true,而在同一根K线上的其他重复计算中均为 false。
当值为 true 时,我们调用 label.new() 函数来创建一个标签。这个青色的 (color.teal) 标签会在图表上显示新K线的文本。
当我们将这个脚本添加到图表时,它会将所有的历史K线都高亮标记为新K线。原因如下:当脚本从第一根K线开始依次向前处理时,它遇到的每一根K线都是它此前从未处理过的,因此对于脚本而言,它们都是新的:
(所有历史K线对于脚本而言都是新K线。但出于性能原因,TradingView 限制了标签的显示数量。所以,如果你将图表回溯很长的历史,会发现并非每根历史K线都有标签。)
在上图中,最后一根实时K线并没有被标记为新K线。一根实时K线仅在其开盘的那一刻对于指标而言是新的。但在该K线尚未走完的期间,后续的每一次脚本计算,barstate.isnew 的值均为 false。因此,在K线开盘后,标签就不会再显示。
正是由于这个原因,当新的实时K线最终收盘时,它们也不会获得新K线的标签:
barstate.isnew 的实际用途
barstate.isnew 变量使得一些实用的功能成为可能,包括:
- 当一根新的价格K线开始时,更新止盈和止损订单。
- 在交易时段开始时,即K线开盘的那一刻,提交订单。
barstate.isnew 能告知我们脚本此前是否已处理过某一根特定的K线。当我们将它与实时数据(由 barstate.isrealtime 变量来判断)结合使用时,我们便能精确地识别出价格K线的开盘tick(即第一笔价格更新)。
barstate.isnew 变量的特性
-
特殊情况:对于某些实时K线,
barstate.isnew可能永远不会变为true。这种情况指的是:有些K线在开盘时并没有新的价格更新,TradingView 生成它们仅仅是因为前一根K线的时间已经走完。这种情况在低时间周期以及交易不活跃的品种上尤其常见。如果在K线开盘的那一刻没有任何价格更新,barstate.isnew的值就会保持为false。 -
与计算设置的关系:当一个策略在K线收盘时才进行计算(默认行为),
barstate.isnew会在K线收盘的那个事件点上为true。但如果我们让策略在每个tick上都更新,那么barstate.isnew将只在K线开盘时为true。 -
在K线回放中的行为:有趣的是,在使用 TradingView 的K线回放功能期间,
barstate.isnew变量对于所有被回放的价格K线,其值始终为false。
注意事项
barstate.isnew 变量,与其他K线状态变量一样,会导致脚本在处理历史数据和实时数据时行为不一致。这种情况可能会产生所谓的重绘(repainting)效应。
barstate.isnew 与其他K线状态变量的对比
Pine Script 还能识别K线的其他状态特征,例如已收盘K线和最后一根K线等。那么,barstate.isnew 与其他K线状态变量之间有何关联呢?我们来一探究竟。
-
第一根K线 (
barstate.isfirst) 在第一根K线上,当脚本第一次处理这根K线时,barstate.isnew的值为true。这通常发生在第一根K线的收盘时刻,因为第一根K线几乎总是历史K线。 -
历史K线 (
barstate.ishistory) 在历史K线上,barstate.isnew的值始终为true。因为脚本在遍历图表时遇到的每一根历史K线,都是它初次见面的K线。 -
已收盘K线 (
barstate.isconfirmed) 在一根已收盘的K线上,如果这根K线是历史K线,barstate.isnew的值为true,因为这次在K线收盘时的计算是脚本对该K线的第一次计算。 如果这根已收盘的K线是实时K线,那么对于在每个tick上都更新的指标和策略而言,barstate.isnew的值为false。因为脚本在K线开盘时已经处理过它,所以到它收盘时,它就不再是新的了。 但如果这根已收盘的K线是实时K线,而我们的脚本是一个只在K线收盘时才计算的策略(默认行为),那么barstate.isnew的值在该K线收盘时为true。因为这次在K线收盘时的计算,是脚本第一次处理这根K线。 -
最后一根K线 (
barstate.islast) 在最后一根K线上,如果这根K线是历史K线,barstate.isnew的值为true。 如果最后一根K线是实时K线,那么对于在每个tick上都更新的指标和策略,barstate.isnew只在K线开盘时为true,而在该K线内的其他实时计算中均为false。 当一个策略只在K线收盘时计算(默认行为),那么barstate.isnew在每一根最后一根K线(barstate.islast)上都为true。 -
最后一根历史K线 (
barstate.islastconfirmedhistory) 在最后一根历史K线上,barstate.isnew的值始终为true。因为这根K线只会被处理一次,所以这次处理对于脚本而言必然是新的。 -
实时K线 (
barstate.isrealtime) 在一根实时K线上,对于在每个tick上都计算的指标和策略,barstate.isnew的值在K线开盘价时为true,在该实时K线内的其他脚本计算中,则为false。 如果一个策略只在K线收盘时计算(默认行为),那么每根K线只被处理一次,因此barstate.isnew在每一根实时K线上的值都为true。
总结
Pine Script 代码以逐根K线的方式处理图表。barstate.isnew 变量用于判断脚本当前是否正在一根新的价格K线上进行计算。
- 这里的新K线,指的是脚本尚未处理过的K线,这个新是从脚本的视角来定义的。
- 对于一个处理所有实时价格更新的脚本,
barstate.isnew只在K线开盘的那一刻为true。(在同一根K线内部的其他时刻则不为true。) - 当一个脚本只在K线收盘时进行计算,那么
barstate.isnew会在K线收盘的那一刻为true。(在同一根K线内,其值不会变为false。)
barstate.isrealtime:判断是否正在处理实时K线
当我们将一个 TradingView 的指标或策略添加到图表时,它会从处理第一根(以及所有后续的)历史K线开始。然后,当它运行到最后一根K线时,便会切换到处理实时数据的模式。
通过 barstate.isrealtime 变量,我们可以判断脚本当前是否正在处理一根实时K线 。
该变量会返回以下两个值之一 :
true:当脚本当前正在一根由实时数据构成的K线上进行计算时。false:当脚本处理的K线是由历史数据构建的时。
让我们看看这在图表上是如何具体表现的。
barstate.isrealtime 的图表示例
下面的这个脚本会用一个标签来高亮显示实时K线:
//@version=5
indicator(title="barstate.isrealtime example", overlay=true)
// 用标签高亮由实时数据构成的K线
if barstate.isrealtime
label.new(x=bar_index, y=high, color=color.new(color.orange, 40),
text="实时\nK线")
这个指标首先通过 indicator() 函数来定义其设置,这样做可以命名脚本 (title) 并将其叠加到主图的交易品种上 (overlay=true)。
接着,一个 if 语句检查 barstate.isrealtime 变量。该变量在实时K线上为 true,在历史K线上则为 false。
当值为 true 时,label.new() 函数便会创建一个新的文本标签。这个橙色的 (color.orange) 标签会在图表上显示”实时K线”文本。
当我们将这个脚本添加到一个市场已休市的交易品种上时(没有交易发生),那么没有任何K线会被标记为实时K线。
但是,如果该交易品种正在交易中,那么在我们打开其实时图表后,指标便会立刻将最后一根K线高亮标记为实时K线:
如果我们让实时图表保持打开状态,每一根新增的实时K线也都会被指标高亮标记为实时K线:
只要有新的实时K线形成,指标就会一直标记它们。
barstate.isrealtime:识别由实时数据构成的K线
关于 barstate.isrealtime,有一个值得了解的关键特性。这个变量识别的是在图表打开期间,所有由实时数据构成的K线。这与识别新生成的实时K线不是同一个概念。
如果我们让一个空白的实时图表保持打开状态一小时,然后再添加脚本,它会将这一小时内形成的所有K线都高亮标记为实时K线。这是因为 TradingView 是用实时数据(而非历史数据)来创建这些K线的。因此,在这些K线上 barstate.isrealtime 的值为 true。
同样地,如果我们从上方的 AUDCAD 图表中移除我们的示例指标,然后再重新添加回去,脚本并不会只高亮当前新的实时K线。恰恰相反,它也会标记那些先前已经是实时K线的K线。这是因为 TradingView 早先就是用实时数据创建了那些K线。
但如果我们关闭 TradingView 应用再重新启动它,此时 TradingView 的实时数据缓冲区已被清空。因此,它会从其历史数据服务器抓取这些K线的数据。这使得这些K线变成了由历史数据构成,从而导致 barstate.isrealtime 在这些K线上的值变为 false。
barstate.isrealtime 的实际用途
barstate.isrealtime 变量使得一些实用的功能成为可能,包括:
- 区分信号生成逻辑:仅用实时数据生成信号,而忽略历史行情中的设置。当我们代码依赖于历史数据中不可用的功能时(例如K线内的计算),这一点尤为重要。
- 应用不同的参数:为历史K线和实时K线应用不同的信号逻辑与参数。如果我们的策略在每个价格更新时都进行计算,它的响应速度会比在历史数据上快得多(这可能意味着它需要不同的参数)。
- 精确收集事件数据:在某个实时事件发生的那一刻收集数据。当我们的脚本处理实时更新时,一旦像创下日内新高这样的事件发生,它就能捕获到确切的时间。由于这些信息在历史数据中不可用,我们通常只能退而求其次使用K线的收盘时间。
因为 barstate.isrealtime 能够告诉我们构成一根K线的是哪种数据,所以我们可以用它来区分并分别处理实时行为和历史回测行为。
barstate.isrealtime 的特性
- 与
barstate.ishistory的关系:barstate.isrealtime变量与barstate.ishistory变量的逻辑完全相反。后者用于判断K线是否由历史数据构成,而barstate.isrealtime则指示K线由实时数据构成。当这两个变量中的一个为true时,另一个必定为false。(它们永远不能同时为true或同时为false。) - 历史值访问:我们可以通过历史操作符(
[])来访问barstate.isrealtime在之前K线上的值,从而判断之前的某根K线是否由实时数据构成。 - 在K线回放中的行为:在使用 TradingView 的K线回放功能期间,被回放的价格K线被视作实时K线:在这些K线上
barstate.isrealtime的值为true。
注意事项
barstate.isrealtime 变量,与其他K线状态变量一样,可能导致脚本在一个由实时数据构成的图表上的行为,与在同一个但由历史数据构成的图表上的行为有所不同。这种情况会造成所谓的重绘(repainting)效应。
barstate.isrealtime 与其他K线状态变量的对比
除了实时数据,Pine Script 还能识别K线的其他状态特征,例如我们也可以发现历史K线和已收盘K线等。那么,barstate.isrealtime 与其他K线状态变量之间有何关联呢?我们来逐一探究:
-
第一根K线 (
barstate.isfirst) 在第一根K线上,barstate.isrealtime的值为false。图表的第一根K线几乎总是历史K线。一个例外是当某个交易品种完全没有历史数据时(例如 IPO 上市当天),此时第一根K线将是实时K线。 -
历史K线 (
barstate.ishistory) 在历史K线上,barstate.isrealtime的值始终为false。历史K线与实时K线的定义是互斥的,因此它们永远不可能同时为真。 -
已收盘K线 (
barstate.isconfirmed) 在一根已收盘的K线上,如果这根K线是由实时数据构成的,barstate.isrealtime的值为true。如果这根已收盘的K线是由历史数据构成的,那么其值为false。 -
最后一根K线 (
barstate.islast) 在最后一根K线上,如果这根K线正在接收实时数据,barstate.isrealtime的值为true。当市场休市时,最后一根K线是历史K线,这使得barstate.isrealtime在该K线上的值为false。 -
最后一根历史K线 (
barstate.islastconfirmedhistory) 在最后一根历史K线上,barstate.isrealtime的值始终为false。历史K线与实时K线的定义是互斥的。 -
新K线 (
barstate.isnew) 在一根新K线上,如果这根K线是由实时数据构成的,barstate.isrealtime的值为true。如果这根新K线是由历史数据构成的,其值则为false。
总结
barstate.isrealtime 变量用于判断脚本当前是否正在处理一根由实时数据构成的K线。
- 当市场开市时,图表的最后一根K线是一根实时K线。
- 当一根实时K线收盘时,
barstate.isrealtime在这根K线上的值保持为true。这是因为它依然是由实时数据构成的(直到我们重新启动 TradingView 应用)。










