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

Pine Script(191):方框边框宽度,set_border_width与移除边框

#Pine Script入门教学

用box.set_border_width()更改方框的边框宽度

在我们创建一个方框后,可以使用box.set_border_width()函数来更改该方框的边框宽度。这个新的尺寸会应用于方框的所有四个边框。

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

box.set_border_width(id, width)

id参数是我们想要更改的方框的标识符。这个ID是我们在使用box.new()创建方框时返回的,我们通过它来告知Pine Script要修改哪个方框,否则Pine Script将无从知晓。width参数是方框四个边框的新尺寸,以像素为单位。方框边框的默认尺寸是1,这也是可能的最小宽度;要关闭一个方框的边框,需把其宽度设置为零(0)。

快速示例

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

// 在50根K线前的高点和当前K线前3根K线的低点之间绘制一个方框
myBox = box.new(left=bar_index[50], top=high[50],
	 right=bar_index[3], bottom=low[3], bgcolor=na)

这里我们把box.new()返回的标识符保存到一个变量中。然后我们就可以使用这个标识符和box.set_border_width()函数了。例如:

// 将方框的边框宽度更改为3像素
box.set_border_width(id=myBox, width=3)

这会修改myBox方框绘图,我们把该方框的边框厚度设为3像素。

在图表上,这样一个方框看起来是这样的:

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

// 将方框的边框宽度更改为3像素
box.set_border_width(myBox, 3)

box.set_border_width()的使用方式

box.set_border_width()函数主要有三种用途:更改一个先前创建的方框的边框厚度;通过把边框宽度设置为零(0)来禁用一个先前创建的方框的边框;以及通过把宽度设为1或更高的值来重新启用一个方框的边框。

在实践中,我们通常把box.set_border_width()与一个真/假条件判断结合使用。这样可以在特定情况发生时修改方框的边框尺寸,而在其他时候保持其不变。

如果我们的目标是在任何情况下都设置相同的边框尺寸(即无条件地),那么我们也可以在用box.new()创建方框时就直接定义该尺寸。那样可以减少输入量,并使我们的代码更清晰。

示例脚本

下面的代码展示了box.set_border_width()在一个完整指标中的用法。这个脚本会绘制两条移动平均线。当它们交叉时,我们绘制一个方框来高亮显示一个可能的价格范围,然后我们还会移除旧方框的边框。

该指标的代码如下:

//@version=5
indicator(title="方框边框宽度示例", overlay=true)

// 计算两条指数移动平均线
fastEMA = ta.ema(close, 20)
slowEMA = ta.ema(close, 80)

// 将两条移动平均线作为常规线图绘制
plot(series=fastEMA, color=color.orange, title="Fast EMA")
plot(series=slowEMA, color=color.teal, title="Slow EMA")

// 创建方框绘图的持久化变量
var box crossBox = na

// 当移动平均线交叉时,创建新方框
if ta.cross(fastEMA, slowEMA)
    crossBox := box.new(left=bar_index, top=high * 1.1,
         right=bar_index + 20, bottom=low * 0.9,
         bgcolor=color.new(color.teal, 90), border_width=3,
         border_color=color.navy)

    // 禁用前一个“过时的”方框的边框
    box.set_border_width(id=crossBox[1], width=0)

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

然后,我们使用ta.ema()函数计算两条指数移动平均线。我们把20周期的平均值存储在fastEMA变量中,slowEMA变量则持有80周期EMA的值。

我们使用plot()函数绘制这两条平均线。快线以橙色(color.orange)显示,慢线则以蓝绿色(color.teal)显示。由于未设置绘图类型,Pine Script默认把它们都绘制为常规的线图。

接着,我们创建crossBox变量。这个方框变量的值可以在连续的K线之间保持不变(通过var关键字)。我们在if语句外部创建它,以便能正确地引用其历史值。

接下来,我们创建方框并更改其边框宽度:

// 当移动平均线交叉时,创建新方框
if ta.cross(fastEMA, slowEMA)
    crossBox := box.new(left=bar_index, top=high * 1.1,
         right=bar_index + 20, bottom=low * 0.9,
         bgcolor=color.new(color.teal, 90), border_width=3,
         border_color=color.navy)

    // 禁用前一个“过时的”方框的边框
    box.set_border_width(id=crossBox[1], width=0)

这个if语句评估ta.cross()函数的返回值,判断快线是否上穿或下穿了慢线。当交叉发生时,if代码块内的代码便会执行。

这段代码使用box.new()创建一个新方框。其长度范围在当前K线(bar_index)和未来20根K线处(bar_index + 20)之间。方框的高度范围是高点上方10%(high * 1.1)和低点下方相同百分比(low * 0.9)。

对于背景,我们使用color.new()函数对color.teal颜色应用透明度。初始边框尺寸为3像素,边框颜色为海军蓝(color.navy)。

在我们创建一个新方框后,我们也会让旧的方框退休。为此,我们移除那个方框的边框。我们调用box.set_border_width()函数,第一个参数是crossBox[1],它返回前一个方框的标识符,而width参数设置为零(0)则会移除该边框。

在价格图表上,这个脚本会创建多个方框。只有最新的一个带有蓝色边框,而那些过时的方框则没有边框:

box.set_border_width()的特性

  • box.set_border_width()会为所有四个方框边框设置宽度。该函数不能为某个特定的边框设置单独的宽度。
  • 当方框的边框颜色与其背景颜色相同时,box.set_border_width()函数将没有视觉效果。在这种情况下,我们必须为方框设置一个不同的边框颜色。
  • 如果我们把一个方框的边框颜色设置为na,其边框将被禁用。在这种情况下,box.set_border_width()也无法改变方框的外观。要解决这个问题,需要先为方框的边框设置一个颜色。
  • Pine Script无法获取一个方框当前的宽度。要确保一个方框具有某个特定的宽度,我们唯一的办法就是调用box.set_border_width()并明确设置该尺寸。

总结

  • box.set_border_width()函数更改一个方框的边框尺寸。
  • 默认的边框尺寸是1,更高的值会使边框更粗。
  • 当我们把边框尺寸设置为零(0)时,方框将不再有边框。

方框边框尺寸的特点

TradingView的指标和策略可以通过代码绘制方框,这种绘图工具非常适合用于标记图表上的特定区域。方框有很多可自定义的选项,其中之一便是其边框的宽度。我们有两种方式来配置方框的边框宽度:一是在创建时设置,通过box.new()函数的border_width参数,在创建新方框时直接指定其边框厚度;二是后续修改,使用box.set_border_width()函数来更改一个已存在方框的边框宽度。

这两个函数都以像素为单位来定义边框的宽度。让我们看看它们在实践中的效果。

边框宽度效果示例

一个新创建的方框,其默认边框宽度为1像素,这也是所能设置的最小(最细)宽度。宽度为1像素的边框在图表上显示如下:

由于边框的宽度是基于像素的,因此无论我们如何放大或缩小图表,它的视觉厚度都将保持不变。边框宽度值越大,边框就越粗。例如,宽度为5像素的边框看起来是这样的:

而当边框宽度增加到12像素时,效果如下:

边框宽度的上限

这些示例不禁让人好奇,边框究竟能设多宽?从技术上讲,TradingView似乎没有设定一个严格的上限。当然,在实际应用中,当宽度大到一定程度时,它就会变得不切实际。50像素的宽度完全没有问题:

100像素宽度的效果如下:

说到实用性的限制,当边框宽度达到500像素时,它已经覆盖了整个图表窗口:

(提示:当我们使用非常大的边框时,可能希望边框显示在价格K线的上层。要实现这一点,可以在脚本设置的Visual Order选项中选择Bring to Front。)

边框的生长方向

从上面的图片可以看出,边框越粗,它向方框内部侵占的区域就越多。由于边框是向内生长的,因此调整边框宽度并不会改变方框在图表上所覆盖的整体坐标区域。然而,这种向内生长只在一定限度内发生。当边框变得极度宽大时,它会开始向外溢出,导致上下边界和左右边界发生视觉上的交叉(例如,下边框跑到了上边界的上方)。

