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

Pine Script(186):同步移动方框角点,set_lefttop与set_rightbottom

#Pine Script入门教学

用box.set_lefttop()更新方框的左边框和上边框

在我们制作一个方框后,可以使用box.set_lefttop()函数来同时更新该方框的上边框和左边框到一个新位置。

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

box.set_lefttop(id, left, top)

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

left参数是方框左边框新的时间轴坐标。这个值可以是K线编号或时间值。我们通过bar_index变量获取K线编号,而time变量则返回K线的时间戳。具体使用哪种类型,取决于我们先前使用box.new()创建方框时的方式:对于使用K线编号创建的方框,其新的左边框也必须是一个K线编号;对于使用时间值创建的方框,其新的左边框也需要是一个时间值。(如果你不确定,你的方框很可能使用的是K线编号,因为这是默认设置。)

top是一个浮点值,用于指定方框上边框新的价格值。

快速示例

要更新一个方框的左上角,我们首先需要一个方框。我们可以使用box.new()来创建一个:

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

这段代码创建了一个左边框位于10根K线前(bar_index[10])的方框,其上边框坐标为0。为了方便后续访问,我们把其标识符存储在myBox变量中。

然后,我们就可以使用这个变量和box.set_lefttop()函数了:

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

这个代码片段把方框的左边框移动到20根K线前(bar_index[20]),并把其上边框移动到10

这两个改变使得方框向左和向上扩展。下图直观地展示了其效果。图中的绿线高亮了被box.set_lefttop()修改的边框,而橙色箭头则显示了改变的方向。

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

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

box.set_lefttop()的使用方式

box.set_lefttop()函数可以同时更新方框的左边框和上边框。这个函数主要有两种用途:一是使方框变大,为此我们把方框的左上角向其中心点的外侧移动;二是使方框变小,当我们把方框的左上角向其中心点移动时,就可以实现这一点。

通过box.set_lefttop(),我们也可以只更改方框的左边框(并保持上边框不变),或者只更改上边框(并保持左边框不变)。但这样做违背了box.set_lefttop()的设计初衷,也会使我们的代码更复杂。对于这些单一方向的修改,最好还是分别使用box.set_left()box.set_top()函数。

在实践中,我们通常把box.set_lefttop()函数放在一个if语句内部。这样可以在某些特定情况下更改方框的左上角,而在其他场景中则保持不变。

如果我们想在任何情况下都更改方框的左上角(即无条件地),那么我们不妨在用box.new()创建方框时就直接设置好这些坐标。那样可以减少工作量,并使我们的代码更紧凑。

示例脚本

让我们通过一个完整的脚本来看看box.set_lefttop()如何工作。下面的指标会在每天开始时,绘制一个从开盘K线延伸至未来24根K线的方框。对于小时级别的加密货币图表,这刚好覆盖了一天的交易时间。

在当天,每当出现新的日内高点时,我们都会更新方框的上边框和左边框。最终得到的是能够高亮显示当日高点范围的方框。

该指标的完整代码如下:

//@version=5
indicator(title="更新方框的左上角", overlay=true)

// 为日内高点和方框标识符创建持久化变量
var dayHigh = high
var box dayRangeBox = na

// 检查是否开始了新的一天
if dayofmonth != dayofmonth[1]
    // 基于开盘K线的范围创建一个方框,
    // 并将其扩展至当天结束(在小时图上)
    dayRangeBox := box.new(left=bar_index, top=high,
         right=bar_index + 24, bottom=low,
         border_width=0, bgcolor=color.new(color.fuchsia, 60))

    // 日内高点从开盘K线的高点开始记录
    dayHigh := high
else
    // 当出现新的高点时,更新方框
    if high > dayHigh
        box.set_lefttop(id=dayRangeBox, left=bar_index, top=high)
        box.set_bgcolor(id=dayRangeBox, color=color.new(color.green, 70))

    // 在每根K线上更新当天的高点
    dayHigh := math.max(dayHigh[1], high)

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

然后,我们创建两个持久化变量(使用var关键字),这些变量的值可以在连续的K线之间保持不变。

// 为日内高点和方框标识符创建持久化变量
var dayHigh = high
var box dayRangeBox = na

第一个变量dayHigh将用于跟踪日内最高价,另一个dayRangeBox则用于存储方框的标识符。

