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

Pine Script(189):方框外观函数概述,set_bgcolor与透明方框

#Pine Script入门教学

改变方框外观的Pine Script函数概览

在我们的Pine Script代码绘制一个方框后,有几个函数可以更改该方框在图表上的外观。

并非方框外观的每个方面都可以更改,但在我们创建方框后,可以使用以下5个函数来修改其视觉样式:box.set_bgcolor()更改方框的背景颜色;box.set_border_color()修改方框的边框颜色;box.set_border_style()设置方框的边框样式(如点线或虚线);box.set_border_width()设置方框的边框厚度;box.set_extend()在一个或两个水平方向上延伸方框。

让我们来逐一深入了解这些函数。

更改背景颜色box.set_bgcolor()

Pine Script的box.set_bgcolor()函数用于更改一个方框绘图的背景颜色。新的颜色可以是标准颜色、十六进制颜色或RGB颜色。我们也可以对这三种颜色中的任意一种应用透明度。

例如,我们可以使用该函数把一个方框的背景变为黄色:

// 将方框的背景设为黄色
box.set_bgcolor(id=myBox, color=color.yellow)

这样做在图表上的效果如下:

box.set_bgcolor()函数也可以移除方框的背景,从而使其成为一个透明的方框(矩形)。

修改边框颜色box.set_border_color()

box.set_border_color()函数用于更改一个方框的边框颜色。新的颜色可以是标准颜色、十六进制颜色或RGB颜色,并且我们也可以对这三种选项中的任意一种应用透明度。

例如,这个函数可以把一个方框的边框变为橙色:

// 将方框的边框颜色更改为橙色
box.set_border_color(id=myBox, color=color.orange)

这样的代码在图表上的效果如下:

更改边框样式box.set_border_style()

Pine Script的box.set_border_style()函数用于更改方框的边框样式。我们可以使用三种边框样式:line.style_solid(实线边框)、line.style_dotted(点线边框)和line.style_dashed(虚线边框)。

如果我们已经创建了一个方框,可以像这样把其边框切换为点线样式:

// 使方框的边框使用点线样式
box.set_border_style(id=myBox, style=line.style_dotted)

这在图表上的效果如下:

改变边框宽度box.set_border_width()

box.set_border_width()函数用于更改方框的边框宽度。默认的边框尺寸是1像素。通过这个函数,我们几乎可以给边框设置任何我们想要的厚度。

多数情况下,我们会让边框稍微粗一点,比如3像素:

// 将方框的宽度设为3
box.set_border_width(id=myBox, width=3)

一个具有该边框尺寸的方框看起来是这样的:

box.set_border_width()也可以移除方框的边框。为此,我们把边框的厚度设为零(0)。

水平延伸方框box.set_extend()

Pine Script的box.set_extend()函数用于在一个或两个水平方向上延伸方框。共有四种可能的方框延伸样式:extend.left(向左延伸方框)、extend.right(向右延伸方框)、extend.both(向左和向右两个方向同时延伸方框)以及extend.none(移除方框的延伸效果)。

要把一个方框一直延伸到图表的起始位置,我们可以使用extend.left值来调用该函数:

// 向左侧方向延伸方框绘图
box.set_extend(id=myBox, extend=extend.left)

这样一个延伸后的方框效果如下:

后面我们会继续学习更多关于使用Pine Script方框绘图的知识。

用box.set_bgcolor()更改方框的背景颜色

在我们创建了一个方框绘图后,可以使用box.set_bgcolor()函数来更改该方框的背景颜色。这个函数会使用纯色填充整个方框的背景区域。

该函数的标准语法是:

box.set_bgcolor(id, color)

