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

Pine Script(151):用bgcolor()为图表背景着色

#Pine Script入门教学

用bgcolor()为图表背景着色

在TradingView中,我们可以为绘图和水平线上色,也可以填充它们之间的背景区域。但我们该如何为整个TradingView图表的背景(从上到下)着色呢?

为TradingView图表的完整背景着色

我们可以手动设置脚本的颜色,也可以通过代码来设置,后者使得像有条件地使用颜色这样的操作成为可能。TradingView中可用的颜色包括标准的基础颜色变量以及能提供数百万种颜色的十六进制颜色值。

有几个函数拥有一个 color 参数,可以接受颜色值,其中之一就是 bgcolor()。该函数可以为脚本的背景着色,这既可以是主价格图表的背景,也可以是子图的背景(取决于脚本显示的位置)。我们可以使用 bgcolor() 做的事情包括有条件地为图表背景着色以及高亮显示交易时段的背景。

bgcolor() 函数的默认语法如下:

bgcolor(color, offset, editable, title)

这些参数的作用如下:

参数 描述
color 必需参数,用于将填充背景的颜色设为一种标准的TradingView颜色或一个十六进制颜色值。该参数也可以被设为一个表达式(如 close > open ? green : red),以便有条件地为图表背景着色。
offset 可选参数,用于将着色的背景向左或向右移动指定的K线数量。省略时,offset 默认为0(无偏移)。将其设为负值会将背景向左移动(即移向过去),而正值则将其重新定位到图表右侧的未来K线。另请参阅偏移背景色。
editable 可选参数,默认值为 true,允许我们在脚本的“样式”窗口中手动更改填充背景的设置。当 editable 设为 false 时,背景设置将无法被手动更改。
title 可选参数,用于指定填充背景的标题,这个名称在手动更改脚本颜色时会显示在“样式”窗口中。一个具有描述性的名称能让区分不同的背景变得更容易。

注意

bgcolor()fill() 函数都用于为图表背景着色。但 fill() 是填充两条曲线或两条水平线之间的背景区域,而 bgcolor() 则是从上到下为整个图表背景着色。

在TradingView交易策略中为图表背景着色

下面给出了 bgcolor() 函数的一个例子。在这个策略中,当三条EMA(指数移动平均线)呈多头排列时,我们建立一个多头仓位;当它们呈空头排列时,则做空。

该示例策略会根据其持仓方向为背景着色。当持有多头时,背景为绿色;当持有空头时,则为红色。在讨论完代码之后,我们将看几个加载了该脚本的图表示例。

但首先,是代码:

//@version=5
strategy(title="EMA crosses", overlay=true)

// 输入选项
priceData  = input.source(hl2, title="Price data")
ema1Length = input.int(12, title="EMA 1")
ema2Length = input.int(24, title="EMA 2")
ema3Length = input.int(36, title="EMA 3")

// 计算数值
ema1 = ta.ema(priceData, ema1Length)
ema2 = ta.ema(priceData, ema2Length)
ema3 = ta.ema(priceData, ema3Length)

// 交易条件
var enterLong = false
var enterShort = false

enterLong := ema1 > ema2 and ema2 > ema3 and not enterLong[1]
enterShort := ema1 < ema2 and ema2 < ema3 and not enterShort[1]

// 绘制数值
plot(ema1, color=color.orange, linewidth=2)
plot(ema2, color=color.maroon, linewidth=2)
plot(ema3, color=color.blue, linewidth=2)

// 提交订单
if enterLong
    strategy.entry("Enter Long", strategy.long)
if enterShort
    strategy.entry("Enter Short", strategy.short)

// 为背景着色
backgroundColour = if strategy.position_size > 0
    color.new(color.green, 85)
else
    color.new(color.red, 85)

bgcolor(backgroundColour)

我们以 strategy() 函数开始,这是每个交易策略都必需的。我们将其 overlay 参数设为 true,以便在主图表的交易品种上叠加显示该策略。

接下来,我们向策略添加四个输入项:

// 输入选项
priceData  = input.source(hl2, title="Price data")
ema1Length = input.int(12, title="EMA 1")
ema2Length = input.int(24, title="EMA 2")
ema3Length = input.int(36, title="EMA 3")

