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

Pine Script(184):移动方框位置,set_right与set_left

#Pine Script入门教学

概述:在图表上移动TradingView方框的Pine Script函数

在我们的Pine Script代码绘制一个方框后,有几个Pine Script函数可以把它移动到图表上的不同位置。由于我们无法手动拖放由代码创建的方框,因此需要使用这些函数来移动方框。

用于更新方框位置的函数如下:

函数 描述
box.set_right() 更改方框右边框的位置。
box.set_left() 把方框的左边框移动到不同的位置。
box.set_top() 修改方框上边框的位置。
box.set_bottom() 更改方框下边框的位置。
box.set_lefttop() 同时调整方框的左边框和上边框。
box.set_rightbottom() 同时修改方框的右边框和下边框。

前四个函数一次只更改一个边框,而box.set_lefttop()box.set_rightbottom()则可以一次性更新两个边框。我们来逐一深入了解每个函数。

移动右边框:box.set_right()

box.set_right()函数用于更新方框的右边框。如果我们把右边框向右移动,方框会变宽;如果向左移动,则会变窄。

在视觉上,box.set_right()可以从两个方向修改方框:

例如,该函数可以把右边框移动到未来10根K线的位置。代码如下:

// 将方框的右边框向未来移动十根K线
box.set_right(id=myBox, right=bar_index + 10)

移动左边框:box.set_left()

box.set_left()函数用于更改方框的左边框。如果我们把该边框进一步向左移动,方框会变宽;如果向右移动,则会变窄。

box.set_left()的视觉效果是在以下两个方向之一进行改变:

如果我们想把方框的左边框移动到20根K线之前的位置,可以这样调用box.set_left()

// 将方框的左边框向过去移动20根K线
box.set_left(id=myBox, left=bar_index[20])

移动上边框:box.set_top()

box.set_top()函数用于更新方框的上边框。当它把上边框设置到更高的价格坐标时,函数使方框变高;当它把上边框移动到更低的值时,则使方框变矮。

box.set_top()函数的视觉效果如下:

要把方框的上边框更改为当前K线的最高价,我们可以这样执行box.set_top()

// 将方框的上边框移动至当前K线的最高价
box.set_top(id=myBox, top=high)

移动下边框:box.set_bottom()

box.set_bottom()函数用于移动方框的下边框。当该边框被设置到更高的价格坐标时,函数使方框变矮;当它被设置到更低的坐标值时,则使方框变高。

box.set_bottom()的视觉效果如下:

要把方框的下边框更新为当前K线的最低价,我们可以这样执行box.set_bottom()

// 将方框的下边框更新至当前K线的最低价
box.set_bottom(id=myBox, bottom=low)

移动左边框与上边框:box.set_lefttop()

box.set_lefttop()函数可以同时更改方框的左边框和上边框。当我们向左移动左边框并把上边框设置到更高的坐标时,这会使方框变大。

该函数也可以使方框变小,这需要我们把左边框向右移动,并把上边框设置到更低的值。

box.set_lefttop()的视觉效果,就如同用鼠标拖动方框的左上角:

要把方框的左边框和上边框更改为20根K线前的数据,我们可以这样使用box.set_lefttop()

// 将方框的左上角坐标移动到一个新位置
box.set_lefttop(id=myBox, left=bar_index[20], top=high[20])

移动右边框与下边框:box.set_rightbottom()

box.set_rightbottom()函数可以同时改变方框的右边框和下边框。当我们向右移动右边框并把下边框设置到更低的价格时,函数使方框变大。

它也可以使方框变小,这发生在我们把右边框向左移动并为下边框设置一个更高的值时。

box.set_rightbottom()对一个方框的效果,就如同用鼠标拖动其右下角:

要把方框的右边框和下边框更新到当前K线,我们可以这样调用box.set_rightbottom()

// 将方框的右下角坐标移动至当前K线
box.set_rightbottom(id=myBox, right=bar_index, bottom=low)

