外观
K线状态
约 1649 字大约 6 分钟
简介
barstate命名空间中的一组内置变量可让您的脚本检测当前执行所在K线的不同属性。
这些状态可用于将代码的执行或逻辑限制在特定K线上。
部分内置变量返回当前K线所属交易时段的信息,相关说明请参阅交易时段状态章节。
K线状态内置变量
需注意:虽然指标和库函数会在每次价格或成交量更新时实时运行,但未启用calc_on_every_tick的策略仅在实时K线收盘时执行。这将影响该类脚本对K线状态的检测。例如在开盘市场中,以下代码直到实时K线收盘才会显示背景色(因为此时策略才会执行):
Mine Script®
已复制
barstate.isfirst
barstate.isfirst 仅在数据集的第一根K线(即当 bar_index 为零时)返回 true。
该状态特别适用于仅在首根K线进行变量初始化的场景,例如:
Mine Script®
已复制
barstate.islast
barstate.islast 会在当前K线为图表最后一根时返回true,无论该K线是否为实时K线。
此属性可用于将代码执行限制在图表的最后一根K线,在绘制线条、标签或表格时特别有用。以下示例展示如何在最后一根K线上创建并更新标签(采用高效实现方式):
Mine Script®
已复制
barstate.ishistory
barstate.ishistory 在所有历史K线上返回 true。该状态与 barstate.isrealtime 互斥(即两者不会在同一根K线上同时为 true),且在实时K线的收盘确认时(当 barstate.isconfirmed 变为 true 时)仍保持 false。在闭市状态下,该状态可能与 barstate.islast 在同一根K线上同时为 true。
barstate.isrealtime
barstate.isrealtime 会在当前数据更新为实时K线更新时返回 true,否则返回 false(即处于历史K线阶段)。需注意,barstate.islast 在所有实时K线上同样会返回 true。
barstate.isnew
barstate.isnew 在所有历史K线以及实时K线的首次(开盘)更新时返回 true。
所有历史K线都被视为新K线,因为 MIne Script® 运行时按时间顺序从图表的第一根K线开始依次执行脚本,直到最后一根。因此,每根历史K线都会在脚本执行过程中被逐根处理。
barstate.isnew 可用于在实时新K线到来时重置 varip 变量。以下代码会在所有历史K线以及每根实时K线开始时将 updateNo 重置为 1,并计算每根实时K线期间的实时更新次数:
Mine Script®
已复制
barstate.isconfirmed
barstate.isconfirmed 在所有历史K线以及实时K线的最后一次(收盘)更新时返回 true。
该属性可用于避免重绘问题,要求实时K线必须先收盘才能触发条件判断。如下示例中,我们使用该属性来延迟RSI指标的绘制,直到实时K线收盘成为已完成的实时K线。由于barstate.isconfirmed在历史K线上始终为true,因此历史K线上会正常绘制:
Mine Script®
已复制
barstate.isconfirmed 在 request.security() 函数调用中无效。
barstate.islastconfirmedhistory
barstate.islastconfirmedhistory 在以下情况下返回 true:
- 当市场关闭时,脚本执行数据集最后一根K线时
- 当市场开放时,脚本执行实时K线的前一根K线时
用途:
- 使用
barstate.islastconfirmedhistory[1]检测第一根实时K线 - 将服务器密集型计算推迟到最后历史K线执行(在开放市场中通常无法检测到此时机)
示例代码
以下脚本展示了barstate.*状态变量的实际应用:
Mine Script®
已复制
需要注意的是:
- 当各状态条件成立时,其名称将显示在标签文本中。
- 标签背景共有五种可能颜色:
- 洋红色(首根K线)
- 银色(历史K线)
- 灰色(最后确认的历史K线)
- 橙色(实时K线确认收盘时)
- 红色(实时K线首次执行时)
- 黄色(实时K线的其他次执行时)
我们首先将该指标添加到开盘市场的图表上,但在收到任何实时更新之前。请注意在#1位置如何识别最后确认的历史K线,以及如何将最后一根K线识别为最后一根,但由于尚未收到实时更新,它仍被视为历史K线。

让我们观察开始接收实时数据更新时的情况:

需要注意的是:
- 实时K线显示为红色,因为这是它的第一次执行,此时
barstate.isnew为true且barstate.ishistory不再为true,因此我们的条件判断结构选择了barstate.isnew => color.red分支。这种情况通常不会持续很久,因为在下次更新时barstate.isnew将不再为true,标签颜色会变为黄色。 - 已完结实时K线的标签显示为橙色,因为这些K线在收盘时不属于历史K线。因此,条件判断结构中的
barstate.ishistory => color.silver分支未被执行,而是执行了下一个barstate.isconfirmed => color.orange分支。
最后一个示例展示了实时K线标签在首次执行后如何变为黄色。这是实时K线上标签通常的显示方式:
