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

Pine Script(192):延伸方框,set_extend与延伸选项

#Pine Script入门教学

用box.set_extend()延伸方框绘图

在我们的脚本绘制一个方框后,可以使用Pine Script的box.set_extend()函数来延伸该方框。一个被延伸的方框会向左和/或向右无限延续。

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

box.set_extend(id, extend)

id参数是我们想要修改的方框绘图的标识符。这个ID是我们在使用box.new()创建方框时返回的,它告知Pine Script要自定义哪个方框。没有它,Pine Script将无从知晓我们指的是哪个方框。extend参数用于设置方框的新延伸样式,可用的延伸样式有四种:extend.left(向左延伸方框)、extend.right(向右延伸方框)、extend.both(向左和向右同时延伸方框)以及extend.none(移除方框的延伸效果)。

快速示例

要延伸一个方框绘图,我们首先需要一个方框。我们可以调用box.new()来创建一个:

// 在K线的高点和低点之间创建一个方框
myBox = box.new(left=bar_index[1], top=high,
	 right=bar_index, bottom=low,
	 bgcolor=color.new(color.green, 70))

为了方便后续访问,这里我们把box.new()返回的标识符存储在myBox变量中。然后我们就可以使用这个变量来更改方框的延伸状态。

假设我们希望方框无限地向左延续。要实现这一点,我们可以这样调用box.set_extend()函数:

// 将方框向历史K线方向无限延伸
box.set_extend(id=myBox, extend=extend.left)

这把myBox方框的延伸样式设置为向左(extend.left),使得该方框覆盖所有历史K线,一直回溯到图表的起点。

上述两个代码片段所创建的方框效果如下:

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

// 将方框向历史K线方向无限延伸
box.set_extend(myBox, extend.left)

box.set_extend()的使用方式

box.set_extend()函数主要有两种用途:一是把我们之前创建的一个方框向左、向右或两个方向延伸;二是禁用一个已存在方框的延伸效果,为此我们把其延伸样式设置为extend.none

在实践中,我们通常把box.set_extend()与测试真/假条件的if语句结合使用。这样,方框只在特定情况发生时才延伸,而在其他时候保持其延伸样式不变。

如果要在任何情况下都延伸一个方框(即无条件地),我们也可以在用box.new()创建方框时就直接设置好延伸。那样所需的代码比单独调用box.set_extend()更少。

示例脚本

让我们通过一个完整的脚本来看看box.set_extend()如何工作。下面的指标会在每天开始时创建一个新方框,高亮显示开盘K线的高点和低点。该方框最初会无限期地延续。

当新的一天开始时,box.set_extend()函数会移除前一个方框的延伸。这样,只有最新的方框被延伸,图表上也不会显得混乱。

该指标的代码如下:

//@version=5
indicator(title="方框延伸示例", overlay=true)

// 创建持久化变量来跟踪方框标识符
var box openBox = na

// 判断是否开始了一个新的交易日
if dayofmonth != dayofmonth[1]
    // 创建一个向右延伸的紫色方框绘图
    openBox := box.new(left=bar_index, top=high,
         right=bar_index + 1, bottom=low,
         bgcolor=color.new(color.purple, 70),
         border_width=0, extend=extend.right)

    // 为防止混乱,禁用上一个方框绘图的延伸
    box.set_extend(id=openBox[1], extend=extend.none)

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

然后,我们声明了openBox变量。这个变量将用于跟踪方框的标识符。我们使用var关键字声明它,使其成为一个持久化变量,可以在连续的K线之间保持其值。这样,它的历史值(如openBox[1])总是能代表上一个创建的方框。

接着,一个if语句判断是否开始了一个新的日历日。当dayofmonth的当前值与其前一根K线的值不同时(!=),这种情况就会发生。在条件为true的K线上,我们做两件事。

首先,我们使用box.new()创建一个新方框。这个方框出现在当前K线(bar_index)和下一根K线(bar_index + 1)之间,其上下边框分别是开盘K线的高点和低点。

该方框有一个紫色的(color.purple)背景,通过color.new()函数设置了透明度。我们关闭了它的边框(border_width=0),并使方框无限向右延伸(extend.right)。我们把box.new()返回的标识符存储在openBox变量中。

第二个动作是禁用上一个方框的延伸。因此,我们调用box.set_extend()。为了得到前一个方框的标识符,我们把openBox变量与历史操作符([1])结合。尽管我们在前一根K线上没有创建方框,但它依然能返回正确的标识符,因为var变量会在每根K线上重复其值。我们使用extend.none常量来禁用那个方框的延伸。

这个指标在图表上的效果如下:

我们看到,该指标只延伸了最新的方框。其他日期的开盘K线只有一个一根K线宽的方框。那些方框在过去曾被延伸过,但当新的一天开始时,box.set_extend()函数移除了它们的延伸效果。

box.set_extend()的特性

  • 当我们移除一个方框的延伸时,它的左边框和右边框会回到我们创建或上次更新其位置时的时间坐标。延伸功能并不会在每根K线上都让方框变得更大一点,然后在我们用extend.none禁用延伸时保持那个更大的尺寸。
  • Pine Script没有提供函数来判断一个方框是否已被延伸。如果我们的代码需要确保一个方框处于延伸状态,唯一的办法就是调用box.set_extend()函数并明确地设置其延伸样式。

总结

  • box.set_extend()函数用于延伸我们之前创建的一个方框绘图。
  • 一个方框可以无限向左延伸(extend.left)、无限向右延续(extend.right),或者向两个方向同时延伸(extend.both)。
  • 通过extend.none值,我们可以禁用一个方框的延伸效果。

方框绘图延伸功能的特点

TradingView的指标和策略可以通过代码绘制方框。这些方框既可以只存在于我们指定的起止时间坐标之间,也可以横向延伸,贯穿整个图表。我们有两种方式来延伸一个方框:一是在创建时延伸,通过box.new()函数的extend参数,在创建新方框时直接指定其延伸样式;二是后续修改延伸状态,使用box.set_extend()函数来更改一个已存在方框的延伸状态。

这两种函数都使用相同的延伸样式。让我们来详细了解一下。

方框的四种延伸样式

Pine Script提供了四种可能的方框延伸样式。extend.left让方框从其右边界开始,向图表左侧无限延伸,直至图表的最开始;extend.right让方框从其左边界开始,向图表右侧无限延伸,直至遥远的未来;extend.both让方框同时向图表的左、右两侧无限延伸;extend.none则表示不延伸,方框只存在于其左右边界坐标之间,这是默认样式。

这些延伸样式在图表上的具体效果如何呢?

设置为extend.left的方框会向左侧无限延伸:

设置为extend.right的方框则会向右侧无限延伸:

使用extend.both的方框会同时向左右两个方向无限延伸:

默认情况下,方框的延伸样式是extend.none,它只填充其左右边界坐标之间的区域:

视觉延伸与数据坐标

一个非常重要的概念是,当我们延伸一个方框时,它的数据坐标不会改变。延伸仅仅是一种视觉效果。方框的左、右边界的坐标值(无论是K线编号还是时间戳)仍然保持着我们最初设置或最后一次更新时的值。为了更直观地理解这一点,让我们创建一个方框,并在其左右边界上放置文本标签来显示其坐标:

这个方框的左右边界相隔20根K线。现在,让我们把它设置为两侧延伸:

可以看到,尽管方框在视觉上已经延伸到了图表的两端,但其左右边界的数据坐标没有发生任何变化,代表坐标的标签依然停留在原来的位置,两者之间仍然相隔20根K线。

边框位置固定不变

另一个值得注意的特性是,延伸方框时,其可见的边框位置也是固定不变的。假设我们创建了下面这个带黄色边框的方框:

当我们把它设置为两侧延伸时,我们可能会以为黄色的左右边框会随之移动到图表的两端。但实际情况并非如此:

延伸后,原有的左右边框依然停留在原来的坐标位置。这造成了一种略显奇怪的视觉效果,就好像是在原方框的两侧粘贴了两个无限延伸的色块。由于这种行为可能会影响美观,因此最佳实践是:在延伸方框时,移除其边框(即把边框宽度设为0)。

