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

Pine Script(187):获取方框位置,get_right与get_left

#Pine Script入门教学

获取方框边框位置的Pine Script函数

在我们的脚本绘制一个方框后,有几个Pine Script函数可以获取该方框某个边框的位置。

其他代码可以利用这些坐标来实现多种功能,例如,从其原始位置扩展方框、在现有方框旁放置一个新方框,或者在方框的边框处绘制标签。

可以返回方框边框位置的函数有四个:box.get_right()返回方框右边框的时间轴值;box.get_left()返回方框左边框的时间轴值;box.get_top()返回方框上边框的价格轴值;box.get_bottom()返回方框下边框的价格轴值。

需要注意的是,这些函数返回的是我们先前赋予方框的坐标值。这些值可能与方框在图表上的实际视觉外观有所不同。

让我们来逐一深入了解每个函数。

获取右边框box.get_right()

box.get_right()函数返回一个方框右边框的位置。返回的值可以是K线编号,也可以是时间值。

如果我们创建方框时,其左右边框使用的是K线编号,那么box.get_right()也会返回一个K线编号。而当我们使用时间值来定位方框时,该函数则返回一个时间值。

对于从旧K线向新K线绘制的方框(即标准方向),box.get_right()函数返回的是方框在图表上视觉右边框的值:

要获取该右边框的坐标,我们需要向函数提供一个方框标识符。如果我们之前已把该值存储在myBox变量中,那么可以这样获取右边框:

// 获取方框右边框的时间坐标
rightBorder = box.get_right(id=myBox)

获取左边框box.get_left()

box.get_left()函数返回一个方框左边框的值。该返回的值是K线编号或时间值。

当我们创建方框时,如果其左右边框使用的是K线编号,那么box.get_left()也会返回一个K线编号。而如果我们使用时间值在图表上放置方框,该函数则返回一个时间值。

对于我们从旧K线向新K线创建的方框(标准方向),box.get_left()函数返回的是方框在图表上视觉左边框的值:

要获取该左边框的坐标,我们需要向函数提供一个方框标识符。如果我们之前已把该值存入myBox变量,可以这样获取左边框:

// 获取方框左边框的时间坐标
leftBorder = box.get_left(id=myBox)

获取上边框box.get_top()

box.get_top()函数返回一个方框上边框的价格轴值。

当我们以常规方式(从上到下)绘制一个方框时,box.get_top()函数返回的是方框视觉上边框的价格值:

要获取该边框值,box.get_top()需要方框的标识符。如果我们之前已把该值赋给myBox变量,可以这样获取上边框:

// 获取方框上边框的坐标
topBorder = box.get_top(id=myBox)

获取下边框box.get_bottom()

box.get_bottom()函数返回一个方框下边框的价格轴值。

对于我们以典型方式(从上到下)绘制的方框,box.get_bottom()返回的是方框底部的价格坐标:

要得到这个值,box.get_bottom()必须知道方框的标识符。如果我们之前已把该值存储在myBox变量中,可以这样检索该边框值:

// 获取方框下边框坐标的价格值
bottomBorder = box.get_bottom(id=myBox)

方框边框值的应用方式

通过上述四个函数,我们可以得到方框的图表坐标。这些信息有多种应用方式,例如:

  • 使用plot()函数绘制方框的价格坐标。
  • 使用line.new()函数,在方框的坐标点或其附近绘制一条趋势线。
  • 使用label.new()函数在方框的坐标处放置一个文本标签。
  • 在使用label.new()创建的文本标签中显示方框的坐标信息。
  • 在由alert()函数生成的警报消息中显示方框的坐标。
  • 使用一个方框的坐标作为创建新方框绘图的输入。
  • 使用plotshape()函数在方框的坐标处或其周围绘制形状。
  • 使用plotchar()函数在方框的坐标处或其附近显示文本字符。
  • 使用边框值来设置方框的视觉外观。例如,当价格上穿方框的最高点时,我们可以更改方框的背景颜色。
  • 使用方框的边框作为交易入场信号。例如,当价格移动到方框内部时买入。
  • 使用方框的边框作为平仓信号。例如,我们可以在价格进入或离开某个特定方框时平仓。

除了获取一个方框的位置,Pine Script还有几个用于更新方框边框的函数,以及多个用于修改方框外观的选项。

用box.get_right()获取方框的右边界值

在我们用代码创建了一个方框绘图后,可以使用Pine Script的box.get_right()函数来获取该方框右边界在时间轴上的值。

该函数的标准语法是:

box.get_right(id)

id是我们想要查询的方框的标识符。这个ID是我们在调用box.new()创建方框时获得的,Pine Script正是依靠它来精确定位目标方框。

该函数返回一个整数,其含义取决于方框的创建方式:如果方框是用K线编号创建的,则返回其右边界的K线编号;如果方框是用时间值创建的,则返回其右边界的时间戳。

