改变方框外观的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。 - 当我们创建了一个透明方框后,不应该再禁用该方框的边框,否则会导致该方框完全消失。