用box.set_right()更改方框的右边框位置

在我们绘制一个方框后,可以使用box.set_right()函数来更改该方框右边框的位置。

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

box.set_right(id, right)

id参数是要更改的方框的标识符。这个标识符是我们在使用box.new()创建方框时返回的值,也是我们告知Pine Script要修改哪个方框的方式。没有它,Pine Script将无从知晓我们想要修改哪个方框。

right参数是方框右边框新的时间轴坐标。这个值可以基于K线编号或时间值。我们通过bar_index变量获取K线编号,而time变量则返回K线的时间值。(我们也可以自己计算时间坐标。)

具体使用哪种类型,取决于我们先前使用box.new()创建方框时的方式:如果方框是使用K线编号创建的,那么其新的右边框坐标也必须基于K线编号;而如果我们是使用时间值来定位方框的,那么其新的右边框位置也应该使用时间值。如果你不确定,那么方框很可能使用的是K线编号,因为这是box.new()的默认设置。

另外要注意,当一个方框使用K线编号时,其右边框不能被放置到未来超过500根K线的位置。(时间值没有这个限制,可以被放置到未来任意数量的K线处。)

快速示例

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

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

Pine Script在两个K线编号之间绘制这个方框:当前K线(bar_index)和20根K线前(bar_index[20])。我们把方框的标识符存储在myBox变量中。

然后,我们可以使用这个标识符通过box.set_right()来更新方框的右边框。例如:

// 将方框的右边框向未来移动十根K线
box.set_right(id=myBox, right=bar_index + 10)

方框原始的右边框位于当前K线(bar_index)。现在box.set_right()把它更改为未来10根K线的位置(bar_index + 10)。

结果是方框的宽度增加了10根K线。下图展示了其视觉效果。图中的绿线标示了被修改的边框,箭头则展示了方框改变的方向。

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

// 将方框的右边框向未来移动十根K线
box.set_right(myBox, bar_index + 10)

box.set_right()的使用方式

box.set_right()把方框的右边框更新到不同的位置。这个功能主要有两种用途:一是使方框变宽,为此我们把右边框移动到其原始位置更右侧的时间坐标;二是使方框变窄,当右边框的新坐标位于其初始位置的左侧时,就会发生这种情况。

在实践中,我们通常把box.set_right()与测试真/假条件的if语句结合使用。这样可以在特定情况下修改方框,而在其他时候保持其不变。

如果我们的方框右边框总是需要被设置到某个固定的坐标,那么在用box.new()创建方框时直接指定该位置会更方便,这样代码更少,也更清晰。

示例脚本

下面的指标给出了一个如何使用box.set_right()的示例。该代码绘制一条指数移动平均线(EMA)。当价格穿越该平均线时,我们创建一个新的方框。

之后,我们在每根新的K线上都扩展这个方框(使用box.set_right())。最终形成一个水平条带,显示了最后一次穿越发生的区域。

该指标的完整代码如下:

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

// 计算并绘制指数移动平均线
emaValue = ta.ema(close, 40)
plot(series=emaValue, color=color.teal, linewidth=2, title="EMA")

// 为方框标识符创建一个持久化变量
var box emaBox = na

// 当价格穿越移动平均线时,创建一个新方框
if ta.crossover(close, emaValue)
    emaBox := box.new(left=bar_index - 1, top=high,
         right=bar_index, bottom=low,
         bgcolor=color.new(color.orange, 80),
         border_width=0)

// 如果价格没有上穿EMA,则将
// 前一个方框的长度增加一根K线
else
    box.set_right(id=emaBox, right=bar_index)

我们以indicator()函数开始指标的编写,它指定了脚本的名称并使其叠加显示在主图表上。

然后,我们使用ta.ema()函数计算40周期的EMA,并把其值存储在emaValue变量中。接着plot()函数在图表上显示这个值。由于未设置绘图类型,Pine Script默认绘制一条常规的线图,颜色为蓝绿色(color.teal)。