快速范例

要获取方框的右边界位置,首先我们需要一个方框。我们使用box.new()来创建一个:

// 创建一个新的方框绘图
myBox = box.new(left=bar_index[50], top=100,
	 right=bar_index, bottom=0,
	 bgcolor=color.new(color.orange, 60),
	 border_width=2, border_color=color.fuchsia)

这段代码创建了一个从50根K线前延伸至当前K线的方框,并把其ID存储在myBox变量中。现在,我们可以使用这个ID来获取该方框的右边界坐标:

// 获取方框右边界的时间坐标
rightBorder = box.get_right(id=myBox)    // 例如返回 21545

下图中的箭头直观地展示了box.get_right()函数返回的是哪个时间轴坐标值:

顺便一提,此函数的关键字参数是可选的,可以省略以简化代码:

// 获取方框右边界的时间坐标
rightBorder = box.get_right(myBox)

返回设定坐标与视觉坐标的区别

需要特别注意的是,box.get_right()函数返回的是你在创建或设置方框时为right参数赋予的数据值,而不是你在图表上肉眼看到的、最右侧的边界。通常情况下,我们绘制的方框左边界在时间上早于右边界。但Pine Script允许反向操作,即right的坐标值小于left的坐标值。在这种非典型情况下,box.get_right()返回的将是在图表上看起来像是左边界的值。

如果我们总是希望获取图表上最右侧那个边界的坐标,无论方框是如何绘制的,可以使用下面这个自定义函数:

// GetRightBorderBox() 返回在图表上视觉呈现为右边界的时间轴坐标。
// (无论方框是从左到右还是从右到左绘制,都有效。)
GetRightBorderBox(boxId) =>
	math.max(box.get_left(boxId), box.get_right(boxId))

这个函数同时获取方框的左右边界数据值,然后使用math.max()返回两者中较大的一个,从而确保得到的总是视觉上的最右侧坐标。我们可以这样使用它:

// 获取方框的视觉右边界
chartRightBorder = GetRightBorderBox(myBox)

box.get_right()的使用方式

获取到方框的右边界值后,有多种应用场景:作为另一个新方框的左边界,实现方框的无缝连接;作为文本标签的位置,在方框结束处添加注释;用于判断方框是使用K线编号还是时间值定位;作为绘制形状或字符的位置,以高亮方框的结束点。

脚本范例

本指标旨在根据近期的价格范围,在图表上绘制一个向未来延伸的预测区域,并使用box.get_right()来精确地标记出这个预测区域的结束时间点。该指标的完整代码如下:

//@version=5
indicator(title="获取右边界范例", overlay=true)

// 通过偏移tick来获取交易范围的最高高点和最低低点
highestHigh = ta.highest(high, 20) + (10 * syminfo.mintick)
lowestLow   = ta.lowest(low, 20) - (10 * syminfo.mintick)

// 在图表的最后一个历史K线上创建方框和标签
if barstate.islastconfirmedhistory
    // 创建一个新方框,其右边界是一个未来坐标,等于当前时间
    // 加上10倍的单根K线时间跨度。
    myBox = box.new(left=time[4], top=highestHigh,
         right=time + ((time - time[1]) * 10), bottom=lowestLow,
         xloc=xloc.bar_time, bgcolor=color.new(color.blue, 85),
         border_color=color.orange, border_width=2)

    // 在方框的右边界位置创建一个标签
    label.new(x=box.get_right(id=myBox), y=highestHigh, 
         xloc=xloc.bar_time, color=#AAF0D1, textcolor=color.black, 
         size=size.large, text="方框结束时间:\n" + 
             str.format("{0,date,HH:mm:ss\nd MMMM yyyy}", 
             box.get_right(id=myBox)))

脚本首先计算出过去20根K线的最高高点和最低低点,并略微向外偏移,形成一个价格通道。核心逻辑在if barstate.islastconfirmedhistory块中,这确保了绘图代码只在最后一个历史K线上执行一次,以提高效率。

第一步是创建方框:box.new()创建一个方框。其左边界在4根K线前,而右边界则通过time + ((time - time[1]) * 10)计算得出,即向未来延伸了10根K线的时间跨度。我们通过xloc=xloc.bar_time明确指定使用时间值进行定位。

第二步是创建标签:label.new()在方框的右边界处创建一个标签。我们调用box.get_right(myBox)来获取这个位置的精确时间坐标,并把它同时用于标签的x坐标和text内容的格式化,从而在标签上清晰地显示出方框的结束时间。

最终,图表上会显示一个从历史延伸至未来的预测方框,并在其右侧有一个标签,精确地标明了结束时间:

box.get_right()的重要特性

  • 返回值类型:函数的返回值是K线编号还是时间戳,取决于方框最初的创建方式。
  • 禁用边框:即使方框的边框被禁用(不可见),box.get_right()仍然能正常返回其右边界的逻辑坐标值。
  • 边框宽度:box.get_right()的返回值与边框的宽度无关。

总结

  • box.get_right()函数返回指定方框的右边界坐标值。
  • 这个值是你在创建或设置方框时所设定的值,它可能不总是图表上视觉最右侧的边界。
  • 返回值的类型(K线编号或时间戳)取决于方框的创建方式。

用box.get_left()获取方框的左边框

在我们制作一个方框后,可以使用box.get_left()函数来返回该方框左边框的时间轴值。

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

box.get_left(id)

id参数是我们想要获取其左边框值的方框的标识符。box.new()在绘制方框后会返回一个ID,这个标识符是我们告知Pine Script具体要操作哪个方框的方式。没有它,Pine Script将无从知晓我们指的是哪个方框。

box.get_left()返回一个整数,它要么是带有方框左边框位置的K线编号,要么是带有方框左边框位置的时间值。具体返回哪种类型,取决于我们创建该方框的方式。如果我们是使用K线编号来创建方框的边框,那么box.get_left()也会返回一个K线编号。而如果我们使用的是时间值,该函数则返回一个时间值。

快速示例

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

// 创建一个新的方框绘图
myBox = box.new(left=bar_index[50], top=100,
	 right=bar_index, bottom=0,
	 bgcolor=color.new(color.orange, 60), 
	 border_width=2, border_color=color.fuchsia)

这段代码创建了一个范围在50根K线前(bar_index[50])到当前K线(bar_index)之间的方框。我们把box.new()返回的标识符存储在myBox变量中。

现在,box.get_left()函数就可以使用这个变量来获取该方框的左边框了:

// 获取方框左边框的时间坐标
leftBorder = box.get_left(id=myBox)    // 返回 21495

box.get_left()函数为我们获取的是方框的左边框,如下图中箭头高亮显示的那样:

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

// 获取方框左边框的时间坐标
leftBorder = box.get_left(myBox)   // 省略了 'id=' 部分

返回的是设置坐标,而非视觉坐标

上图显示box.get_left()返回方框的左边框值。但这不是很明显吗?

不尽然。box.get_left()函数返回的是我们先前赋予方框左边框的值。

通常,一个方框的左边框在时间上比右边框早。但这不是强制性的,Pine Script也完全接受一个比右边框出现得晚的左边框。

当我们以这种不常见的方式(从右向左)绘制方框时,box.get_left()返回的将是图表上看起来像是右边框的那个坐标值。

有时,我们希望获取的是图表上视觉意义上的左边框的值,无论该方框是标准的从左到右绘制,还是相反。下面这个自定义函数可以返回方框的视觉左边框:

// GetLeftBorderBox() 函数返回图表上显示为方框左边框的时间轴坐标。
// (对于从左到右绘制的方框和从右到左创建的方框都有效。)
GetLeftBorderBox(boxId) =>
    math.min(box.get_left(boxId), box.get_right(boxId))

该函数获取方框的左边框和右边框(使用box.get_right())的坐标。然后math.min()函数返回这两者中的较小值,这个值就代表了图表上视觉意义上的左边框。

当我们创建了一个方框并把其标识符存储在myBox变量中后,就可以用这种方式获取其视觉左边框:

// 获取方框的视觉左边框
chartLeftBorder = GetLeftBorderBox(myBox)

box.get_left()的应用方式

我们可以通过多种方式来使用方框的左边框值:作为另一个方框的坐标,这样可以在一个现有方框旁放置一个新方框;作为一个绘制字符或形状的位置,以此来高亮方框的左边框;当我们把方框的左边框设置到一个新位置时作为输入,这样可以相对于其旧位置来移动边框(例如,再向左移动10根K线);在与方框左边框相同的位置放置一个文本标签;以及判断方框是使用K线编号还是时间值。

示例脚本

让我们在一个完整的脚本中使用box.get_left()函数。下面的指标会围绕最近的高点和低点创建一个方框,并向未来扩展几根K线。我们可以把它想象成一个价格范围的预测。

通过box.get_left()函数,我们将检索方框的左边框,以便能在一个文本标签中显示它的起始时间。

该脚本的代码如下:

//@version=5
indicator(title="获取左边框示例", overlay=true)

// 用几个最小变动单位来偏移最高高点和最低低点,以得到交易范围
highestHigh = ta.highest(high, 30) + (15 * syminfo.mintick)
lowestLow   = ta.lowest(low, 30) - (15 * syminfo.mintick)