另外要注意,由于TradingView的边框是绘制在方框的内部区域,如果边框颜色与背景颜色完全相同,那么我们将无法看到边框。因此,要观察到边框宽度或样式的变化,请确保边框颜色与背景色有所区别。

边框宽度的重要特性

  • 默认宽度:如果不指定border_width,新创建的方框默认边框宽度为1像素。
  • 关闭边框:把宽度设为0可以完全隐藏边框。设置小于零的值效果相同。
  • 统一样式:边框宽度会同时应用于方框的所有四个边,无法为不同的边设置不同的宽度。
  • 对虚线/点线样式的影响:当边框样式为虚线或点线时,增加边框宽度不仅会使线段变粗,还会增大线段之间的间距。

总结

  • 方框的边框宽度以像素为单位定义其线条厚度,可通过box.new()box.set_border_width()函数进行设置。
  • 最小的边框宽度为1像素,而其上限没有严格的技术限制,但受限于实际可用性。

用输入选项设置方框的边框尺寸

Pine Script提供了多种输入选项类型。借助这些自定义选项,我们可以快速地更改脚本的设置。其中一个非常有用的功能就是能够更改方框的边框尺寸,这样用户便可以轻松地把边框调整到自己喜欢的厚度。

但该如何实现呢?要通过一个输入来设置方框的边框尺寸,我们需要做两件事。第一,创建一个整数输入选项,用于指定我们想要使用的尺寸。第二,使用该输入的值来设置边框的尺寸——可以在创建新方框时通过box.new()直接应用所选的边框尺寸,也可以使用box.set_border_width()函数来更改我们之前创建的一个方框的尺寸。

让我们开始编写代码吧!

步骤1:创建一个数值型整数输入

在Pine Script中,我们使用一个整数来设置方框的边框尺寸。所以我们首先要做的是创建一个整数输入选项:

// 步骤 1:创建一个用于指定边框宽度的输入选项
boxWidth = input.int(title="Box Border Width", defval=1, minval=1)

这里我们调用input.int()函数并传入了几个参数。我们使用title来为该输入命名,这里指定的文本会显示在脚本设置窗口中该输入字段的前面。

defval参数为该输入提供了一个1的标准值。这样,即使用户没有配置该输入,脚本依然有一个值可以用于计算。

minval参数为该选项设置了1的最小值。因为方框的边框不能比这个值更小,所以我们不允许在输入中使用更低的值。

我们把输入控件的当前值存储在boxWidth变量中。后续代码可以通过使用该变量来访问输入的当前值。当我们手动更改输入的值时,脚本代码中该变量的值也会随之更新。

步骤2:将边框宽度设置为输入值

现在我们有了一个输入,它说明了要使用哪个边框尺寸。接下来我们需要把这个尺寸应用到一个方框上。Pine Script提供了两种方式来实现。

我们可以在创建新方框时就设置好边框尺寸,或者更改一个已存在方框的边框尺寸。我们分别来看。

第一种选择是在我们使用box.new()创建方框时就立即设置边框尺寸:

// 创建一个新方框并立即设置其边框宽度
box.new(left=bar_index[40], top=high, 
     right=bar_index, bottom=low[40],
     bgcolor=na, border_color=color.orange,
     border_width=boxWidth)

这里的box.new()在当前高点和40根K线前的低点之间创建了一个方框。它的背景被关闭(bgcolor=na),边框颜色为橙色(color.orange)。

通过border_width参数,我们告知方框要使用哪个边框尺寸。这里我们使用了boxWidth变量,它持有我们之前创建的输入选项的值。最终结果就是一个带有我们输入选项所设定尺寸的新方框。

另一种方法是更改一个已存在方框的边框尺寸。为此,我们首先需要创建一个方框:

// 或者,先创建一个方框...
myBox = box.new(left=bar_index[40], top=high, 
     right=bar_index, bottom=low[40],
     bgcolor=na, border_color=color.orange,
     border_width=boxWidth)