我们通过专门的函数来创建这些手动输入选项。这些函数不仅创建了输入项,还会返回该输入的当前值,我们在这里用一个变量来存储它。

首先,我们使用 input.source() 函数创建一个数据源输入。这类输入会在脚本设置中创建一个下拉菜单,允许我们从当前图表的交易品种中选择价格数据。它们通常用于指定脚本应该基于哪种价格数据进行计算。在我们的例子中,我们将该输入的默认值设为 hl2。这个内置变量返回K线的中点价格(即 (high + low) / 2)。我们将这个输入命名为“Price data”,并使用赋值运算符(=)将其当前值存储在 priceData 变量中。

另外三个输入都是数值整数输入,我们通过 input.int() 函数创建。这些名为“EMA 1”、“EMA 2”和“EMA 3”的输入,默认值分别为12、24和36。我们将 input() 返回的当前值分别存储在 ema1Lengthema2Lengthema3Length 这几个输入变量中,以便稍后在计算EMA时引用它们。

然后,我们计算移动平均线:

// 计算数值
ema1 = ta.ema(priceData, ema1Length)
ema2 = ta.ema(priceData, ema2Length)
ema3 = ta.ema(priceData, ema3Length)

EMA是通过 ta.ema() 计算的,该函数需要两个参数:一个数据序列以及计算EMA所用的K线数量。这些均线基于 priceData 值进行计算,我们刚才已将其默认值设为 hl2。EMA的周期则分别设为 ema1Lengthema2Lengthema3Length 这三个输入变量。我们将 ta.ema() 返回的计算结果存储在 ema1ema2ema3 变量中。

然后,这些EMA的值被用来计算 enterLongenterShort 变量的值:

// 交易条件
var enterLong = false
var enterShort = false

enterLong := ema1 > ema2 and ema2 > ema3 and not enterLong[1]
enterShort := ema1 < ema2 and ema2 < ema3 and not enterShort[1]

我们首先声明了两个持久化(var)变量:enterLongenterShort,它们的默认值都为 false

然后,我们基于一个包含了大于(>)、小于(<)、and 以及 not 运算符的表达式来更新它们的值。

enterLong 变量的布尔值由三个条件共同决定。由于我们使用 and 逻辑运算符来组合这些条件,因此所有条件都必须为 trueenterLong 的值才会被赋为 true

我们的第一个条件检查快线EMA是否在慢线EMA之上(ema1 > ema2),同时第二个条件评估中速EMA是否在最慢的EMA之上(ema2 > ema3)。换句话说,均线需要呈多头排列。

第三个条件看起来有些晦涩:not enterLong[1]。它获取的是 enterLong 在前一根K线上的值。通过 not 运算符,我们要求这个前值必须为 false

not 运算符的逻辑是:当其后的值为 false 时,它返回 true,反之亦然。因此,当 enterLong[1]false 时,not enterLong[1] 就会返回 true

为什么要加入 not enterLong[1] 这段代码呢?我们这样做是为了确保 enterLong 只在三条EMA首次呈多头排列时触发一次信号,而不会在后续K线上持续为 true。否则,我们的策略可能会连续发出市价单,导致我们建立一个远超预期的多头头寸。这就是为什么我们要求 enterLong[1] 必须为 false,然后 enterLong 的当前值才可能为 true

在为 enterLong 变量赋值之后,我们以几乎相同的方式为 enterShort 变量赋值。不同之处在于,我们现在检查的是均线是否呈空头排列(ema1 < ema2 并且 ema2 < ema3)。对于 enterShort 变量,我们也要求其前一根K线的值为 false (not enterShort[1])。

接下来,我们在图表上绘制EMA的值:

// 绘制数值
plot(ema1, color=color.orange, linewidth=2)
plot(ema2, color=color.maroon, linewidth=2)
plot(ema3, color=color.blue, linewidth=2)

我们使用 plot() 函数来执行绘图,该函数会将其第一个参数指定的任何数据系列显示在图表上。这里我们将参数分别设为 ema1ema2ema3 变量。

通过 linewidth 参数设为2,我们让这些线条比默认的尺寸稍粗一些。它们的颜色分别设为橙色、褐红色和蓝色这些标准的TradingView颜色。

