条形图状态

介绍

命名空间中的一组内置变量barstate允许您的脚本检测脚本当前正在执行的条的不同属性。

这些状态可用于将代码的执行或逻辑限制在特定的范围内。

一些内置函数会返回当前条所属交易时段的信息。它们在 “时段状态”部分中有解释。

栏状态内置变量

请注意,虽然指标和库会实时运行所有价格或成交量更新,但不使用的策略calc_on_every_tick则不会;它们只会在实时条形图关闭时执行。这将影响该类型脚本中条形图状态的检测。例如,在开放市场上,此代码在实时条形图关闭之前不会显示背景,因为那是策略运行的时间:

//@version=5
strategy("S")
bgcolor(barstate.islast ? color.silver : na)

`barstate.isfirst`

barstate.isfirst 仅位于true数据集的第一个条形图上,即当 bar_index 为零时。

仅在第一个柱上初始化变量会很有用,例如:

// Declare array and set its values on the first bar only.
FILL_COLOR = color.green
var fillColors = array.new_color(0)
if barstate.isfirst
    // Initialize the array elements with progressively lighter shades of the fill color.
    array.push(fillColors, color.new(FILL_COLOR, 70))
    array.push(fillColors, color.new(FILL_COLOR, 75))
    array.push(fillColors, color.new(FILL_COLOR, 80))
    array.push(fillColors, color.new(FILL_COLOR, 85))
    array.push(fillColors, color.new(FILL_COLOR, 90))

`barstate.islast`

barstate.islast 表示true当前条形图是否是图表上的最后一个条形图,无论该条形图是否是实时条形图。

它可用于将代码的执行限制在图表的最后一条柱状图上,这在绘制线条、标签或表格时通常很有用。在这里,我们使用它来确定何时更新我们只想在最后一条柱状图上显示的标签。我们只创建一次标签,然后使用label.set_*()函数更新其属性,因为这样效率更高:

//@version=5
indicator("", "", true)
// Create label on the first bar only.
var label hiLabel = label.new(na, na, "")
// Update the label's position and text on the last bar,
// including on all realtime bar updates.
if barstate.islast
    label.set_xy(hiLabel, bar_index, high)
    label.set_text(hiLabel, str.tostring(high, format.mintick))

`barstate.ishistory`

barstate.ishistory 位于true所有历史柱上。它永远不会出现在barstate.isrealtimetrue为 的柱上 ,并且当barstate.isconfirmed 变为时,它不会出现在实时柱的收盘更新上 。在已关闭的市场中,它可以出现在barstate.islast 也为的同一柱上 truetruetruetruetrue

`barstate.isrealtime`

barstate.isrealtime 表示true当前数据更新是否为实时条形图更新,false 否则(因此是历史数据)。请注意, barstate.islasttrue适用于所有实时条形图。

`barstate.isnew`

barstate.isnew 存在true于所有历史条形图和实时条形图的第一次(开盘)更新中。

所有历史条形图都被视为条形图,因为 Pine Script™ 运行时会按顺序在每个条形图上执行您的脚本,从图表中的第一个条形图到最后一个条形图。因此, 您的脚本在逐条执行时会发现每个历史条形图。

当出现新的实时条形图时,barstate.isnew 可用于重置 varipupdateNo变量。以下代码将在所有历史条形图和每个实时条形图的开头重置为 1。它计算每个实时条形图期间的实时更新次数:

//@version=5
indicator("")
updateNo() => 
    varip int updateNo = na
    if barstate.isnew
        updateNo := 1
    else
        updateNo += 1
plot(updateNo())

`barstate.isconfirmed`

barstate.isconfirmed 存在true于所有历史条形图和实时条形图的最后(收盘)更新中。

通过要求在条件变为之前关闭实时条形图,可以避免重新绘制true。我们在这里使用它来保持 RSI 的绘制,直到实时条形图关闭并成为已过去的实时条形图。它将绘制在历史条形图上,因为 barstate.isconfirmed 始终true在它们上:

//@version=5
indicator("")
myRSI = ta.rsi(close, 20)
plot(barstate.isconfirmed ? myRSI : na)

在request.security()调用中使用时, barstate.isconfirmed 将不起作用

`barstate.islastconfirmedhistory`

barstate.islastconfirmedhistory 表示true脚本是否在市场关闭时在数据集的最后一条柱上执行,或者如果市场开放,则在实时柱之前立即执行。

它可用于检测第一个实时条 barstate.islastconfirmedhistory[1],或将服务器密集型计算推迟到最后一个历史条,否则在公开市场上无法检测到。

例子

以下是使用变量的脚本示例barstate.*

//@version=5
indicator("Bar States", overlay = true, max_labels_count = 500)

stateText() =>
    string txt = ""
    txt += barstate.isfirst     ? "isfirst\n"     : ""
    txt += barstate.islast      ? "islast\n"      : ""
    txt += barstate.ishistory   ? "ishistory\n"   : ""
    txt += barstate.isrealtime  ? "isrealtime\n"  : ""
    txt += barstate.isnew       ? "isnew\n"       : ""
    txt += barstate.isconfirmed ? "isconfirmed\n" : ""
    txt += barstate.islastconfirmedhistory ? "islastconfirmedhistory\n" : ""

labelColor = switch
    barstate.isfirst                => color.fuchsia
    barstate.islastconfirmedhistory => color.gray
    barstate.ishistory              => color.silver
    barstate.isconfirmed            => color.orange
    barstate.isnew                  => color.red
    => color.yellow

label.new(bar_index, na, stateText(), yloc = yloc.abovebar, color = labelColor)

注意:

  • 每个州的名称将会出现在标签的文本中 true
  • 标签背景有五种可能的颜色:
    • 第一道杠上的紫红色
    • 历史金条上的白银
    • 最后确认的历史条为灰色
    • 确认实时条时显示橙色(当其关闭并成为已过去的实时条时)
    • 实时栏首次执行时显示红色
    • 黄色表示实时栏的其他执行情况

我们首先将指标添加到开放市场的图表中,但要先收到任何实时更新。请注意,最后一个确认的历史条形图在 #1 中是如何标识的,以及最后一个条形图是如何标识为最后一个条形图的,但仍被视为历史条形图,因为没有收到实时更新。

图像

让我们看看当实时更新开始出现时会发生什么:

图像

注意:

  • 实时条是红色的,因为这是第一次执行,因为 barstate.isnewtrue并且barstate.ishistory不再是 true,所以我们的 switch 结构决定我们的颜色使用barstate.isnew => color.red 分支。这通常不会持续很长时间,因为下次更新 barstate.isnew将不再是,true所以标签的颜色将变为黄色。
  • 已过去的实时柱的标签为橙色,因为这些柱在关闭时不是历史柱。因此, 切换barstate.ishistory => color.silver结构中的分支 未执行,但下一个分支 已执行。barstate.isconfirmed => color.orange

最后一个例子显示了实时栏的标签在第一次执行后将如何变为黄色。标签通常出现在实时栏上的方式如下:

图像

Original text
Rate this translation
Your feedback will be used to help improve Google Translate