延伸功能的重要特性

  • 默认不延伸:新创建的方框默认使用extend.none样式。
  • 与趋势线共用常量:extend.*这四个常量与延伸趋势线时使用的常量完全相同。
  • 不支持有限延伸:内置的延伸功能是全有或全无的无限延伸,不支持只延伸特定数量的K线或特定的时间长度。要实现这种有限延伸,需要自定义代码逻辑。
  • 不支持垂直延伸:Pine Script没有提供垂直方向延伸的选项。要使方框在垂直方向上延伸,我们必须手动更新其topbottom坐标。

总结

  • 延伸的方框会在其左侧和/或右侧无限延伸。我们可以通过box.new()box.set_extend()函数来控制这一特性。
  • 方框的延伸样式有四种:extend.none(不延伸,默认)、extend.left(向左)、extend.right(向右)和extend.both(双向)。
  • 延伸方框时,其数据坐标和可见边框的位置都不会发生改变。

用输入选项延伸方框

在Pine Script中,我们可以编写几种自定义的脚本设置。这些输入选项使得更改脚本的参数变得非常容易。其中一个有用的设置是能够更改方框的延伸方式。这样,用户就可以手动配置一个方框是否应该延伸,以及如果延伸,应向哪个方向延伸。

要实现这样的功能,我们需要做三件事。第一,使用input.string()函数创建一个基于文本的下拉菜单,菜单中包含四种延伸方框的方式。第二,把用户的输入转换为一个正确的方框延伸值(即名称以extend.*开头的常量值)。第三,把这个延伸值应用到方框绘图上——可以在创建新方框时通过box.new()直接指定其延伸方式,也可以使用box.set_extend()函数来延伸一个已存在的方框。

让我们开始吧!

步骤1:创建一个方框延伸输入

尽管Pine Script有多种输入类型,但并没有专门用于方框延伸的输入类型。但这不是问题,我们可以创建自己的下拉菜单,稍后再把它转换为一个合适的延伸值。

因此,首先我们创建一个包含所有方框延伸选项的菜单:

// 步骤 1:创建一个包含方框延伸选项的下拉菜单
boxExtendInput = input.string(title="Box Extension", defval="none",
     options=["none", "left", "right", "both"])

这里我们调用input.string()函数并传入了几个参数。我们用title设置的文本会显示在脚本设置窗口中该输入控件的前面。

通过defval,我们为该输入设置了一个标准值。这里我们选择了"none",表示不进行方框延伸(这取决于我们下一步的编码方式)。

options参数指定了下拉菜单中应该出现的项目。由于有四种延伸方框的方式,我们的菜单也相应地有四个值:none、left、right和both。

我们把输入控件的当前值存储在boxExtendInput变量中。后续代码想要知道输入的值时,就会引用这个变量。当我们手动更改输入的值时,这个变量在代码中的值也会随之更新。

步骤2:将输入值转换为extend.*常量

现在我们有了一个输入,它说明了方框应该如何延伸。但这个输入的格式并不正确。要延伸一个方框,我们不使用字符串值,而是使用一个名称以extend.开头的常量值。

所以在第二步中,我们把输入的值转换为一个方框延伸常量:

// 步骤 2:将输入的值转换为正确的 'extend' 常量值
boxExtend = boxExtendInput == "left" ? extend.left :
     boxExtendInput == "right" ? extend.right :
     boxExtendInput == "both" ? extend.both :
         extend.none

这段代码创建了一个新变量:boxExtend。它通过一系列条件运算符(?:)的评估来获得一个值。这些评估会判断输入变量是否等于下拉菜单中的某个特定值,并返回相应的extend.*值。

首先,我们判断boxExtendInput输入变量是否等于(==)字符串"left"。如果下拉菜单被设置为left,那么条件运算符会返回extend.left作为boxExtend变量的值。(稍后我们将使用这个变量来更改方框的延伸。)

如果输入变量是其他值,Pine Script会执行下一个条件运算符。这个运算符判断输入变量是否等于"right"。如果是,则返回extend.right作为boxExtend变量的值。