// 在图表的最后一根历史K线上创建方框和标签
if barstate.islastconfirmedhistory
    // 创建一个新方框。其左边框在7根K线前,
	// 右边框在未来15根K线处。
    myBox = box.new(left=bar_index[7], top=highestHigh,
         right=bar_index + 15, bottom=lowestLow,
         bgcolor=color.new(color.fuchsia, 90),
         border_color=color.teal, border_width=3)

    // 用标签显示方框左边框的时间
    label.new(x=box.get_left(id=myBox), y=highestHigh, 
         color=#FBCEB1, textcolor=color.black, 
         size=size.large, text="Box start time:\n" + 
             str.format("{0,date,HH:mm:ss\nd MMMM yyyy}", 
                 time[bar_index - box.get_left(id=myBox)]))

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

然后,我们获取最近的高点和低点:

// 用几个最小变动单位来偏移最高高点和最低低点,以得到交易范围
highestHigh = ta.highest(high, 30) + (15 * syminfo.mintick)
lowestLow   = ta.lowest(low, 30) - (15 * syminfo.mintick)

对于最高高点,我们使用ta.highest()函数,它在high价格序列上计算过去30根K线的最高值。我们用在low价格序列上运行相同周期的ta.lowest()函数来获得最低低点。

我们把这两个值分别用15倍的交易品种最小变动价格(syminfo.mintick)进行偏移,这要求价格在明确突破近期范围之前需要超过这个缓冲区。

我们把这些近期的极值价格存储在highestHighlowestLow变量中。

之后,我们创建一个方框:

// 在图表的最后一根历史K线上创建方框和标签
if barstate.islastconfirmedhistory
    // 创建一个新方框。其左边框在7根K线前,
	// 右边框在未来15根K线处。
    myBox = box.new(left=bar_index[7], top=highestHigh,
         right=bar_index + 15, bottom=lowestLow,
         bgcolor=color.new(color.fuchsia, 90),
         border_color=color.teal, border_width=3)

这个if语句判断脚本当前是否正在处理图表的最后一根已确认的历史K线(barstate.islastconfirmedhistory)。如果是,我们便执行box.new()函数。

它会在7根K线前(bar_index[7])和未来15根K线处(bar_index + 15)之间绘制一个方框。其上下边框分别是30周期的高点(highestHigh)和低点(lowestLow)。

我们给方框一个紫红色(color.fuchsia)的背景,通过color.new()函数使其90%透明。方框的边框颜色是蓝绿色(color.teal),宽度为3像素。

为了方便后续访问,我们把box.new()返回的标识符存入myBox变量。

然后,在同一个if语句中,我们创建一个文本标签:

// 用标签显示方框左边框的时间
label.new(x=box.get_left(id=myBox), y=highestHigh, 
     color=#FBCEB1, textcolor=color.black, 
     size=size.large, text="Box start time:\n" + 
         str.format("{0,date,HH:mm:ss\nd MMMM yyyy}", 
             time[bar_index - box.get_left(id=myBox)]))

为了创建这个标签,我们使用label.new()函数。我们把它放置在与方框左边框相同的K线上。为了得到这个位置,我们调用box.get_left()函数并使用myBox变量来识别我们刚刚创建的方框。对于标签的价格值,我们使用之前计算的最高高点(highestHigh)。

标签的背景使用#FBCEB1十六进制颜色,这是一种橙色调。其文字为黑色(color.black),并以大号字体(size.large)显示。

对于标签的文本,我们把一个字符串字面量与str.format()函数的结果相加(+)。str.format()函数的作用是使用一个预定义的格式把数值转换为文本。这里我们使用一个结合了时间(HH:mm:ss)和日期(d MMMM yyyy)的日期格式。

需要用该格式转换的数值是time变量的一个历史值。具体是多少根K线前,取决于方框左边框的位置。我们计算的值是当前K线索引(bar_index)减去那个左边框的K线编号。我们通过box.get_left()函数和myBox变量来获取后一个值。

当我们在图表上运行该脚本时,它会创建一个从最后一根K线延伸到未来的方框。出现在左边框位置的文本标签则精确地告诉我们方框的起始时间:

box.get_left()的特性

  • box.get_left()返回左边框的K线编号或时间值。具体是哪种,取决于我们创建方框的方式。
  • 当我们禁用一个方框的边框时,box.get_left()仍然会返回方框的左边框位置,其行为就好像边框仍然存在一样。
  • box.get_left()返回的值不取决于边框的宽度。无论我们制作的是细边框还是粗边框,该函数都返回相同的值。

总结

  • box.get_left()函数返回给定方框的左边框值。
  • 这个位置是我们先前为左边框设置的值。多数情况下,它也就是图表上显示为左边框的位置。
  • 左边框可以是一个K线编号或时间值。box.get_left()返回哪种坐标类型取决于我们创建该方框的方式。
赞(0)
未经允许不得转载:图道交易 » Pine Script(187):获取方框位置,get_right与get_left
分享到

评论 抢沙发

登录

找回密码

注册