这里的box.new()在当前K线和40根K线前之间创建了一个方框。我们把box.new()返回的方框标识符存储在myBox变量中,以便后续可以访问该方框。

然后,在脚本的稍后部分,我们再来更改这个方框的边框尺寸:

// ...之后再更新其边框宽度
box.set_border_width(id=myBox, width=boxWidth)

这里的box.set_border_width()函数用于更新边框尺寸。我们使用myBox变量来告知Pine Script要修改哪个方框,而新的边框尺寸则由我们之前创建的boxWidth输入变量来决定。

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

示例图表

那么上面的代码在TradingView中看起来如何呢?我们来看一下。用于边框宽度的数值输入框是这样的:

当输入为其默认值1时,方框的边框只有1像素厚:

一旦我们把输入选项的值增加到5,方框会变为:

示例脚本

下面是一个通过输入选项来设置方框边框尺寸的完整指标。它包含了我们上面讨论过的代码,但现在是一个可以运行在你图表上的完整脚本:

//@version=5
indicator(title="用于方框边框宽度的输入", overlay=true)

// 步骤 1:创建一个用于指定边框宽度的输入选项
boxWidth = input.int(title="Box Border Width", defval=1, minval=1)

// 步骤 2:使用输入选项来设置边框宽度
if barstate.islastconfirmedhistory
    // 创建一个新方框并立即设置其边框宽度
    box.new(left=bar_index[40], top=high, 
         right=bar_index, bottom=low[40],
         bgcolor=na, border_color=color.orange,
         border_width=boxWidth)

    // 或者,创建一个方框,之后再更新其边框宽度
    myBox = box.new(left=bar_index[40], top=high, 
         right=bar_index, bottom=low[40],
         bgcolor=na, border_color=color.orange,
         border_width=boxWidth)

    box.set_border_width(id=myBox, width=boxWidth)

请参阅上面的图片以了解该指标的外观。关于代码的详细信息也在本课的前面部分进行了讨论。

如何移除方框的边框

在Pine Script中,我们可以通过代码在图表上绘制方框。这些绘图通常由一个带颜色的背景和一个环绕的边框组成,非常适合用于标记特定的图表区域。然而,边框是可选的。移除边框后,我们就得到了一个纯粹的背景色块,这种方式能以更柔和、不那么突兀的形式来高亮图表模式。要移除方框的边框,我们只需把其边框宽度设置为零(0)即可。这相当于把边框的厚度设为0像素,从而关闭了方框周围的线条。我们的代码可以通过两种方式来实现零宽度的边框。

第一种是创建时设置:在调用box.new()创建方框时,直接把其border_width参数设为0。这会覆盖掉默认启用的边框。例如:

// 创建一个无边框的新方框
box.new(left=bar_index[30], top=high + hl2,
	 right=bar_index, bottom=low - hl2,
	 border_width=0)

第二种是后续修改:使用box.set_border_width()函数来修改一个已存在的方框。当此函数把宽度设置为0时,它会移除该方框的边框。代码如下:

// 移除一个已存在方框的边框
box.set_border_width(id=myBox, width=0)

这里有个要注意的地方:我们不应为一个背景透明的方框移除其边框。如果这样做,这个方框将在图表上完全消失。我们应该二选一:要么移除背景(得到一个只有边框的矩形),要么禁用边框(得到一个只有背景色块的区域),但不应两者同时进行。下面我们通过两个示例脚本来分别演示这两种方法。

方法一:创建时即设为无边框

创建无边框方框最直接的方法,就是在调用box.new()时进行设置。这样可以一步到位,无需后续修改。下面的指标脚本演示了这种做法。它绘制了7周期的相对强弱指数(RSI),当指标进入超买或超卖区时,我们就在副图上绘制一个无边框的背景色块来标记这个感兴趣的区域。脚本的完整代码如下:

//@version=5
indicator(title="创建无边框方框")