id是我们想要更改的方框的标识符。这个ID是我们在调用box.new()创建方框时获得的,Pine Script正是依靠它来精确定位目标方框。color是方框的新背景颜色,我们有多种颜色选项可供使用:标准颜色变量(例如color.orange)、十六进制颜色(例如#ebebeb)、通过color.rgb()函数创建的RGB颜色,以及通过color.new()函数为以上任意颜色添加透明度得到的透明色。

快速范例

要更改方框的背景色,首先我们需要一个方框。我们使用box.new()来创建一个:

// 在30根K线前的收盘价与5根K线前的收盘价之间创建一个方框
myBox = box.new(left=bar_index[30], top=close[30],
	 right=bar_index[5], bottom=close[5])

这段代码创建了一个新方框,并把其ID存储在myBox变量中。现在,我们可以使用这个ID来通过box.set_bgcolor()更改方框的背景色。例如,要把背景变为黄色:

// 将方框背景设为黄色
box.set_bgcolor(id=myBox, color=color.yellow)

由以上两个代码片段创建出的方框,其最终效果如下:

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

// 将方框背景设为黄色
box.set_bgcolor(myBox, color.yellow)

更多颜色选项

除了标准颜色变量,我们还可以使用十六进制颜色值来获得更精确的色彩:

// 将方框背景设为“暴雪蓝”
box.set_bgcolor(id=myBox, color=#ACE5EE)

或者通过color.rgb()函数混合红、绿、蓝分量来定义颜色:

// 将方框背景设为“橙黄色”
box.set_bgcolor(id=myBox, color=color.rgb(248, 213, 104))

我们还可以使用color.new()函数为任何颜色添加透明度:

// 将方框背景设为70%透明的蓝色
box.set_bgcolor(id=myBox, color=color.new(color.blue, 70))

box.set_bgcolor()的主要用途

box.set_bgcolor()函数主要有两个用途。一是更改背景色,即修改一个已存在方框的背景颜色。二是移除背景色:把颜色设置为na值,可以使方框的背景变为完全透明;若要恢复背景,只需再次把它设置为一个有效的颜色即可。

在实际应用中,我们通常把box.set_bgcolor()置于if语句中,以便只在满足特定条件时才去更新背景色。如果只想进行一次性的颜色设置,在创建时直接通过box.new()bgcolor参数来完成会更简洁。

脚本范例

本指标的核心逻辑是:每日创建一个新的预测方框,并在新的一天开始时,自动把前一日方框的背景色移除,从而只高亮显示当前交易日的方框区域。该指标的完整代码如下:

//@version=5
indicator(title="方框背景色范例", overlay=true)

// 获取近期的最高价和最低价
highestHigh = ta.highest(high, 24)
lowestLow   = ta.lowest(low, 24)

// 为方框ID创建一个持久化变量
var box dayBox = na

// 判断是否是新的一天开始
if dayofmonth != dayofmonth[1]
    // 绘制一个向未来延伸24根K线的方框,其范围为近期的极值
    dayBox := box.new(left=bar_index, top=highestHigh,
         right=bar_index + 24, bottom=lowestLow,
         border_color=color.teal, border_width=1,
         bgcolor=color.new(color.orange, 85))

    // 将上一个方框的背景色移除
    box.set_bgcolor(id=dayBox[1], color=na)

脚本首先计算出过去24根K线(在小时图上约等于一天)的最高高点和最低低点。然后,我们声明了一个持久化变量dayBox来保存方框的ID。核心逻辑在if语句中,它通过dayofmonth != dayofmonth[1]来判断当前K线是否为新一天的开始。当新的一天开始时,代码会执行两个操作。

第一步是创建新方框:box.new()创建一个从当前K线向未来延伸24根K线的新方框,其上下边界为我们计算的近期极值,背景色为半透明的橙色。新方框的ID被赋给dayBox

第二步是移除旧背景:调用box.set_bgcolor(),通过dayBox[1]获取上一个(即昨天的)方框ID,并把其背景色设置为na,从而使其背景变为透明。

最终,图表上每天都会创建一个新的方框,但只有当前交易日的方框会带有橙色背景,所有历史方框的背景都将被移除:

box.set_bgcolor()的特性与限制

  • 仅支持纯色填充:方框的背景颜色只能是覆盖整个区域的单一颜色。不支持图案或渐变色。
  • 默认颜色:如果没有特别设置,新创建的方框背景默认为蓝色(color.blue)。
  • 只写不读:Pine Script无法通过代码读取一个方框当前的背景颜色。要确保颜色状态,唯一的方法就是主动去设置它。

总结

  • box.set_bgcolor()函数用于更改指定方框的背景颜色。
  • 颜色值可以是Pine Script支持的任何颜色选项(标准色、十六进制、RGB、透明色)。
  • 设置的背景色会均匀地应用于整个方框,不支持渐变效果。

如何制作透明方框(矩形)

TradingView的Pine Script语言可以在图表上绘制方框。这些绘图通常用一种背景颜色覆盖某个图表区域。但我们也可以只制作矩形。

一个矩形,就是一个没有背景的方框绘图。这样,方框就只由一个实心边框组成——这使得它在视觉上呈现为一个矩形。

创建透明方框的两种方式

要移除一个方框的背景,我们可以把其背景颜色设置为na。这个特殊值表示一个缺失或空的值,例如,它也可以用来关闭一条绘图线。

有两种方式可以把一个方框设置为透明背景。第一种是在创建新方框时,通过box.new()函数直接把它设为透明。为此,我们把bgcolor参数设置为na

// 创建一个新的、透明的方框绘图
box.new(left=bar_index[10], top=high, right=bar_index, bottom=low, 
	 bgcolor=na)

第二种是通过box.set_bgcolor()函数把一个已存在的方框变为透明背景。当我们把其新背景色设置为na时,即可实现。例如:

// 关闭一个已存在方框的背景
box.set_bgcolor(id=myBox, color=na)

当一个方框变为矩形后,我们可以通过自定义其边框尺寸和边框颜色来改变其外观。

请注意,我们不应该移除一个矩形的边框。因为它的背景已经是透明的,这样做会使整个绘图完全不可见。

让我们来仔细看看这两种创建矩形的代码实现方式。

创建一个透明方框(矩形)

第一种创建矩形的方法,是在使用box.new()函数创建新方框时就直接完成。下面的示例脚本展示了其具体用法。

该指标会监测价格何时穿越加权移动平均线(WMA)。当穿越发生时,我们创建一个矩形来高亮显示一个可能的未来价格范围。该脚本的完整代码如下:

//@version=5
indicator(title="创建透明方框", overlay=true)

// 计算加权移动平均线并绘制其值
wmaValue = ta.wma(close, 20)
plot(series=wmaValue, color=color.teal, linewidth=2, title="WMA")

// 每当价格穿越WMA时,创建一个透明方框
if ta.cross(close, wmaValue)
    box.new(left=bar_index, top=math.max(high, high[1]),
         right=bar_index + 5, bottom=math.min(low, low[1]),
         bgcolor=na, border_color=color.gray, border_width=3)

我们从indicator()函数开始,它配置了脚本的设置:为指标命名并使其叠加显示在主图表上。

然后,ta.wma()函数计算加权移动平均线。我们让它基于收盘价(close)计算20根K线的周期。计算结果存储在wmaValue变量中。

接下来,我们使用plot()函数绘制该平均线。由于未设置绘图类型,Pine Script默认绘制一条常规的线图。这条线以蓝绿色(color.teal)显示。

然后,一个if语句根据一个条件来创建矩形。我们使用ta.cross()函数来构建这个条件,它在这里测试价格(close)是否上穿或下穿了平均线(wmaValue)。当穿越发生时,if语句内部的代码便会执行。

这段代码使用box.new()创建一个新方框。我们在当前K线(bar_index)和右侧5根K线处(bar_index + 5)之间绘制这个方框。其上边框使用当前和前一根K线的最高高点(通过math.max()函数获取),下边框则是当前和前一根K线的最低低点(通过math.min()函数获取)。

为了使方框成为一个矩形,我们使用na来禁用其背景(bgcolor=na)。我们把方框的边框颜色设置为灰色(color.gray),并使用3像素的边框宽度。如果没有边框,这个方框将会完全不可见。

当我们把这个脚本添加到图表时,它每次在价格穿越20周期加权移动平均线时都会创建一个新的矩形:

将现有方框变为透明

第二种创建矩形的方法是修改一个已存在的方框。当我们移除它的背景后,这个方框就变成了一个矩形(前提是它仍然有边框)。

我们可以通过box.set_bgcolor()函数来实现。这个函数需要方框的标识符和新的背景色。为了达到我们的目的,我们把后者设置为na

让我们在一个完整的脚本中看看这是如何运作的。下面的指标同样检查价格是否穿越了加权移动平均线,这与上面的脚本思路相同,以便于比较两种方法。

我们同样在价格穿越WMA时绘制一个方框。但这次,最新的穿越会用一个黄色的方框来标记,而之前的穿越事件则用矩形(无背景的方框)来高亮显示。

该指标的代码如下:

//@version=5
indicator(title="将方框变为透明的", overlay=true)

// 计算加权移动平均线并绘制其值
wmaValue = ta.wma(close, 20)
plot(series=wmaValue, color=color.teal, linewidth=2, title="WMA")

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

// 判断价格是否穿越了WMA
if ta.cross(close, wmaValue)
    // 创建一个带有黄色背景的新方框
    wmaCrossBox := box.new(left=bar_index, top=math.max(high, high[1]),
         right=bar_index + 5, bottom=math.min(low, low[1]),
         bgcolor=color.new(color.yellow, 50), 
         border_color=color.gray, border_width=3)

    // 使前一个方框的背景透明
    box.set_bgcolor(id=wmaCrossBox[1], color=na)

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

ta.wma()函数接着计算加权移动平均线,它基于收盘价和20周期的长度。plot()函数把这个平均线绘制为一条蓝绿色的线。

然后,我们创建wmaCrossBox变量。我们将用这个变量来跟踪方框的标识符。因为我们使用了var关键字来声明它,它的值可以从一根K线持续到下一根。即使我们不在每根K线上都更新它,它的历史值(如wmaCrossBox[1])仍然持有上一次创建的方框信息。

接下来的if语句使用ta.cross()函数测试价格(close)是否穿越了WMA(wmaValue)。当穿越发生时,我们做两件事。

首先,我们使用box.new()创建一个方框。我们在当前K线和未来5根K线之间绘制它。其上下边框由最近2根K线的最高高点和最低低点决定。它有一个黄色的(color.yellow)背景,通过color.new()函数设置为50%的透明度。方框的边框是灰色,厚度为3像素。我们把返回的方框标识符存入wmaCrossBox变量。

然后,我们使前一个方框变为透明。这个方框是上一次if语句运行时创建的。因此,我们调用box.set_bgcolor()函数并传入两个参数:第一个是wmaCrossBox[1],它返回上一个方框的标识符;第二个参数na,则移除了那个方框的背景,使其只剩下一个边框——即一个矩形。

在图表上,该脚本用一个黄色的背景高亮显示最近的穿越事件。其他之前的方框则拥有透明背景,由于它们仍有边框,所以显示为矩形:

移除方框背景的替代方法

上面我们讨论了如何使用na值来关闭方框的背景。但我们也可以使用另一种方法。

当我们把背景设置为一个100%透明的颜色时,方框的背景同样会被关闭。我们可以使用color.new()函数来创建这样一个透明的颜色。例如:

// 关闭一个已存在方框的背景
box.set_bgcolor(id=myBox, color=color.new(color.white, 100))

我们之前没有使用这种方法,因为它写起来更长。而且Pine Script已经在不同场景中(如禁用绘图线)使用na来关闭视觉输出,这使得na成为一种更通用的禁用特性的方式。

当然,你完全可以自由地使用100%透明的颜色来禁用方框背景,这种方法同样有效,你的个人偏好也很重要。

需要注意的是,一个包含完全透明度的十六进制颜色值,例如#FFFFFFFF,无法关闭一个方框的背景。因此,要得到透明的方框,我们要么使用na,要么使用color.new()函数。

总结

  • 一个带有透明背景的方框在图表上显示为一个矩形。
  • 要创建一个透明的方框,我们可以使用box.new()box.set_bgcolor()函数把其背景设置为na
  • 当我们创建了一个透明方框后,不应该再禁用该方框的边框,否则会导致该方框完全消失。
赞(0)
未经允许不得转载:图道交易 » Pine Script(189):方框外观函数概述,set_bgcolor与透明方框
分享到

评论 抢沙发

登录

找回密码

注册