用barcolor()更改价格K线的颜色
在TradingView Pine中,有多种处理颜色的方法,例如,通过编程为价格K线着色。我们该如何实现呢?
在TradingView中使用颜色:改变K线的颜色
当我们在TradingView Pine中以编程方式处理颜色时,我们可以使用一种标准的TradingView颜色,或一个能提供数百万种不同颜色值的十六进制颜色值。在脚本中使用了颜色后,我们还可以在脚本的样式窗口中手动配置颜色。
有几个TradingView函数拥有一个 color 参数,我们可以将其设为特定的颜色值。其中一个函数就是 barcolor(),它不仅能设置价格K线的颜色,还能基于特定条件来进行着色。
barcolor() 函数不返回任何值,其默认语法如下:
barcolor(color, offset, title, editable)
这四个参数分别代表以下含义:
| 参数 | 描述 |
|---|---|
color |
必需参数,用于将价格K线的颜色设为一种标准的TradingView颜色或一个十六进制颜色值。将此参数设为一个条件表达式(如 close > ema(close, 20) ? green : red)可以实现条件性地使用多种颜色之一为K线着色,而将其设为 na 则会关闭K线的颜色显示。 |
offset |
可选的整数参数,用于将着色的K线向左或向右移动指定的K线数量。该参数默认为0(不移动),正值会将着色的K线定位到右侧(即未来的K线),负值则将其向左移动(即过去的K线)。更多信息请参阅在TradingView中偏移K线颜色。 |
editable |
可选的布尔参数,定义了用户是否可以在脚本的样式窗口中手动编辑K线的颜色。该参数默认为true(允许手动更改),而设为false则禁止手动更改。 |
title |
可选的字符串参数,用于设置K线着色样式的名称。使用一个描述性的名称,在手动更改脚本颜色时,可以更容易地在脚本的样式窗口中识别出对应的着色样式。 |
barcolor() 函数还有两个额外的特性。首先,该函数总是为图表主交易品种的价格K线上色,即使执行 barcolor() 的脚本显示在一个单独的图表面板中。其次,着色后K线的外观取决于图表的类型设置;例如,在蜡烛图上,所有K线的实体都会被着色,而在空心蜡烛图上,则只有收盘价下跌的K线才会被填充。幸运的是,我们也可以使用 plotcandle() 和 plotbar() 来分别创建自定义颜色的蜡烛图和价格K线,这两个函数允许在单独的图表面板中绘图,并且其效果不受图表视觉样式的影响。
示例:在TradingView中为内包线和外包线上色
在下方的示例指标中,我们使用 barcolor() 函数为内包线和外包线上色。内包线(inside bar)是指其价格范围完全落在前一根K线交易范围内的K线,而外包线(outside bar)的范围则超出了前一根K线的范围。
我们还将使用一条EMA(指数移动平均线)来将趋势纳入考量。在讨论完代码之后,我们将看看该脚本在图表上的实际表现。但首先,是代码:
//@version=5
indicator(title="barcolor() example", overlay=true)
// 输入选项
emaLength = input.int(20, title="EMA Length")
// 计算并绘制EMA
emaValue = ta.ema(close, emaLength)
plot(emaValue, linewidth=2, color=close > emaValue ? #228B22 : #B22222)
// 确定K线着色的条件
insideBar = high < high[1] and low > low[1]
outsideBar = high > high[1] and low < low[1]
upTrend = close > emaValue and close[1] > emaValue[1]
downTrend = close < emaValue and close[1] < emaValue[1]
// 为价格K线着色
barColour = if upTrend and insideBar
color.green
else if upTrend and outsideBar
color.lime
else if downTrend and insideBar
color.maroon
else if downTrend and outsideBar
color.purple
barcolor(barColour)
我们首先使用 indicator() 函数,这是每个指标都必需的。通过将其 overlay 参数设为 true,脚本会显示在主价格图表上,而不是在单独的图表面板中。
然后,我们向脚本添加一个输入选项:
// 输入选项
emaLength = input.int(20, title="EMA Length")
input.int() 函数的作用是在脚本设置中创建一个整数输入项,它同时也会返回该输入的当前值。我们将这个输入命名为“EMA Length”,并将其默认值设为20。输入的值通过赋值运算符(=)存储在 emaLength 变量中。
接下来是移动平均线的计算和绘制:
// 计算并绘制EMA
emaValue = ta.ema(close, emaLength)
plot(emaValue, linewidth=2, color=close > emaValue ? #228B22 : #B22222)
这里 emaValue 变量被设为 ta.ema() 函数返回的值,该函数通过两个参数来计算EMA:一个用于计算的序列值和以K线数量为单位的均线周期。这里我们将这些参数设为 close(K线收盘价)和我们之前默认设为20的 emaLength 输入变量。
然后,我们通过将 plot() 函数的第一个参数设为 emaValue 变量,在图表上显示这条移动平均线。这些值被绘制成一条实线,这是 plot() 的默认绘图类型。通过将 linewidth 参数设为2,线条会比默认的粗一个级别。
plot() 函数的 color 参数通过条件运算符(?:)被有条件地设为两个值之一。该运算符需要三个值:首先是一个布尔(真/假)条件,然后是两个值。当条件为 true 时,返回第一个值;当条件为 false 时,则返回第二个值。
我们的条件是当前K线的收盘价(close)是否大于EMA (emaValue)。如果K线确实收盘于均线上方,条件运算符返回 #228B22,这是森林绿的十六进制颜色值。如果K线收盘于EMA或其下方,则返回 #B22222(火砖红的十六进制颜色值)。这样,我们 plot() 函数的 color 参数就被有条件地设为了这两种颜色之一。
在图表上显示了EMA之后,我们来确定为价格K线着色的条件:
// 确定K线着色的条件
insideBar = high < high[1] and low > low[1]
outsideBar = high > high[1] and low < low[1]
upTrend = close > emaValue and close[1] > emaValue[1]
downTrend = close < emaValue and close[1] < emaValue[1]
这四个变量中的每一个都通过 and 逻辑运算符连接两个布尔表达式,从而被赋予一个 true 或 false 的值。and 运算符只有在它所连接的两个表达式都为 true 时才返回 true,只要其中一个或两个为 false,它就返回 false。
这意味着 insideBar 变量只有在两个条件同时发生时才为 true:第一,当前K线的最高价必须小于前一根K线的最高价(我们通过 high[1] 获取);第二,当前K线的最低价必须大于前一根K线的最低价(low[1])。只有当这两个条件都满足时,insideBar 变量才为 true。对于所有不是内包线的K线,insideBar 将为 false。
同样地,第二个变量 outsideBar 也基于两个条件被赋值:当前K线的最高价是否高于前一根K线的最高价(high > high[1]),并且当前K线的最低价是否低于前一根K线的最低价(low < low[1])。当这两个条件都满足时,就出现了一个外包线,此时 outsideBar 被设为 true。只要有一个条件不满足,该变量就为 false。
接下来的两个布尔变量比较当前和前一根K线与EMA的关系。第一个,upTrend,当当前K线收盘于EMA之上(close > emaValue) 并且前一根K线也收盘于当时的EMA值之上时(close[1] > emaValue[1]),被设为 true。我们将这种连续收盘于均线上方的情况视为上升趋势,因此此时 upTrend 为 true(其他所有情况下为 false)。
downTrend 变量的值以同样的方式设定,只是这里我们检查当前K线是否收盘于EMA之下(close < emaValue) 并且前一根K线也是如此(close[1] < emaValue[1])。只有在这种情况下,我们的 downTrend 变量才被赋予 true 值。
在确定了不同的K线条件后,我们来决定具体为K线赋予哪种颜色:
// 为价格K线着色
barColour = if upTrend and insideBar
color.green
else if upTrend and outsideBar
color.lime
else if downTrend and insideBar
color.maroon
else if downTrend and outsideBar
color.purple
barColour 变量通过赋值运算符(=)被赋予五种不同值之一。具体存储哪个值,由一个级联 if 语句确定,它会评估由两个布尔变量通过 and 逻辑运算符组合而成的所有可能情况。
第一个 if 条件测试 upTrend 和 insideBar 是否都为 true。如果确实处于上升趋势且当前K线是内包线,那么该语句返回绿色(color.green),并存入 barColour 变量。如果这两个变量中有一个或两个为 false,Pine Script会继续执行第二个 if 条件。
那一个检查是否在上升趋势中出现了一个外包线(upTrend and outsideBar)。如果是,该 if 语句返回酸橙绿(color.lime)并存入 barColour 变量。但如果不是,则执行下一个 if 条件。
第三个条件评估当前K线是否是在下降趋势中出现的内包线(downTrend and insideBar)。如果该条件为 true,该 if 语句返回褐红色(color.maroon)并赋给 barColour。但如果该条件也为 false,我们的脚本会评估第四个 if 条件。
最后一个检查是否处于下降趋势,同时当前K线的范围超出了前一根K线(downTrend and outsideBar)。如果是,该 if 语句返回紫色(color.purple)并存入 barColour 变量。
现在可能会出现这四种情况都不满足的时候。此时,最后一个 if 语句会隐式地返回 na 值。该值代表一个非数字的值,当用于着色时,其效果是关闭颜色。这意味着,当没有条件为 true 时,我们的脚本实际上使用了一种在图表上没有效果的透明色。
在有条件地将 barColour 变量设为 green、lime、maroon、purple 或 na 之后,我们按如下方式使用它:
barcolor(barColour)
这里,我们通过将 barcolor() 函数的第一个参数设为我们的 barColour 变量,来为脚本当前正在处理的K线上色。该函数的其他未指定的可选参数(offset、editable 和 title)都将恢复为其默认值。
在TradingView中有条件地为内包线和外包线上色
当我们将上述示例脚本添加到S&P 500指数差价合约的图表上时,它看起来是这样的:
这里我们看到,指数移动平均线的颜色会在价格K线收于其上方或下方时变为绿色或红色。而内包线和外包线,则根据它们是收在移动平均线的上方还是下方,被着色为褐红色、紫色、绿色或酸橙绿。
在不同的时间周期和K线尺寸稍小的情况下,我们的脚本看起来如下:
该示例指标有一个输入选项,“EMA Length”:
总结
我们使用 barcolor() 函数以编程方式为价格K线上色。该函数有一个必需参数:color,它需要被设为一种标准的TradingView颜色或一个十六进制颜色值。这个 color 参数也接受一个条件表达式,因此我们可以有条件地使用多种颜色之一,同时也可以将其设为 na。在后一种情况下,价格K线会被赋予其原有的颜色,这实际上关闭了 barcolor() 的着色效果。该函数的可选参数包括 offset(将着色的K线向左或向右移动)、editable(允许手动更改着色K线的样式)以及 title(为着色样式设置一个名称,该名称会显示在脚本的样式窗口中)。
只为特定的K线着色
Pine Script的 barcolor() 函数的标准行为是为每一根价格K线都着色。这虽然很有用,但通常我们只想为特定的K线着色,以便能轻松地看出某种特定情况是在哪根K线上发生的。
幸运的是,barcolor() 也可以只为特定的K线上色。要实现这一点,我们需要做到两件事:首先,告诉函数对我们想高亮的K线使用哪种颜色;然后,告诉 barcolor() 对其他K线则关闭着色。这样,只有我们感兴趣的K线才会被着色。
后者,即禁用K线颜色,正是通过 na 值来实现的。当我们给 barcolor() 传递这个值时,它不会为K线上色,而是让K线保持原样。
因此,要为特定的K线着色,我们的脚本必须在两个选项之间做出选择:
- 一个我们想赋予K线的颜色。
- 或者,当我们不想为某一根K线上色时,使用
na值。
当脚本在每一根K线上都做出这个决定后,最终在图表上,所有我们感兴趣的K线都会被着上颜色。让我们看看如何用代码实现。
开启或关闭K线着色的方法
一个TradingView脚本可以通过两种方式来决定是否为某一根K线上色:
- 使用条件运算符(?:)。
- 使用 if语句。
让我们为每种方法都创建一个示例脚本。下面的第一个指标使用条件运算符来为特定的K线上色,第二个脚本则为此目的使用if语句。
使用 ?: 为特定的K线着色
所以,Pine Script的条件运算符(?:)可以用来为特定的K线着色。下方的指标首先计算并绘制一条简单移动平均线(SMA)。然后,条件运算符会判断哪些K线的整体都位于该均线上方,这些K线随后会被 barcolor() 涂成紫色。该脚本不会改变其他价格K线的颜色。
该指标的完整代码是:
//@version=5
indicator(title="Colour specific bars (with :?)", overlay=true)
// 计算40周期的SMA
smaValue = ta.sma(close, 40)
// 在图表上显示移动平均线
plot(series=smaValue, color=color.teal, linewidth=2, title="SMA")
// 将完全位于SMA上方的K线设为紫色
// (但不为其他K线着色)
barcolor(color=low > smaValue ? color.purple : na)
首先,我们使用Pine Script的 indicator() 函数来配置指标,为脚本命名并将其叠加在主图表的交易品种上。
然后,ta.sma() 函数计算一条简单移动平均线。该函数使用收盘价(close)和40根K线的周期。我们将均线的值存储在 smaValue 变量中供后续使用。
接下来,plot() 函数在图表上绘制这条移动平均线。因为我们没有设置绘图类型,Pine Script会创建一个常规的线图。这条线以青色(color.teal)显示,并且比默认的要粗(linewidth=2)。
然后,我们为价格K线上色:
// 将完全位于SMA上方的K线设为紫色
// (但不为其他K线着色)
barcolor(color=low > smaValue ? color.purple : na)
这里,barcolor() 函数根据一个条件来使用颜色。该条件由条件运算符(?:)进行评估,判断K线的最低价是否高于(>) 40周期的均线(smaValue)。
当整根K线都位于该均线上方时,条件运算符返回 color.purple 颜色给 barcolor()。否则,运算符返回 na 来关闭K线着色。
最终结果是,所有在简单移动平均线上方的K线都是紫色的,而其余K线则保持其原有的颜色:
使用 if 为特定的K线着色
另一种方法是使用 if 语句来为特定的K线着色。下面的指标使用一个 if 语句,将所有位于移动平均线下方的K线都涂成黄色,而其他价格K线则不着色。
该脚本的完整代码是:
//@version=5
indicator(title="Colour specific bars (with if/else)", overlay=true)
// 计算40周期的指数移动平均线
emaValue = ta.ema(close, 40)
// 在图表上显示移动平均线
plot(series=emaValue, color=color.orange, linewidth=2, title="EMA")
// 确定要使用的K线颜色。完全在均线
// 下方的K线是黄色的,其他则保持不变。
emaBarColour = if high < emaValue
color.yellow
// 将K线颜色应用到图表
barcolor(color=emaBarColour)
首先,我们用 indicator() 函数配置指标,为脚本命名并将其叠加在主图表的交易品种上。
然后,ta.ema() 函数计算指数移动平均线。该函数使用收盘价(close)和40根K线的周期。我们将计算出的值存储在 emaValue 变量中。
接下来,plot() 函数在图表上显示这条均线。由于我们没有设置绘图类型,Pine Script默认会创建一个常规的线图,该线以橙色(color.orange)显示。
然后我们确定K线的颜色:
// 确定要使用的K线颜色。完全在均线
// 下方的K线是黄色的,其他则保持不变。
emaBarColour = if high < emaValue
color.yellow
这个 if 语句测试K线的最高价(high)是否低于(<) 40周期的均线(emaValue)。如果是,if 语句返回 color.yellow 作为 emaBarColour 变量的值。
当 high 不低于均线时,该条件测试为 false。这使得 if 语句返回其默认的 na 值,该值随后被存储在 emaBarColour 变量中。
接下来,我们为价格K线上色:
// 将K线颜色应用到图表
barcolor(color=emaBarColour)
这里,barcolor() 函数将 emaBarColour 变量的值应用到图表的价格K线上。该变量的值要么是黄色,要么是 na(不为K线上色)。
在图表上,该脚本使所有完全位于均线下方的K线变为黄色。位于均线之上或穿过均线的K线则不被修改,并保持其原始颜色。效果如下:
总结
要为特定的K线着色,我们使用一个布尔(真/假)条件来指定哪些K线需要着色。
当条件为 true 时,我们为 barcolor() 提供一个颜色值;当条件为 false 时,我们则给函数传递 na 值,这会关闭该K线的着色功能。
要在颜色和 na 之间进行选择,我们可以使用条件运算符(?:) 或 if语句。
为价格K线应用多种不同颜色
Pine Script的barcolor()函数的标准行为是为每根价格K线都赋予相同的颜色。虽然这很有用,但有时我们希望为特定的K线赋予不同的颜色,以便能轻松地发现特定的市场情况和交易设置。
幸运的是,barcolor()可以为不同的场景使用多种颜色。对于我们想高亮的每一种情况,都需要定义两件事:
- 一个定义该情况何时发生的布尔(真/假)条件。
- 以及在该情况下为K线赋予哪种颜色。
因为一根价格K线只能有一种颜色,所以我们的代码必须决定在何时赋予K线何种颜色。
对于我们不想着色的K线,我们使用 na 值。被赋予这个特殊值的K线,其颜色显示将被关闭。这样,我们就只为我们感兴趣的那些K线上色。
选择颜色的三种方法
一个TradingView脚本可以通过三种方式在多种颜色之间进行选择:
- 级联if语句。
- Switch语句。
- 条件运算符(?:)。
让我们为每种方法都实现一个脚本,看看它们是如何工作的。开始吧!
级联if语句
可能最简单的方法就是使用级联 if 语句。下方的指标计算了两条指数移动平均线(EMA)。然后,一系列 if 条件会比较当前K线的收盘价与这些均线的关系。根据这些布尔比较的结果,我们为K线赋予四种可能的颜色之一。
该指标的完整代码是:
//@version=5
indicator(title="Multiple bar colours (with if/else)", overlay=true)
// 计算一条快线和一条慢线移动平均线
emaFast = ta.ema(close, 15)
emaSlow = ta.ema(close, 45)
// 在图表上绘制两条指数移动平均线
plot(series=emaFast, color=color.orange, title="Fast EMA")
plot(series=emaSlow, color=color.blue, title="Slow EMA")
// 通过比较收盘价与均线的关系来确定K线颜色
emaBarColour = if close > emaFast and close > emaSlow
color.lime
else if close < emaFast and close < emaSlow
color.red
else if close > emaFast
color.green
else if close < emaFast
color.maroon
// 将if/else选择的颜色应用到图表
barcolor(color=emaBarColour)
首先,指标调用 indicator() 函数,设置脚本名称并将其叠加在主图表的交易品种上。
然后,ta.ema() 函数计算两条移动平均线。它们都基于收盘价(close)计算,周期分别为15和45。我们将它们的值存储在 emaFast 和 emaSlow 变量中。
接下来,plot() 函数在图表上显示这两条均线。由于我们没有设置绘图类型,Pine Script会将它们绘制成常规的线图,颜色分别为橙色和蓝色。
然后,我们确定K线的颜色:
// 通过比较收盘价与均线的关系来确定K线颜色
emaBarColour = if close > emaFast and close > emaSlow
color.lime
else if close < emaFast and close < emaSlow
color.red
else if close > emaFast
color.green
else if close < emaFast
color.maroon
这段代码创建了 emaBarColour 变量。它的值取决于一个级联 if 语句。第一个满足的 true 条件将决定该变量获得哪个值。让我们逐一来看这些条件。
首先,我们判断K线的收盘价(close)是否同时高于(>)快线(emaFast) 和慢线(emaSlow)。如果两个条件都满足,if 代码块返回 color.lime(酸橙绿),Pine Script随后将该值存储在 emaBarColour 变量中。
如果K线没有收在两条均线之上,我们会继续判断下一个条件。它测试收盘价是否同时低于(<)快线和慢线。如果是,级联 if 语句返回 color.red。否则,我们继续到下一个条件。
那一个判断K线是否收在快线之上。如果是,if 代码返回 color.green。否则,Pine Script继续到最后一个 if 条件。
最后一个测试判断K线的收盘价是否低于快线。在这种情况下,级联 if 语句返回 color.maroon(褐红色)。
在测试完这些条件后,可能会出现所有条件都不为 true 的情况,例如当移动平均线和收盘价相等时。当一个级联if语句的所有条件都不满足,并且没有else分支时,Pine Script会隐式地返回na值。当na值用于K线着色时,它会关闭着色功能。
所以,在Pine Script处理完这个级联 if 语句后,emaBarColour 变量会持有以下值之一:color.lime、color.red、color.green、color.maroon 或 na。
现在,我们使用这个变量来为价格K线上色:
// 将if/else选择的颜色应用到图表
barcolor(color=emaBarColour)
这段代码调用 barcolor() 函数,并通过 emaBarColour 变量指定要赋予图表价格K线的颜色。
这会根据K线与移动平均线的关系,赋予K线不同的颜色。下图是它在图表上的样子:
Switch语句
从多种颜色中选择的另一种方法是使用 switch 语句。下面的脚本使用了两条加权移动平均线(WMA)。然后 switch 语句会检查K线的收盘价与均线的关系,并根据匹配的条件,为图表的K线赋予4种潜在颜色之一。
该指标的代码是:
//@version=5
indicator(title="Multiple bar colours (with switch)", overlay=true)
// 计算一条快线和一条慢线移动平均线
wmaFast = ta.wma(close, 10)
wmaSlow = ta.wma(close, 30)
// 在图表上以实线形式显示两条均线
plot(series=wmaFast, color=color.blue, title="Fast WMA")
plot(series=wmaSlow, color=color.fuchsia, title="Slow WMA")
// 确定当前K线要使用的颜色
wmaBarColour = switch
close > wmaFast and close > wmaSlow => color.lime
close < wmaFast and close < wmaSlow => color.red
close > wmaFast => color.green
close < wmaFast => color.maroon
// 将选定的颜色应用到价格K线
barcolor(color=wmaBarColour)
首先,我们用 indicator() 函数设置指标属性,为脚本命名并将其叠加在主图表上。
然后,ta.wma() 函数计算两条加权移动平均线(WMA),都基于收盘价计算,周期分别为10和30。我们将它们的值存入 wmaFast 和 wmaSlow 变量中供后续使用。
接下来,plot() 函数在图表上显示这两条均线,快线为蓝色,慢线为紫红色。
然后,我们确定要使用的K线颜色:
// 确定当前K线要使用的颜色
wmaBarColour = switch
close > wmaFast and close > wmaSlow => color.lime
close < wmaFast and close < wmaSlow => color.red
close > wmaFast => color.green
close < wmaFast => color.maroon
这段代码创建了 wmaBarColour 变量,其值由一个 switch 语句设置,该语句会测试最多四种不同的情况。
第一个条件判断K线的收盘价是否同时高于快线WMA (wmaFast) 和慢线WMA (wmaSlow)。如果是,该 switch 分支返回 color.lime。
第二个条件判断收盘价是否同时低于快线和慢线。如果是,该分支返回 color.red。
第三个条件测试K线是否收在快线之上,如果是,返回 color.green。
第四个也是最后一个条件判断K线是否收在快线之下,如果是,switch 语句返回 color.maroon。
这里有一种未被明确测试的可能性,即收盘价与均线完全相等。对于未包含的条件,switch 语句会返回 na 作为其隐式的默认值,这个值会关闭K线的着色。
既然我们有了一个包含K线颜色的变量,就可以将它应用到图表上了:
// 将选定的颜色应用到价格K线
barcolor(color=wmaBarColour)
这里 barcolor() 函数使用 wmaBarColour 变量进行着色,使图表上的价格K线显示为上面定义的四种颜色之一。
在图表上,基于移动平均线的不同颜色看起来是这样的:
条件运算符
选择K线颜色的第三种方法是使用条件运算符(?:)。下面的指标计算了两条简单移动平均线(SMA)。一系列条件运算符会比较当前K线的收盘价与这些均线,并根据评估结果为K线赋予四种可能的颜色之一。
该指标的代码如下:
//@version=5
indicator(title="Multiple bar colours (with ?:)", overlay=true)
// 计算一条快线和一条慢线移动平均线
smaFast = ta.sma(close, 15)
smaSlow = ta.sma(close, 45)
// 在图表上以线条形式绘制两条均线
plot(series=smaFast, color=color.teal, title="Fast SMA")
plot(series=smaSlow, color=color.orange, title="Slow SMA")
// 通过比较收盘价与均线来确定K线颜色
smaBarColour = close > smaFast and close > smaSlow ? color.lime :
close < smaFast and close < smaSlow ? color.red :
close > smaFast ? color.green :
close < smaFast ? color.maroon :
na
// 将选定的颜色应用到图表
barcolor(color=smaBarColour)
首先,indicator() 函数定义了指标的设置。
然后,ta.sma() 函数计算两条移动平均线,周期分别为15和45,都基于收盘价计算。
接下来,plot() 函数在图表上显示这两条均线,快线为青色,慢线为橙色。
然后,我们确定要使用的K线颜色:
// 通过比较收盘价与均线来确定K线颜色
smaBarColour = close > smaFast and close > smaSlow ? color.lime :
close < smaFast and close < smaSlow ? color.red :
close > smaFast ? color.green :
close < smaFast ? color.maroon :
na
这里我们创建了 smaBarColour 变量,其值由一系列条件运算符决定。让我们逐一分析它们。
第一个条件运算符测试当前收盘价(close)是否同时高于快线(smaFast) 和慢线(smaSlow)。如果是,该运算符返回 color.lime。
如果当前K线不高于两条均线,则执行下一个条件运算符。它判断收盘价是否同时低于快线和慢线,如果是,返回 color.red。
如果K线也不低于两条均线,Pine Script会评估下一个条件运算符。第三个判断收盘价是否高于快线,如果是,返回 color.green。
否则,第四个也是最后一个条件运算符会执行。它测试K线是否收在快线之下,如果是,返回 color.maroon。
如果最后一个条件也不为 true,那么所有测试过的条件都为 false。对于这个结果,最后的条件运算符返回 na 值,该值会关闭K线的着色。
在Pine Script处理完这一系列条件运算符后,smaBarColour 变量会持有以下值之一:color.lime、color.red、color.green、color.maroon 或 na。
现在,让我们将这些值应用到图表上:
// 将选定的颜色应用到图表
barcolor(color=smaBarColour)
这段代码调用 barcolor() 函数,并使用 smaBarColour 变量,根据两条移动平均线来为图表的价格K线上色。
下图是这四种可能的K线颜色在图表上的样子:
总结
一根价格K线只能有一种颜色,但我们可以为不同的K线使用不同的颜色。
有三种方法可以从多种颜色中选择一种:级联if语句、switch语句和条件运算符。
我们也可以选择为特定的K线使用 na 值,这会关闭该K线的颜色显示。