// 计算7周期RSI
rsiValue = ta.rsi(close, 7)

// 绘制RSI及超买超卖线
plot(series=rsiValue, color=color.purple, linewidth=2, title="RSI")
hline(price=30, linestyle=hline.style_solid)
hline(price=70, linestyle=hline.style_solid)

// 当RSI下穿30或上穿70时,用一个无边框的彩色方框高亮该“盘整”期
if ta.crossunder(rsiValue, 30) or ta.crossover(rsiValue, 70)
    box.new(left=bar_index[1], top=90,
         right=bar_index + 3, bottom=10,
         bgcolor=color.new(color.orange, 80),
         border_width=0)

脚本的核心逻辑在if语句中。它检测RSI是否进入了超买(>70)或超卖(<30)状态。一旦条件满足,box.new()便会创建一个新的绘图。在这个函数调用中,我们通过border_width=0这个关键参数,直接创建了一个没有边框的方框。同时,我们使用bgcolor参数为它设置了一个半透明的橙色背景。最终,图表上每次RSI进入超买或超卖区时,都会出现一个无边框的背景色块,清晰地标记出信号区域:

方法二:动态移除已有边框

另一种移除边框的方式是,先创建一个带边框的方框,然后根据特定条件,使用box.set_border_width()函数把其边框宽度修改为0。下面的指标脚本演示了这种动态修改的方法。它同样在高亮RSI的超买超卖信号,但增加了一个成交量的确认条件。只有当成交量也配合放大时,我们才把信号方框的边框移除。脚本的完整代码如下:

//@version=5
indicator(title="从方框移除边框")

// ... (RSI计算和绘图代码与上例相同) ...
rsiValue = ta.rsi(close, 7)
plot(series=rsiValue, color=color.purple, linewidth=2, title="RSI")
hline(price=30, linestyle=hline.style_solid)
hline(price=70, linestyle=hline.style_solid)

// 当RSI进入超买或超卖区时...
if ta.crossunder(rsiValue, 30) or ta.crossover(rsiValue, 70)
    // 先创建一个带红色边框的方框
    rsiBox = box.new(left=bar_index[1], top=90,
         right=bar_index + 3, bottom=10,
         bgcolor=color.new(color.orange, 80),
         border_width=1, border_color=color.red)

    // 如果成交量确认了信号,则移除边框
    if volume > math.max(volume[1], volume[2])
        box.set_border_width(id=rsiBox, width=0)

在这个脚本中,当RSI信号出现时,我们首先用box.new()创建一个带红色边框的方框,并把其ID存入rsiBox变量。紧接着,一个嵌套的if语句判断当前K线的成交量是否大于前两根K线的最大值。如果条件成立(即成交量确认),我们就调用box.set_border_width(),传入rsiBox的ID,并把宽度设为0,从而移除其边框。最终图表上,那些得到成交量确认的RSI信号会以无边框的色块显示,而未得到确认的信号则保留其红色边框。

其他可行的替代方法

border_width设为0是最直接的方法,但并非唯一途径。以下方法同样可以实现移除边框的效果:把边框宽度(border_width)设置为na值;把边框颜色(border_color)设置为na值;或者把边框颜色设置为100%完全透明的颜色(通过color.new()函数创建)。注意,使用带透明度通道的十六进制颜色,如#FFFFFFFF,无法达到此效果。

这些方法都能正常工作,并无优劣之分。本文选择border_width = 0的方式,主要是因为它逻辑清晰:用0关闭边框,用>= 1的值开启边框,易于记忆和理解。你可以根据个人偏好选择最适合的方法。

总结

  • 一个无边框的方框在图表上表现为一个纯粹的背景色块。
  • 要移除方框的边框,我们可以通过box.new()box.set_border_width()函数,把其边框宽度设置为零(0)。
  • 要重新启用边框,只需把其厚度设置为1或更高的值即可。
赞(0)
未经允许不得转载:图道交易 » Pine Script(191):方框边框宽度,set_border_width与移除边框
分享到

评论 抢沙发

登录

找回密码

注册