然后,我们提交策略的订单:

if enterLong
    strategy.entry("Enter Long", strategy.long)
if enterShort
    strategy.entry("Enter Short", strategy.short)

这两个 if 语句使用了我们之前定义的 enterLongenterShort 布尔变量。第一个 if 语句评估 enterLong 变量,当其值为 true 时,执行其下方的语句。

该缩进的语句调用了 strategy.entry() 函数,该函数默认会提交一个市价单来建立一个头寸。这里我们使用了它的两个参数:第一个,"Enter Long",是订单的名称(或标识符);另一个,strategy.long,则指定 strategy.entry() 应该建立一个多头交易。

我们以类似的方式通过第二个 if 语句来发起一个空头仓位,但这次需要 enterShort 变量为 true。如果是,我们使用 strategy.entry() 函数来发送一个名为“Enter Short”的空头入场(strategy.short)订单。

注意

我们在本例中通过 strategy.entry() 来提交入场订单,但没有设置平仓订单,后者需要 strategy.close()strategy.exit() 函数。这意味着我们的策略始终处于持仓状态,它只会在多头和空头头寸之间来回反转。

我们以根据策略的当前持仓为图表背景着色来结束本例:

// 为背景着色
backgroundColour = if strategy.position_size > 0
    color.new(color.green, 85)
else
    color.new(color.red, 85)
bgcolor(backgroundColour)

这里我们有条件地为背景着色。为此,我们首先创建 backgroundColour 变量,并从一个 if/else 语句为其赋值。

if 在这里评估的条件是 strategy.position_size 变量的值是否大于零。当策略持有多头头寸时,该变量的值就会大于零。在这种情况下,我们返回一个通过 color.new() 函数设置了85%透明度的绿色(color.green),该颜色值随后被存储在 backgroundColour 变量中供后续使用。

如果该条件为 false(发生在策略空仓或持有空头时),那么 else 代码块会执行。这里Pine Script返回一个通过 color.new() 函数设为85%透明度的红色(color.red)。

接下来,我们调用 bgcolor() 函数并传入 backgroundColour 变量。这样,Pine Script就会在图表上应用一个透明的绿色或红色。

为TradingView策略的背景着色

当上述示例策略被添加到布伦特原油差价合约图表上时,效果如下:

添加到欧元/美元图表上时,该策略看起来是这样的:

该示例脚本的输入选项如下:

如果我们,例如,将“Price Data”输入改为“close”,并将EMA的周期设为7、20和80,那么前一个欧元/美元图表看起来是这样的:

总结

bgcolor() 函数为图表的背景着色,这既可以是主图表区域(当脚本叠加在交易品种上时),也可以是指标或策略显示的子图。背景颜色是通过该函数的 color 参数来设置的。要将着色的背景向左或向右移动,我们可以设置 bgcolor() 函数的 offset 参数为一个负值或正值。bgcolor() 的另外两个参数,titleeditable,则定义了着色的背景是否以及以什么名称显示在脚本的“样式”窗口中。

有条件地为背景着色或关闭背景色

在TradingView中,我们可以为图表背景着色,也可以填充背景的某个区域。但我们该如何有条件地为整个图表背景(从上到下)着色呢?

有条件地为TradingView背景着色

TradingView脚本使用的颜色可以手动设置,也可以通过代码来定义。通过代码,我们可以使用任意的十六进制颜色值以及标准的TradingView基础颜色。

当与 bgcolor() 函数一起使用时,任何这些颜色值都可以从上到下为图表的背景着色。该函数着色的区域既可以是主价格图表的背景(当脚本叠加在该数据系列上时),也可以是脚本数值显示的子图。

bgcolor() 的标准用法是为每一根K线的背景都填充上颜色。但该函数的 color 参数也接受一个可以有条件地设置颜色的表达式。这意味着我们可以构建一个布尔(真/假)条件(例如 close > open),并根据该条件的结果为图表背景赋予不同的颜色。例如,收盘价上涨的K线可以被赋予绿色背景,而收盘价下跌的K线则为红色背景。