接下来,我们为方框的标识符(emaBox)声明一个变量,并使用var关键字使其成为一个持久化变量。这使得该变量能够始终持有最近一次创建的方框的标识符,无论该方框是在多少根K线前创建的。

然后,代码判断我们是应该创建一个新方框还是更新现有的方框:

// 当价格穿越移动平均线时,创建一个新方框
if ta.crossover(close, emaValue)
    emaBox := box.new(left=bar_index - 1, top=high,
         right=bar_index, bottom=low,
         bgcolor=color.new(color.orange, 80),
         border_width=0)

// 如果价格没有上穿EMA,则将
// 前一个方框的长度增加一根K线
else
    box.set_right(id=emaBox, right=bar_index)

这个if/else语句的条件评估ta.crossover()函数的返回值。这里它测试的是收盘价是否向上穿越了指数移动平均线。

当穿越发生时,if代码块运行。在这里,我们使用box.new()创建一个新方框。这个方框的初始范围是从上一根K线(bar_index[1])到当前K线(bar_index)。

它的顶部和底部是K线的高点和低点。方框的背景是带透明度的橙色,并且其边框被关闭(border_width=0)。我们把其标识符存储在emaBox变量中以供后续使用。

当价格没有穿越移动平均线时,else代码块执行。在这种情况下,我们扩展之前创建的方框。

于是我们调用box.set_right(),并把emaBox方框的右边框设置为当前K线(bar_index)。因为我们在每个没有发生穿越的K线上都这样做,所以方框会一根K线一根K线地向右延伸。

在图表上,方框高亮了价格向上穿越移动平均线时的区域,形成了一个价格带,价格需要有效脱离这个区域才能确认穿越信号的有效性。

box.set_right()的特性

我们更新一个方框的右边框时,应使用与其创建时相同的坐标类型(K线编号或时间值)。也就是说,如果一个方框使用K线编号创建,我们就用K线编号更新其右边框;如果它使用时间值,我们就用时间值更新。原因如下:

  • 如果一个使用K线编号的方框,其box.set_right()被赋予一个时间值,TradingView会生成错误:使用xloc.bar_index定位的对象不能被绘制到未来超过500根K线的位置。我们需要先用时间值(xloc=xloc.bar_time)来创建这个方框。
  • 如果一个使用时间值的方框,其box.set_right()被赋予一个K线编号,虽然不会报错,但Pine Script在图表上的绘制会不正确。要让它正常工作,我们需要在创建方框时就把其xloc参数设置为xloc.bar_index

当我们禁用了一个方框的边框时,box.set_right()仍然可以更新其右边框。在这种情况下,方框高亮的区域会根据不可见的右边框移动到的位置而扩大或缩小。

Pine Script不强制要求我们把方框的右边框移动到左边框的右侧。如果我们愿意,可以把右边框移动到左边框之前的位置。这会把右边框放置到方框左边框的左侧,导致图表上看起来像是左边框的实际上是方框的右边框。(如此描述已经显示出这样做的复杂性,不建议以这种方式使用box.set_right()。)

总结

  • box.set_right()函数更改方框右边框的位置。
  • 对于新的边框位置,我们使用K线编号或时间值。
  • 我们必须使用哪种坐标类型,取决于我们用box.new()创建方框时所使用的时间坐标类型。

用box.set_left()移动方框的左边框

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

该函数的标准语法是:

box.set_left(id, left)

id是我们想要更改的方框的标识符。这个ID是我们在调用box.new()创建方框时获得的,Pine Script正是依靠它来精确定位目标方框。left是方框左边界的新时间轴坐标,这个坐标值可以基于K线编号(bar_index)或时间值(time)。

使用box.set_left()时,必须遵守一个重要规则:新坐标的类型必须与创建方框时使用的坐标类型保持一致。如果方框创建时使用的是K线编号,那么新的左边界坐标也必须是K线编号;如果方框创建时使用的是时间值,那么新的左边界也必须是时间值。如果不确定,你的方框很可能使用的是K线编号,因为这是box.new()的默认设置。

