保持敬畏之心
交易是一场持久战

Pine Script(185):更新方框上下边框,set_top与set_bottom

#Pine Script入门教学

用box.set_top()更新方框的上边框

在我们绘制一个方框后,可以使用box.set_top()函数来更改该方框上边框的价格坐标。

该函数的标准语法格式如下:

box.set_top(id, top)

id参数是要更改的方框的标识符。这个ID是我们在使用box.new()创建方框时返回的值,它向Pine Script传达了要修改哪个方框。没有它,Pine Script就不知道要更改哪个方框。top是一个浮点值,代表方框上边框新的价格坐标。

快速示例

要更改一个方框的上边框,我们首先需要一个方框。我们可以调用box.new()来创建一个:

// 创建一个方框绘图
myBox = box.new(left=bar_index[20], top=0,
	 right=bar_index, bottom=-10,
	 bgcolor=#FFC1CC)

这个代码片段在0-10这两个价格坐标之间绘制了一个方框。我们把box.new()返回的标识符存入myBox变量中。

现在,我们可以使用这个变量来更新方框的上边框。例如:

// 将方框的上边框移动到一个新的价格坐标
box.set_top(id=myBox, top=10)

方框原始的顶部是0。现在box.set_top()把上边框向上移动到了10

这使得方框变得更高了。下图直观地展示了其工作原理。绿线标示了被修改的方框边框,而橙色箭头则显示了改变的方向。

顺便一提,box.set_top()并不要求使用关键字参数。示例中使用它们只是为了让代码更清晰。但你可以省略它们以节省击键次数,像这样更短的代码也完全有效:

// 将方框的上边框移动到一个新的价格坐标
box.set_top(myBox, 10)

box.set_top()的使用方式

box.set_top()函数用于更新方框的上边框。我们主要用它来完成两个任务:一是使方框更高,为此我们把新的上边框移动到比其原始位置更高的值;二是使方框更矮,当我们把上边框重新定位到比其原始位置更低的值时,就可以实现这一点。

在实践中,我们通常把box.set_top()与测试真/假条件的if语句一起调用,这样就只在特定情况下才更改方框的上边框。

如果我们想在任何情况下都更改上边框,那么通常可以在用box.new()创建方框时直接定义那个上边框。那样可以减少输入量,并使我们的代码更紧凑。

示例脚本

下面的指标展示了我们如何在一个完整的脚本中使用box.set_top()函数。该代码会在每周开始时创建一个新方框。

当周内价格达到一个新的周高点时,我们便更新方框的上边框。这样,方框就会随着价格的演变而成长。

该指标的完整代码如下:

//@version=5
indicator(title="更改方框的上边框", overlay=true)

// 为周高点和方框标识符创建持久化变量
var weekHigh = high
var box highBox = na

// 判断是否开始了新的一周
if weekofyear != weekofyear[1]
    // 在本周开盘K线的高点和低点处绘制一个方框
    highBox := box.new(left=bar_index, top=high,
         right=bar_index + 1, bottom=low,
         bgcolor=color.new(color.green, 85),
         border_color=color.navy)

    // 在每周开始时重置周高点
    weekHigh := high
else
    // 如果当前高点超过了本周到目前为止的高点,
    // 则更新方框的上边框
    if high > weekHigh
        box.set_top(id=highBox, top=high)

    // 在本周内的每根K线上,都将方框向右扩展一根K线
    box.set_right(id=highBox, right=bar_index)

    // 随着周内行情发展,持续跟踪最高价
    weekHigh := math.max(weekHigh[1], high)

首先,我们用indicator()函数来设置指标的选项,它为脚本命名并使其叠加显示在主图表上。

然后,我们创建两个持久化变量(使用var关键字),这些变量的值可以在连续的K线之间保持不变。第一个(weekHigh)将用于跟踪周内最高价,另一个(highBox)则用于存放方框的标识符。

脚本的其他代码位于一个大的if/else语句中,其if部分如下:

// 判断是否开始了新的一周
if weekofyear != weekofyear[1]
    // 在本周开盘K线的高点和低点处绘制一个方框
    highBox := box.new(left=bar_index, top=high,
         right=bar_index + 1, bottom=low,
         bgcolor=color.new(color.green, 85),
         border_color=color.navy)

    // 在每周开始时重置周高点
    weekHigh := high

这里的if条件测试是否开始了一个新的日历周。当weekofyear变量的值与其前一根K线的值不同时(!=),这种情况就会发生。

当条件成立时,我们首先使用box.new()创建一个新方框。我们在当前K线(bar_index)和下一根K线(bar_index + 1)之间绘制它,其顶部和底部是当前K线的高点和低点。

方框的背景是绿色(color.green),通过color.new()函数设置了透明度。其边框是海军蓝(color.navy)。我们把方框的标识符存储在highBox变量中以供后续使用。

然后,我们把weekHigh变量更新为当前K线的高点(high)。由于这段代码在每周的第一根K线上执行,它实际上重置了上一周的最高价记录。(后续代码会随着本周的行情发展来更新这个最高价。)

脚本的其余代码位于else代码块中:

else
    // 如果当前高点超过了本周到目前为止的高点,
    // 则更新方框的上边框
    if high > weekHigh
        box.set_top(id=highBox, top=high)

    // 在本周内的每根K线上,都将方框向右扩展一根K线
    box.set_right(id=highBox, right=bar_index)

    // 随着周内行情发展,持续跟踪最高价
    weekHigh := math.max(weekHigh[1], high)

这段代码在任何不是本周第一根K线的K线上运行。在这些K线上,我们做几件事。

首先,我们判断当前K线的高点是否大于(>)本周的最高价记录(weekHigh)。如果是,说明当前K线创下了新的周内高点,所以我们必须更新方框的上边框。为此,我们调用box.set_top()函数,指定highBox标识符,并使用high变量来定义新的上边框位置。

我们做的另一件事是用box.set_right()函数来更新方框的右边框。这使得方框在周内随着新的价格K线而向右延伸(否则它将一直停留在周开盘的那根K线上)。因此,在每根K线上,我们都把其右边框设置为当前K线(bar_index)。

最后一项任务是随着新K线的出现更新周内最高价。为此,我们把weekHigh变量重新赋值为其前一根K线的值(weekHigh[1])或当前K线的高点(high)中的较大者。这样,变量要么保持其原值,要么更新为一个更高的最高价。我们使用math.max()函数来选择这两者中的较大值。

在图表上,我们可以看到脚本创建了锚定在每周第一根K线的方框。当价格移动到开盘K线高点之上时,脚本会相应地更新方框的上边框。方框下方的区域则清晰地显示了价格何时跌破了开盘K线的最低价。

box.set_top()的特性

  • 当我们关闭一个方框的边框时,box.set_top()函数仍然可以更新其上边框。在这种情况下,该函数只是更改了方框所覆盖的背景区域。
  • box.set_top()有可能把一个方框的上边框移动到其下边框之下。然而,这样做是导致混乱和编码错误的根源。更好的做法是把方框的上边框更新到方框当前下边框坐标之上的某个位置。

总结

  • box.set_top()函数更改方框上边框的位置。
  • 这个新位置基于一个价格轴坐标。
  • 一个比其当前上边框更高的价格值会使方框变高;一个更低的值则会使方框收缩。

用box.set_bottom()移动方框的下边框

在我们创建了一个方框绘图后,可以使用box.set_bottom()函数来更改该方框下边界的位置。

该函数的标准语法是:

box.set_bottom(id, bottom)

id是我们想要更改的方框的标识符。这个ID是我们在调用box.new()创建方框时获得的,Pine Script正是依靠它来精确定位目标方框。bottom是一个浮点数值,代表方框下边界在价格轴上的新坐标。

快速范例

要更新方框的下边界,首先我们需要一个方框。我们使用box.new()来创建一个:

// 创建一个方框绘图
myBox = box.new(left=bar_index[20], top=5,
	 right=bar_index, bottom=-5,
	 bgcolor=#FFC1CC)

这段代码创建了一个纵向范围从价格5-5的方框。其ID被存储在myBox变量中。现在,我们可以使用这个ID来更改方框的下边界:

// 将方框的下边界更新到一个新的价格坐标
box.set_bottom(id=myBox, bottom=-15)

方框的下边界原本在-5,现在被box.set_bottom()移动到了-15。这使得方框的高度增加了10个价格点。下图中的绿线高亮了被更新的边界,橙色箭头则指明了变化的方向。

顺便一提,box.set_bottom()的关键字参数(id=bottom=)是可选的。在熟悉函数用法后,可以省略它们以简化代码:

// 将方框的下边界更新到一个新的价格坐标
box.set_bottom(myBox, -15)

box.set_bottom()的主要用途

box.set_bottom()的核心功能是移动方框的下边界,这通常会带来两种效果:把下边界设置为一个更低的价格坐标,使方框在垂直方向上变高;或者把下边界设置为一个更高的价格坐标,使方框变矮。

我们通常会把box.set_bottom()置于if语句中,以便只在满足特定条件时才执行位置调整。如果只是想进行一次性的位置设置,在创建时直接通过box.new()定义会更简洁。

脚本范例

本指标的核心逻辑是:在每周开始时创建一个初始方框,然后随着本周新低的不断出现,动态地向下扩展该方框的下边界,从而直观地追踪并展示本周的价格范围。完整的代码如下:

//@version=5
indicator(title="更改方框的下边界", overlay=true)

// 为周低点和方框ID创建持久化变量
var weekLow = low
var box weekLowBox = na

// 判断是否是新的一周开始
if weekofyear != weekofyear[1]
    // 在周的第一根K线,绘制一个初始方框
    weekLowBox := box.new(left=bar_index, top=high,
         right=bar_index + 1, bottom=low,
         bgcolor=color.new(color.red, 85),
         border_color=color.orange)

    // 重置周低点追踪变量
    weekLow := low
else
    // 在周内,如果出现新低点
    if low < weekLow
        // 更新方框的下边界
        box.set_bottom(id=weekLowBox, bottom=low)

    // 在周内的每一根K线,都将方框的右边界向右延伸
    box.set_right(id=weekLowBox, right=bar_index)

    // 持续追踪本周的最低价
    weekLow := math.min(weekLow[1], low)

脚本首先定义了两个持久化变量(使用var关键字):weekLow用于追踪本周的最低价,weekLowBox用于保存方框的ID。核心逻辑是一个if/else语句,它通过weekofyear != weekofyear[1]来判断当前K线是否为新一周的开始。

在新的一周开始时(if块),我们用box.new()创建一个初始的小方框,并用当天的最低价初始化weekLow变量。

对于本周内的其他K线(else块),我们执行三个操作:如果当前K线的最低价(low)低于已记录的本周最低价(weekLow),则调用box.set_bottom()把方框的下边界向下扩展到这个新的低点;接着调用box.set_right()把方框的右边界向右延伸至当前K线,使方框覆盖整个已过去的本周时段;最后使用math.min()更新weekLow变量,以确保它始终记录着本周的最低价格。

最终,当我们在图表上运行此脚本时,会看到每周都有一个方框。其上边界固定在周一开盘时的高点,而下边界则会动态地跟随该周最低价的不断下移而扩展。

box.set_bottom()的重要特性与注意事项

  • 禁用边框:即使方框的边框被禁用(不可见),box.set_bottom()仍然能正常工作,它会调整方框的逻辑背景区域。
  • 边界交叉:Pine Script允许你把下边界设置到上边界的上方。虽然技术上可行,但这会导致方框翻转,逻辑上容易混淆,因此是不推荐的做法。最好确保下边界始终位于上边界之下。

总结

  • box.set_bottom()函数用于更新一个已存在方框的下边界位置。
  • 新的边界位置通过一个价格轴坐标来设定。
  • 把下边界设置为一个更低的价格值会使方框变高;设置为一个更高的价格值则会使其变矮。
赞(0)
未经允许不得转载:图道交易 » Pine Script(185):更新方框上下边框,set_top与set_bottom
分享到

评论 抢沙发

登录

找回密码

注册