除了在不同颜色之间进行选择,我们也可以有条件地开启或关闭背景着色。为此,我们使用内置变量 na,它代表一个非数字的值。这个值的特别之处在于,当背景颜色被设为 na 时,它会使背景呈现与图表本身相同的颜色,从而使其看起来不可见。因此,我们不仅可以根据K线的收盘情况将其背景涂成红色或绿色,还可以只为收盘上涨的K线上色,而在K线收盘下跌时使用 na 来关闭背景色。

注意

fill() 函数,它用于为图表背景的一个区域着色,不能接受条件性颜色值或 na 值。这意味着,如果我们想有条件地为图表背景着色,只能通过 bgcolor() 来实现。

下方的编程示例将演示 bgcolor() 的两种用法——有条件地从多种颜色中选择一种,以及有条件地关闭背景色。

使用代码有条件地为TradingView背景着色

在下方的示例指标中,我们重新创建了带有附加功能的标准随机指标。该脚本会根据随机指标K值是处于中性、超买还是超卖区域,将其背景分别着色为蓝色、红色或绿色。我们还可以通过一个输入选项来关闭中性区域的蓝色背景。在讨论完代码之后,我们将看看该指标及其输入选项在图表上的显示效果:

//@version=5
indicator(title="Stochastic conditional background colouring",
     shorttitle="Stoch colour", overlay=false)

// 输入选项
priceData   = input.source(close, title="Price Data")
stochLength = input.int(14, title="Length")
dLength     = input.int(3, title="D")
kSmooth     = input.int(3, title="K")
fillDefault = input.bool(true, title="Colour Neutral Stoch?")
obLevel     = input.int(80, title="Overbought")
osLevel     = input.int(20, title="Oversold")

// 计算数值
stochK = ta.sma(ta.stoch(priceData, high, low, stochLength), kSmooth)
stochD = ta.sma(stochK, dLength)

// 绘制数值
plot(stochK, title="K", color=color.blue)
plot(stochD, title="D", color=color.orange)
hline(obLevel, title="Overbought line", linestyle=hline.style_dotted, color=color.gray)
hline(osLevel, title="Oversold line", linestyle=hline.style_dotted, color=color.gray)

// 为背景着色
backgroundColour = if stochK > obLevel
    color.new(color.red, 85)
else if stochK < osLevel
    color.new(color.green, 85)