接下来是一个if/else语句,其if部分如下:

// 检查是否开始了新的一天
if dayofmonth != dayofmonth[1]
    // 基于开盘K线的范围创建一个方框,
    // 并将其扩展至当天结束(在小时图上)
    dayRangeBox := box.new(left=bar_index, top=high,
         right=bar_index + 24, bottom=low,
         border_width=0, bgcolor=color.new(color.fuchsia, 60))

    // 日内高点从开盘K线的高点开始记录
    dayHigh := high

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

当条件成立时,我们首先使用box.new()创建一个新方框。我们在当前K线编号(bar_index)和24根K线后的位置(bar_index + 24)之间绘制这个方框。其顶部和底部坐标是开盘K线的高点和低点。

方框的背景是紫红色(color.fuchsia),通过color.new()函数设置了60%的透明度。通过把border_width设置为零,我们禁用了方框的边框。为了方便后续访问,我们把其标识符存储在dayRangeBox变量中。

然后,我们把dayHigh变量设置为当前K线的高点(high)。由于此操作在每天开始时执行,它会重置该变量,以便我们能从此刻开始正确地跟踪当天的最高价。

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

else
    // 当出现新的高点时,更新方框
    if high > dayHigh
        box.set_lefttop(id=dayRangeBox, left=bar_index, top=high)
        box.set_bgcolor(id=dayRangeBox, color=color.new(color.green, 70))

    // 在每根K线上更新当天的高点
    dayHigh := math.max(dayHigh[1], high)

这段else代码对当天第一根K线之后的所有K线运行。我们在这里做两件事。

首先,一个嵌套的if语句判断当前K线的高点(high)是否高于(>)当天到目前为止的最高价(dayHigh)。如果是,说明创下了新的日内高点,于是我们更新方框。

box.set_lefttop()函数把方框的上边框更改为该高点,并把左边框更新到当前K线。为了产生视觉效果,box.set_bgcolor()函数把方框的背景更改为带透明度的绿色。

我们做的最后一件事是更新dayHigh变量。我们把该变量重新赋值为其前一根K线的值(dayHigh[1])或当前K线的高点(high)中的较大者。math.max()函数会选出这两者中的最高值。这样,变量要么保持不变,要么在出现新的日内高点时更新。

在图表上,我们看到该脚本在日内高点和当天的最后一根K线之间绘制了绿色的方框。如果自开盘K线以来没有更高的价格出现,方框将保持紫红色,并作为水平范围延伸至全天结束。

box.set_lefttop()的特性

  • 当一个方框使用K线编号时,box.set_lefttop()函数不能把方框的左边框放置到未来超过500根K线的位置。时间值没有这个限制,可以被赋予任何计算出的未来日期和时间。
  • 一个使用K线编号的方框只能把其左边框更新到一个K线编号。如果方框使用时间值,box.set_lefttop()也只能把左边框更改为一个时间值。
  • 当我们关闭一个方框的边框时,我们仍然可以使用box.set_lefttop()更改方框的左上角。这样做虽然不会使边框出现,但确实会移动方框着色的背景区域。
  • box.set_lefttop()可以把一个方框的上边框移动到其下边框之下,也可以把左边框更改为比右边框更晚的时间。然而,这样做不是一个好主意,因为它会使我们的代码更难理解和维护。

总结

  • box.set_lefttop()函数同时更改方框的左边框和上边框。
  • 方框新的左边框坐标可以是K线编号或时间值。
  • box.new()使用K线编号创建方框时,我们应使用K线编号来更新;当它使用时间值创建时,我们也应使用时间值来更新。

用box.set_rightbottom()更改方框的右边框和下边框

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

该函数的标准语法是:

box.set_rightbottom(id, right, bottom)

id是我们想要更改的方框的标识符,这个ID是我们在调用box.new()创建方框时获得的。right是方框右边界的新时间轴坐标,可以是K线编号(bar_index)或时间值(time)。bottom是一个浮点数值,代表方框下边界在价格轴上的新坐标。

使用此函数时,必须遵守一个重要规则:right参数的坐标类型必须与创建方框时使用的坐标类型保持一致。如果方框是用K线编号创建的,那么right也必须是K线编号;如果方框是用时间值创建的,那么right也必须是时间值。如果不确定,你的方框很可能使用的是K线编号,因为这是默认设置。