此外,使用K线编号定位的方框,其任何边界都不能被放置在未来超过500根K线的位置。而时间值则没有这个限制。

快速范例

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

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

这段代码创建了一个从10根K线前延伸至当前K线的方框。box.new()返回的ID被存储在myBox变量中。现在,我们可以使用这个ID来更改方框的左边界:

// 将方框的左边界向过去再移动10根K线
box.set_left(id=myBox, left=bar_index[20])

方框的左边界原本在bar_index[10],现在被box.set_left()移动到了bar_index[20],即向左扩展了10根K线的宽度。下图中的绿色边框高亮了移动的部分,橙色箭头指明了变化方向。

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

// 将方框的左边界向过去再移动十根K线
box.set_left(myBox, bar_index[20])

box.set_left()的主要用途

box.set_left()的核心功能是改变方框左边界的位置,这通常会带来两种效果:把左边界移动到更早的时间点,使方框变宽;或者把左边界移动到更晚的时间点,使方框变窄。

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

脚本范例

本指标的核心逻辑是:当价格在均线附近盘整时,通过连接信号方框,直观地展示横盘区域的持续时间。当价格下穿简单移动平均线(SMA)时,我们会创建一个新的方框。如果这次下穿距离上一次很近,我们就会使用box.set_left()把新方框的左边界与上一个方框的右边界对齐,形成无缝连接的效果。该指标的代码如下:

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

// 计算并绘制SMA
smaValue = ta.sma(close, 35)
plot(series=smaValue, color=color.fuchsia, linewidth=2, title="SMA")

// 使用持久化变量追踪方框ID
var box smaBox = na

// 当价格下穿SMA时,创建一个新方框
if ta.crossunder(close, smaValue)
    smaBox := box.new(left=bar_index, top=high,
         right=bar_index + 10, bottom=low,
         bgcolor=color.new(color.teal, 70),
         border_color=color.orange, border_width=2)

    // 如果上一个SMA交叉发生在近期,则连接两个方框
    prevBoxRightBorder = box.get_right(id=smaBox[1])
    if bar_index < prevBoxRightBorder
        box.set_left(id=smaBox, left=prevBoxRightBorder)

脚本首先计算并绘制了35周期的SMA。然后,我们声明了一个持久化变量smaBox来追踪最新创建的方框ID。核心逻辑在if语句中:

第一步是创建方框:当ta.crossunder()检测到价格下穿SMA时,box.new()会创建一个新的、从当前K线延伸至未来10根K线的方框。

第二步是连接方框:紧接着,我们获取上一个方框的右边界坐标(通过box.get_right(smaBox[1]))。一个嵌套的if语句判断当前K线是否仍处于上一个方框的范围内。如果是,就调用box.set_left(),把新方框的左边界粘合到上一个方框的右边界上。当市场横向移动时,这个逻辑会创建一串紧密相连的方框,直到市场最终选择突破方向:

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

  • 坐标类型一致性:这是使用此函数时最重要的规则。如果方框是用K线编号创建的,box.set_left()也必须使用K线编号,反之亦然。类型不匹配会导致错误或绘图异常。
  • 禁用边框:即使方框的边框被禁用(不可见),box.set_left()仍然能正常工作,它会调整方框的逻辑区域(即背景高亮区域)。
  • 边界交叉:Pine Script允许你把左边界设置到右边界的右侧。这会导致方框在图表上翻转,但这种用法逻辑复杂且容易混淆,不推荐使用。

总结

  • box.set_left()函数用于更新一个已存在方框的左边界位置。
  • 新的边界位置必须通过K线编号或时间值来指定。
  • 坐标值的类型必须与创建方框时box.new()所使用的类型保持一致。
赞(0)
未经允许不得转载:图道交易 » Pine Script(184):移动方框位置,set_right与set_left
分享到

评论 抢沙发

登录

找回密码

注册