else if fillDefault
    color.new(#63B8FF, 85)

bgcolor(backgroundColour, title="Conditionally coloured background")

该示例以 indicator() 函数开始,这是每个指标都必需的。我们在这里设置了它的三个参数:titleshorttitle 用于指定指标名称,而将 overlay 设为 false 则使指标在子图中绘制,而不是叠加在主价格图表上。

然后,我们向脚本添加几个手动输入选项:

// 输入选项
priceData   = input.source(close, title="Price Data")
stochLength = input.int(14, title="Length")
dLength     = input.int(3, title="D")
kSmooth     = input.int(3, title="K")
fillDefault = input.bool(true, title="Colour Neutral Stoch?")
obLevel     = input.int(80, title="Overbought")
osLevel     = input.int(20, title="Oversold")

这些输入项会显示在脚本的设置窗口中(见下文图片),允许我们手动配置多个值。它们是通过各种输入函数创建的,这些函数同时也会返回输入的当前值。我们使用赋值运算符(=)将每个值存储在一个变量中,这样稍后就可以在脚本中通过该变量来使用输入的当前值。

我们首先使用 input.source() 函数创建了一个数据源输入类型。这种输入会创建一个下拉菜单,允许我们从脚本所应用的交易品种中选择多种价格K线数据,默认值为 close

接下来的三个输入(我们命名为“Length”、“D”和“K”)都是数值整数输入,通过 input.int() 创建,用于计算随机指标,默认值分别为14、3和3。

再下一个输入是通过 input.bool() 函数编码的布尔型(真/假)输入。我们将其命名为“Colour Neutral Stoch?”(为中性随机指标着色?),并将其默认值设为 true。我们稍后会使用其值来决定是否应该为中性区间的随机指标背景着色。

最后两个输入“Overbought”(超买)和“Oversold”(超卖)同样是数值整数输入,标准值为80和20。我们将使用它们对应的 obLevelosLevel 变量来判断随机指标K值是否处于超买或超卖状态,这会影响我们为背景赋予的颜色。

接下来,我们计算随机指标的值:

// 计算数值
stochK = ta.sma(ta.stoch(priceData, high, low, stochLength), kSmooth)
stochD = ta.sma(stochK, dLength)

随机指标K值是通过 ta.stoch() 函数计算的,该函数需要四个参数。然后,我们使用 ta.sma() 函数对 ta.stoch() 返回的值进行平滑处理,从而得到随机指标的K值,并将其存储在 stochK 变量中。

接着,我们再次使用 ta.sma() 函数来计算随机指标的D值,这次是作用于 stochK 值。

计算完毕后,是时候在图表上显示这些值了:

// 绘制数值
plot(stochK, title="K", color=color.blue)
plot(stochD, title="D", color=color.orange)
hline(obLevel, title="Overbought line", linestyle=hline.style_dotted, color=color.gray)
hline(osLevel, title="Oversold line", linestyle=hline.style_dotted, color=color.gray)

我们使用 plot() 函数在图表上显示两条随机指标线。第一个 plot() 调用显示 stochK 变量,我们将其命名为“K”,并设为蓝色。第二个 plot() 语句则显示 stochD 值,为橙色线,名为“D”。

然后,我们使用 hline() 函数绘制超买和超卖水平线。这两条线都以灰色虚线的形式显示。

接着,我们有条件地确定背景颜色:

backgroundColour = if stochK > obLevel
    color.new(color.red, 85)
else if stochK < osLevel
    color.new(color.green, 85)
else if fillDefault
    color.new(#63B8FF, 85)

这里,我们通过一个级联 if 语句为 backgroundColour 变量赋予三种颜色之一。

第一个 if 条件检查当前的K值(stochK)是否大于我们设置的超买水平(obLevel)。如果是,color.new() 函数会返回一个带有85%透明度的红色。该颜色值随后被存储在 backgroundColour 变量中。

如果该条件为 false,第二个 if 条件会运行,判断K值是否小于超卖水平(osLevel)。如果是,我们返回一个带有85%透明度的绿色。

如果该条件也为 false,那么第三个 if 条件会执行,判断 fillDefault 输入变量(即“Colour Neutral Stoch?”选项)是否为 true。如果是,color.new() 函数会返回一个带有85%透明度的钢蓝色。

如果所有三个条件都为 false,那么Pine Script会隐式地返回 na 值,其效果是关闭背景着色。

通俗地讲,我们首先检查K线是否在超买区,如果是,就将背景设为红色。如果不是,再检查是否在超卖区,如果是,则设为绿色。如果既不超买也不超卖,我们就检查“Colour Neutral Stoch?”这个输入选项。如果该复选框被勾选,那么对于中性区的随机指标值,背景色被设为钢蓝色;如果未被勾选,则不为中性区着色。

一旦背景颜色被确定,就该执行实际的背景着色了:

bgcolor(backgroundColour, title="Conditionally coloured background")

我们使用 bgcolor() 函数从上到下为图表的完整背景着色。其 color 参数被设为我们刚才有条件地赋值的 backgroundColour 变量。这样,我们选择的颜色就会显示在图表上。我们还通过 title 参数为其指定了一个描述性名称,该名称会显示在脚本的样式窗口中。

有条件地为TradingView图表背景着色(或不着色)

上述示例指标添加到欧元/美元图表上时,看起来是这样的:

添加到英镑/美元图表上时,我们的随机指标看起来如下:

该指标创建的输入选项及其默认值如下:

当我们禁用“Colour Neutral Stoch?”输入选项后,中性随机指标K值区间的背景就不再被涂成蓝色了。于是,前一张英镑/美元图表就变成了:

更改其他输入,例如将“Overbought”和“Oversold”选项的值设为90和10,图表会变为如下效果:

总结

bgcolor() 函数为图表的背景着色,这既可以是主图表区域(当脚本叠加在交易品种上时),也可以是脚本所在的子图。背景颜色是通过该函数的 color 参数来设置的,并且该参数接受条件性设置的颜色值。我们可以使用条件三元运算符(?:)级联if语句来有条件地设置颜色。除了有条件地选择一种颜色,我们还可以在特定条件发生时关闭背景。我们通过内置变量 na来实现这一点,它能使通过 bgcolor() 设置的背景变得不可见。

偏移着色的图表背景

在TradingView中,我们可以为图表背景着色,也可以有条件地应用背景色。但我们该如何将这些着色的背景向左或向右移动呢?

向左或向右移动TradingView的着色背景

我们的TradingView脚本可以使用的颜色既可以手动更改,也可以通过代码设置。通过代码,我们可以使用标准的TradingView基础颜色或十六进制颜色值。任何这些颜色值都可以通过 bgcolor() 函数来从上到下为图表背景着色。该函数既可以为图表主交易品种的背景着色,也可以为子图的背景着色,具体取决于调用 bgcolor() 的脚本显示在哪里。

默认情况下,bgcolor() 为当前K线的背景着色。但该函数还有一个 offset 参数,可以将着色的背景向左或向右移动指定的K线数量。该参数默认为0(不移动),正值会将背景向右移动,而负值则将着色的背景向左移动。

注意

offset 参数目前只接受字面量值(例如 offset=10)或输入变量的值。它不接受一个序列值,因此我们无法有条件地设置背景色的偏移(例如 offset=close > open ? 10 : 5)。

通过编程移动TradingView的着色背景

让我们通过一个示例指标来讨论,该指标绘制了成交量直方图及其EMA(指数移动平均线)。我们会根据当前成交量是高于还是低于其EMA,来将直方图的背景分别涂成红色或绿色。

通过一个输入选项,这个着色的背景可以被向左或向右移动。我们稍后会看该指标及其输入选项的截图,但首先是指标的代码:

//@version=5
indicator(title="Offsetting a coloured background",
     shorttitle="bgcolor() offset", precision=0)

// 输入选项
bgOffset = input.int(0, title="Background Offset", minval=-20, maxval=20)
maLength = input.int(20, title="EMA Length")
showEMA  = input.bool(true, title="Show EMA?")

// 计算EMA
emaVol = ta.ema(volume, maLength)

// 绘制数值
plot(volume, color=color.navy, style=plot.style_histogram, linewidth=3)
plot(showEMA ? emaVol : na, color=color.orange, linewidth=2)
hline(0, color=color.black, linestyle=hline.style_solid, linewidth=1)

// 为背景着色
backgroundColour = if volume > emaVol
    color.new(color.green, 85)
else
    color.new(color.red, 85)
bgcolor(backgroundColour, offset=bgOffset)

我们以 indicator() 函数开始,这是每个指标都必需的。通过其 title 参数,我们指定脚本在TradingView中的名称,通过 shorttitle,我们定义脚本在图表上显示的缩写名称。我们还将 precision 设为0,该参数影响脚本值的小数点后的位数,精度为0时会将大数值格式化为K(千)或M(百万)的形式。

然后,我们创建几个输入选项:

// 输入选项
bgOffset = input.int(0, title="Background Offset", minval=-20, maxval=20)
maLength = input.int(20, title="EMA Length")
showEMA  = input.bool(true, title="Show EMA?")

我们使用专门的Pine Script函数来创建这些输入。这些函数不仅在脚本设置中创建一个手动输入选项,还会返回该输入的当前值。这些值在这里通过赋值运算符(=)存储在变量中,这样我们稍后就可以在脚本中通过变量来检索输入的值。

我们使用 input.int() 函数创建第一个输入。这个整数输入的 title 参数被设为“Background Offset”。它的默认值为0,允许的值范围是-20到20,我们通过 minvalmaxval 参数来设定这个范围。该输入的当前值被存储在 bgOffset 变量中。

第二个输入也是一个通过 input.int() 创建的整数输入,名为“EMA Length”,默认值为20。我们将其当前值赋给 maLength 变量。

第三个也是最后一个输入是一个布尔型(真/假)输入,我们通过 input.bool() 函数创建。我们将这个输入命名为“Show EMA?”,并将其默认值设为 true。我们使用这个输入(其值存储在 showEMA 变量中)来开启或关闭EMA线的绘制。

接下来,我们计算EMA:

// 计算EMA
emaVol = ta.ema(volume, maLength)

这里的移动平均线是通过 ta.ema() 计算的,该函数需要两个参数:一个值的序列和一个以K线数量为单位的EMA周期。我们将第一个参数设为 volume 内置变量,它返回当前K线的成交量,而第二个参数则设为我们刚才默认设为20的 emaLength 输入变量。计算出的EMA值被赋给 emaVol 变量。

然后,我们在图表上显示脚本的数值:

// 绘制数值
plot(volume, color=color.navy, style=plot.style_histogram, linewidth=3)
plot(showEMA ? emaVol : na, color=color.orange, linewidth=2)

我们在这里使用 plot() 来显示成交量及其EMA。在第一个 plot() 语句中,我们将参数设为 volume 内置变量,并将其显示为一个海军蓝(color.navy)的直方图(plot.style_histogram)。

第二个 plot() 语句显示一条橙色(color.orange)的线条。我们使用条件运算符(?:)有条件地将其第一个参数设为 emaVolna 值。我们的条件是 showEMA 输入变量是否为 true。当“Show EMA?”输入选项被启用时,条件运算符返回 emaVol 变量,该值随后被 plot() 绘制出来。同样,当该输入被禁用时,plot() 函数的第一个参数被设为 na

na 这个内置变量持有一个非数字的值,在绘图的语境下,它会关闭绘图。我们利用 na 的这个特性来确保,当“Show EMA?”输入选项被禁用时,成交量的EMA不会显示在图表上。

在为图表背景着色之前,我们还绘制了一条水平线:

hline(0, color=color.black, linestyle=hline.style_solid, linewidth=1)

hline() 函数在由其第一个参数定义的价格水平上渲染一条水平线,我们在这里将其设为0。这条线在图表上显示为一条黑色的实线,并且尽可能细。这条水平线使得直方图柱看起来像是堆叠在它上面。

示例的最后一部分是为背景着色并进行偏移:

// 为背景着色
backgroundColour = if volume > emaVol
    color.new(color.green, 85)
else
    color.new(color.red, 85)
bgcolor(backgroundColour, offset=bgOffset)

这里我们首先确定要使用哪种背景颜色。为此,我们创建了 backgroundColour 变量,并使用一个 if/else 语句来设置它的值。if 条件评估K线的成交量(volume)是否高于其指数移动平均线(emaVol)。

如果是,我们返回一个由 color.new() 函数设为85%透明的绿色。否则,我们返回一个85%透明的红色。这个颜色值被存储在 backgroundColour 变量中。

最后,我们调用 bgcolor() 函数来执行实际的背景着色。我们将 backgroundColour 变量传递给它,使其使用我们刚才确定的颜色。

为了偏移这个红色/绿色的背景,我们将 bgcolor() 函数的 offset 参数设为 bgOffset 输入变量,我们之前已为其设置了0的默认值和-20到20的允许范围。

当该输入被设为正值时,我们着色的背景将向右移动;设为负值时则向左移动。通过这种方式,我们可以使用“Background Offset”输入变量来手动移动背景,而无需编辑脚本的代码。

示例:向左或向右重新定位TradingView背景

当我们将上述示例指标添加到纳斯达克100指数追踪基金的图表上时,效果如下:

在道琼斯工业平均指数追踪基金(DIA)的图表上,它看起来如下:

该脚本的输入选项如下:

当我们将这些设置中的“Background Offset”更改为7后,背景会向右移动,之前的DIA图表会变为:

而当我们将“Background Offset”输入设为-9(这会使背景向左移动)并禁用“Show EMA?”选项后,图表看起来是这样的:

总结

从上到下为图表背景着色是通过 bgcolor() 函数完成的。我们使用该函数的第一个参数来设置背景的颜色,而 offset 参数则用于移动背景。offset 参数默认为0(无偏移),正值会将背景向右移动(即移向未来的价格K线),负值则将背景向左偏移(移向过去的价格K线)。offset 参数可以通过输入变量或硬编码来设置,但不能被有条件地赋值。

赞(0)
未经允许不得转载:图道交易 » Pine Script(151):用bgcolor()为图表背景着色
分享到

评论 抢沙发

登录

找回密码

注册