当输入的下拉菜单既不是left也不是right时,第三个条件运算符会测试其值是否为"both"。如果是,则返回extend.both。否则,当所有条件都不为true时,我们默认不进行任何方框延伸(extend.none)。

无论我们把Box Extension输入选项设置为哪个值,在Pine Script运行这些条件运算符后,boxExtend变量都会持有一个有效的方框延伸值。我们在下一步中使用这个变量。

步骤3:设置方框的延伸

现在我们有了一个有效的方框延伸值,有两种方式可以使用它。我们可以在创建新方框时就设置好延伸,或者更改一个已存在方框的延伸。我们分别来看。

第一种方法是在box.new()创建方框的那一刻就设置好其延伸方式:

// 创建一个新方框并立即使用延伸选项
box.new(left=bar_index[20], top=high[3],
     right=bar_index[3], bottom=low[20],
     bgcolor=color.new(color.orange, 90), 
     border_color=color.teal, extend=boxExtend)

这里的box.new()在3根K线前的高点和20根K线前的低点之间创建了一个方框。该方框有一个橙色的背景和一个蓝绿色的边框。

extend参数告知Pine Script这个方框应该如何延伸。这里我们使用了上一步中创建的boxExtend变量,这使得方框能够使用由自定义输入选项所设定的延伸样式。

另一种方法是延伸我们之前创建的一个方框。为此,我们首先需要创建一个方框绘图:

// 或者,先创建一个方框...
myBox = box.new(left=bar_index[20], top=high[3],
     right=bar_index[3], bottom=low[20],
     bgcolor=color.new(color.orange, 90), 
     border_color=color.teal)

此处的box.new()在3根K线前的高点和20根K线前的低点之间绘制了一个方框。我们把返回的方框标识符存储在myBox变量中,以备后用。

然后,在稍后我们再来更改这个方框的延伸:

// ...之后再进行延伸
box.set_extend(id=myBox, extend=boxExtend)

这段代码调用了box.set_extend()函数。我们向该函数传递myBox变量来识别目标方框,并通过我们之前创建的boxExtend变量来指定要使用的延伸方式。

我们通常在if语句内部使用这种方法,这样就只在特定情况下才修改方框的延伸。

图表示例

让我们看看这个输入在图表上的效果。带有不同延伸选项的下拉菜单看起来是这样的:

当Box Extension输入选项使用其默认值none时,方框不会延伸,效果如下:

把输入设置为left后,方框会无限地向图表的左侧延伸:

而把输入设置为both后,方框则会向左和向右两个方向同时延伸:

示例脚本

下面的指标通过一个输入选项来延伸一个方框绘图。它的代码与我们之前讨论的相同,但现在是作为一个可以运行在你图表上的完整脚本:

//@version=5
indicator(title="用输入延伸方框", overlay=true)

// 步骤 1:创建一个包含方框延伸选项的下拉菜单
boxExtendInput = input.string(title="Box Extension", defval="none",
     options=["none", "left", "right", "both"])

// 步骤 2:将输入的值转换为正确的 'extend' 常量值
boxExtend = boxExtendInput == "left" ? extend.left :
     boxExtendInput == "right" ? extend.right :
     boxExtendInput == "both" ? extend.both :
         extend.none

// 步骤 3:将延伸值应用于一个方框
if barstate.islastconfirmedhistory
    // 创建一个新方框并立即使用延伸选项
    box.new(left=bar_index[20], top=high[3],
         right=bar_index[3], bottom=low[20],
         bgcolor=color.new(color.orange, 90), 
         border_color=color.teal, extend=boxExtend)

    // 或者,先创建一个方框,之后再进行延伸
    myBox = box.new(left=bar_index[20], top=high[3],
         right=bar_index[3], bottom=low[20],
         bgcolor=color.new(color.orange, 90), 
         border_color=color.teal)

    box.set_extend(id=myBox, extend=boxExtend)

请参阅前面的图片以了解该指标在图表上的外观。上面的代码讨论部分有关于此脚本如何工作的更多信息。

赞(0)
未经允许不得转载:图道交易 » Pine Script(192):延伸方框,set_extend与延伸选项
分享到

评论 抢沙发

登录

找回密码

注册