快速范例

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

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

这段代码创建了一个右边界在当前K线、下边界在价格-10的方框。其ID被存储在myBox变量中。现在,我们可以使用这个ID来同时更改方框的右边界和下边界:

// 将方框的右下角移动到一个新位置
box.set_rightbottom(id=myBox, right=bar_index + 10, bottom=-20)

这会把右边界向未来移动10根K线,并把下边界移动到价格-20。这使得方框在水平和垂直方向上都变大了。下图中的绿线高亮了被更新的边界,橙色箭头则指明了变化的方向。

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

// 将方框的右下角移动到一个新位置
box.set_rightbottom(myBox, bar_index + 10, -20)

box.set_rightbottom()的主要用途

box.set_rightbottom()的核心功能是重新定位方框的右下角,这通常会带来两种效果:把右下角移离方框中心(即向右和向下移动),放大方框;或者把右下角移入方框内部(即向左和向上移动),缩小方框。

虽然技术上可以用此函数只改变一个边界(另一个边界传入原值),但这不是它的设计初衷。如果只想修改单一边界,使用box.set_right()box.set_bottom()会是更清晰、更高效的做法。在实际应用中,我们通常把box.set_rightbottom()置于if语句中,以便只在满足特定条件时才执行位置调整。

脚本范例

本指标的核心逻辑是:在每日开始时创建一个初始方框,然后随着当日新低的不断出现,动态地扩展该方框的右下角,从而直观地框选出从开盘到当日最低价的整个价格区域。该指标的完整代码如下:

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

// 为日内低点和方框ID创建持久化变量
var dayLow = low
var box dayRangeBox = na

// 判断是否是新的一天开始
if dayofmonth != dayofmonth[1]
    // 基于开盘K线的范围创建一个方框
    dayRangeBox := box.new(left=bar_index, top=high,
         right=bar_index + 1, bottom=low,
         border_width=0, bgcolor=color.purple)

    // 重置日内低点追踪变量
    dayLow := low
else
    // 在日内,如果出现新低点
    if low < dayLow
        // 更新方框的右下角
        box.set_rightbottom(id=dayRangeBox, right=bar_index, bottom=low)
        box.set_bgcolor(id=dayRangeBox, color=color.new(color.red, 70))

    // 持续追踪日内的最低价
    dayLow := math.min(dayLow[1], low)

脚本首先定义了两个持久化变量:dayLow用于追踪当日最低价,dayRangeBox用于保存方框ID。核心逻辑是一个if/else语句,它通过dayofmonth != dayofmonth[1]来判断当前K线是否为新一天的开始。

在新的一天开始时(if块),我们用box.new()创建一个覆盖开盘K线范围的紫色初始方框,并用当日最低价初始化dayLow变量。

对于当日内的其他K线(else块),我们执行两个操作:如果当前K线的最低价(low)创下了日内新低,我们就调用box.set_rightbottom(),把方框的右边界延伸至当前K线,同时把下边界扩展到这个新的低点。为了醒目,我们还用box.set_bgcolor()把方框颜色变为半透明的红色。然后使用math.min()持续更新dayLow变量,以确保它始终记录着当日的最低价格。

最终,图表上会显示出从每日开盘到当日最低价的矩形区域。如果某日价格未跌破开盘价,则只会留下一个紫色的初始小方框。

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

  • 限制与一致性:当方框使用K线编号时,其右边界不能被放置在未来超过500根K线的位置。同时,坐标类型必须保持一致,否则可能导致错误或绘图异常。
  • 禁用边框:即使方框的边框被禁用(不可见),box.set_rightbottom()仍然能正常工作,它会调整方框的逻辑背景区域。
  • 边界交叉:Pine Script允许你把右边界设置到左边界的左侧,或把下边界设置到上边界的上方。但这会导致方框翻转,逻辑上容易混淆,是不推荐的用法。

总结

  • box.set_rightbottom()函数用于同时更新一个已存在方框的右边界和下边界。
  • 新的右边界坐标可以是K线编号或时间值,但其类型必须与创建方框时所用的类型保持一致。
  • 新的下边界坐标则是一个价格值。
赞(0)
未经允许不得转载:图道交易 » Pine Script(186):同步移动方框角点,set_lefttop与set_rightbottom
分享到

评论 抢沙发

登录

找回密码

注册