外观
颜色
约 6397 字大约 21 分钟
简介
脚本视觉效果在MIne Script®编写的指标可用性中起着关键作用。精心设计的绘图和图形使指标更易于使用和理解。良好的视觉设计能建立视觉层次结构,让重要信息脱颖而出,次要信息不会造成干扰。
在MIne中使用颜色可以非常简单,也可以根据您的概念需求变得复杂。MIne Script提供的4,294,967,296种颜色和透明度组合可应用于:
- 指标可视空间内任何可绘制的元素,无论是线条、填充、文本还是蜡烛图
- 脚本可视空间的背景(无论脚本是在独立面板运行,还是在图表上以叠加模式运行)
- 图表上显示的柱状图或蜡烛图实体的颜色
脚本只能对其自身可视空间内的元素进行着色。此规则唯一的例外是:面板指标可以为图表柱状图或蜡烛图着色。
MIne Script内置了如color.green等颜色常量,以及color.rgb()等函数,允许您在RGBA色彩空间中动态生成任何颜色。
透明度
MIne Script中的每种颜色由四个值定义:
红色、绿色和蓝色分量(0-255),遵循RGB色彩模型
透明度(0-100),在MIne之外通常称为Alpha通道(根据RGBA色彩模型定义)。尽管透明度以0-100的范围表示,但在函数中使用时其值可以是"浮点数",这样您就可以访问Alpha通道的256个基础值
颜色的透明度决定了它的不透明程度:0表示完全不透明,100则使该颜色(无论是什么颜色)完全不可见。在更复杂的色彩视觉效果或使用背景时,调节透明度至关重要,它可以控制哪些颜色占主导地位,以及它们在叠加时如何混合。
Z轴索引(层级)
当您在脚本的可视空间中放置元素时,这些元素在z轴上具有相对深度;某些元素会显示在其他元素之上。z-index是一个代表元素在z轴上位置的值,具有最高z-index的元素将显示在最上层。
MIne Script中绘制的元素被分为若干组。每个组在z空间中都有其固定位置,而在同一组内,脚本逻辑中最后创建的元素会显示在该组其他元素之上。一个组的元素不能超出其所属组在z空间中的分配区域,因此例如绘图(plot)永远不可能显示在表格(table)之上,因为表格具有最高的z-index值。
以下列出各组可视化元素,按z-index递增顺序排列,因此背景颜色始终位于z空间最底层,而表格始终显示在所有其他元素之上:
- 背景颜色
- 填充区域
- 绘图
- 水平线
- 线条填充
- 线条
- 方框
- 标签
- 表格
请注意,通过在indicator()或strategy()中使用explicit_plot_zorder = true参数,您可以根据plot*()、hline()和fill()在脚本中的出现顺序来控制它们的相对z-index值。
常量颜色
MIne Script 内置了17种颜色。下表列出了它们的名称、对应的十六进制值以及作为 color.rgb() 参数的 RGB 值:
| 颜色名称 | 十六进制值 | RGB 值 (r,g,b) |
|---|---|---|
| color.aqua | #00BCD4 | color.rgb(0, 188, 212) |
| color.black | #363A45 | color.rgb(54, 58, 69) |
| color.blue | #2196F3 | color.rgb(33, 150, 243) |
| color.fuchsia | #E040FB | color.rgb(224, 64, 251) |
| color.gray | #787B86 | color.rgb(120, 123, 134) |
| color.green | #4CAF50 | color.rgb(76, 175, 80) |
| color.lime | #00E676 | color.rgb(0, 230, 118) |
| color.maroon | #880E4F | color.rgb(136, 14, 79) |
| color.navy | #311B92 | color.rgb(49, 27, 146) |
| color.olive | #808000 | color.rgb(128, 128, 0) |
| color.orange | #FF9800 | color.rgb(255, 152, 0) |
| color.purple | #9C27B0 | color.rgb(156, 39, 176) |
| color.red | #FF5252 | color.rgb(255, 82, 82) |
| color.silver | #B2B5BE | color.rgb(178, 181, 190) |
| color.teal | #00897B | color.rgb(0, 137, 123) |
| color.white | #FFFFFF | color.rgb(255, 255, 255) |
| color.yellow | #FFEB3B | color.rgb(255, 235, 59) |
在以下脚本中,所有绘图均使用相同的 color.olive 颜色(透明度为40),但以不同方式表示。以下五种方法在功能上是完全等效的:

Mine Script®
已复制
注意
最后两个plot()调用使用transp参数来指定透明度。这种做法应该避免,因为在MIne Script v5中transp参数已被弃用。使用transp参数定义透明度的方式不够灵活,因为它要求输入整数类型的参数,这意味着必须在脚本执行前确定该值,而无法在脚本逐根K线执行时动态计算。此外,如果您使用的color参数已经包含透明度信息(如下面三个plot()调用所示),那么为transp参数提供的任何值都将无效。这一原则同样适用于其他带有transp参数的函数。
先前脚本中的颜色在逐根K线执行时不会变化。然而,有时需要在脚本逐根K线执行时动态创建颜色,因为这些颜色取决于编译时或脚本在零号K线开始执行时未知的条件。针对这些情况,程序员有两种选择:
- 使用条件语句从少量预定义的基础颜色中选择颜色。
- 通过逐根K线执行时动态计算颜色来构建新颜色,例如实现颜色渐变效果。
条件着色
假设您希望根据自定义条件用不同颜色为移动平均线着色。为此,您可以使用条件语句为每种状态选择不同颜色。我们首先实现当均线上涨时显示为牛市颜色,否则显示为熊市颜色:

Mine Script®
已复制
请注意:
- 我们为脚本用户提供了一组可选颜色作为牛市/熊市颜色
- 我们定义了
maRising布尔变量,当当前K线的移动平均线高于上一根K线时值为true - 我们定义了
c_ma颜色变量,根据maRising布尔值从两个颜色中选择一个。这里使用了?:三元运算符编写条件语句
您还可以使用条件着色来避免在特定条件下绘图。例如,我们使用线条绘制高低点枢轴,但不想在新枢轴出现时绘制任何内容,以避免枢轴转换时出现连接线。为此,我们检测枢轴变化,并在检测到变化时使用na作为颜色值,这样就不会在该K线上绘制线条:

Mine Script®
已复制
要理解这段代码的工作原理,首先需要知道:当ta.pivothigh()和ta.pivotlow()函数像此处这样使用时(未给source参数传值),它们会在发现高/低枢轴点时返回值,否则返回na。
当我们使用nz()函数检测枢轴函数返回值是否为na时,只有当返回值不是na时,才会将该值赋给pHi或pLo变量;否则只是将变量的前值重新赋给它,这不会改变其实际值。请注意,由于我们在初始化pHi和pLo时使用了var关键字(这使得初始化仅在第一根K线执行),这些变量的前值会在K线间持续保留。
接下来要做的就是在绘制线条时,插入一个三元条件判断语句:当枢轴值变化时返回na作为颜色值;当枢轴水平未变化时,则返回脚本输入中选择的颜色。
计算颜色
使用color.new()、color.rgb()和color.from_gradient()等函数,可以在脚本逐根K线执行时动态构建颜色。
当需要从基础颜色生成不同透明度时,color.new()最为实用。
当需要根据红、绿、蓝或透明度分量动态构建颜色时,color.rgb()非常有用。color.rgb()用于创建颜色,而其配套函数color.r()、color.g()、color.b()和color.t()可用于从颜色中提取红、绿、蓝或透明度值,这些值又可用来生成变体。
color.from_gradient()适用于在两个基础颜色之间创建线性渐变。它通过将源值与最小值和最大值进行比较,确定使用哪种中间颜色。
color.new()
让我们使用color.new(color, transp)来为成交量柱创建不同的透明度,这里采用两个牛市/熊市基础颜色之一:

Mine Script®
已复制
请注意:
- 在脚本倒数第二行中,我们通过动态变化的基础颜色(根据K线涨跌)和透明度级别(根据成交量累积涨跌计算)来动态计算柱体颜色
- 我们不仅让脚本用户能控制使用的牛市/熊市基础颜色,还可调节亮度级别数量。该数值用于确定我们将跟踪的最大涨跌次数。用户可通过调整此值使指标视觉效果适应其使用的时间框架或市场
- 我们严格控制使用的最大透明度不超过80,这能确保颜色始终保持可见性
- 在输入参数中,我们将最小级别数设为1。当用户选择1时,成交量柱将仅显示最高亮度(零透明度)的牛市或熊市颜色
color.rgb()
在接下来的示例中,我们使用color.rgb(red, green, blue, transp)通过RGBA值构建颜色。我们将这个效果作为节日礼物送给朋友们:

Mine Script®
已复制
请注意:
- 我们为红、绿、蓝通道生成0到255范围内的值,透明度则在0到100范围内。由于math.random()返回浮点数值,0.0-100.0的浮点范围可以完整对应底层
alpha通道0-255的透明度值 - 我们使用math.random(min, max, seed)函数生成伪随机值。这里没有使用该函数的第三个参数:
seed(种子值)。当需要确保函数结果可重复时,使用种子值非常有用。使用相同种子值调用时,将产生相同的数值序列
color.from_gradient()
我们最后的颜色计算示例将使用color.from_gradient(value, bottom_value, top_value, bottom_color, top_color)。首先以最简单的形式使用它,为CCI信号着色,这个版本的指标在其他方面看起来与内置指标相似:

Mine Script®
已复制
请注意:
- color.from_gradient() 计算渐变时需要最小值和最大值作为参考边界。虽然CCI这类无边界信号(不像RSI固定在0-100之间)看似不适合,但我们仍可使用该函数。这里通过设置-200和200作为参数值来解决——虽然它们并非CCI的实际极值,但当序列超出这些边界时,直接应用
bottom_color和top_color的颜色效果也可接受。 - color.from_gradient() 的颜色过渡是线性的。当序列值处于
bottom_value和top_value中间点时,生成颜色的RGBA分量也恰为两种颜色的中间值。 - MIne Script内置了许多常见指标计算函数,此处直接使用ta.cci()而非手动计算。
color.from_gradient() 的value参数不必与所绘制线条的值直接相关。只要提供合理的bottom_value和top_value,任何数据都可作为渐变依据。本例通过计算CCI信号位于中心线上方/下方的K线数量,为带状区域着色来增强指标效果。

Mine Script®
已复制
请注意:
- 信号线采用与之前示例相同的基础颜色和渐变效果,但将默认线宽从1调整为2。作为视觉元素的核心组件,增加线宽可突出其重要性,避免用户被带状区域分散注意力——该区域在从原本的米色平面变为动态效果后已显得更为复杂。
- 填充色需保持低调的原因有二:首先作为视觉次要元素,它仅提供补充信息(即信号处于牛市/熊市区域的持续时间);其次由于填充层的
z-index高于绘图层,会覆盖信号线。因此我们将填充基础透明度设为70,并通过在color.from_gradient()调用中将bottom_color设为na,使渐变效果从完全透明开始,最终过渡到条件变量c_endColor包含的输入牛市/熊市颜色。 - 我们为用户提供独立的线色与带状区域颜色选择功能。
- 计算
gradientStep变量时,对ta.barssince()使用nz()函数处理,因为在数据集的早期K线中,当检测条件尚未发生时ta.barssince()会返回na。通过nz()函数,这些情况将返回零值。
混合透明度
在此示例中,我们将CCI指标引向另一个方向。我们将使用基于CCI计算的Donchian通道(历史高/低点)构建动态调整的极值区缓冲带。通过使顶/底带高度为DC的1/4来构建这些带状区域。我们将使用动态调整的回溯期来计算DC。为了调节回溯期,我们将通过计算短期ATR与长期ATR的比率来衡量波动性——当该比率高于其最近100个值中的50个时,我们认为波动性较高。当波动性高/低时,我们相应减少/增加回溯期。
我们的目标是为指标用户提供:
- 使用牛市/熊市渐变色着色的CCI线(如最近示例所示)
- Donchian通道的顶带和底带,其填充色随着历史高/低点时间推移逐渐加深
- 直观显示波动性测量状态,通过用颜色填充背景实现(颜色强度随波动性增加而增强)
以下是使用我们指标的视觉效果:

Mine Script®
已复制
请注意:
- 我们将背景透明度限制在100-75范围内以避免过度干扰,并使用中性颜色降低注意力分散。背景颜色越深,表示波动性越高。
- 带状填充的透明度值也被限制在60-90之间。设置90的起始值是为了当发现新高/新低且渐变重置时,颜色仍保持一定可见度。不低于60的限制则确保这些带状区域不会掩盖信号线。
- 我们使用非常实用的ta.percentrank()函数,将从ATR比率计算的波动性转换为0-100的值。这个函数对于将未知范围的值转换为可用于透明度生成的标准化数值特别有用。
- 由于脚本中需要进行三次数值限制处理,我们编写了
f_clamp()函数来替代重复编写相同逻辑。
使用技巧
保持自动颜色选择功能
在某些情况下,MIneScript能自动在"设置/样式"菜单中显示脚本所有绘图使用的颜色。这些绘图包括所有plot*()函数、barcolor()和bgcolor()创建的图形。用户可通过颜色选择器修改这些颜色,此功能无需额外代码即可实现脚本颜色的自定义。
例如,这个简单脚本根据K线收盘价与开盘价的关系,使用蓝绿色或红色绘制plot()。虽然脚本既未声明这些颜色应可编辑,也未创建任何颜色相关输入项,但MIneScript仍会自动在"设置/样式"菜单显示这些颜色,并允许用户修改颜色及绘图样式:

Mine Script®
已复制
提示
若需禁止用户通过「样式」选项卡修改绘图颜色或类型,只需在plot()调用中包含editable = false参数。
上述脚本中的颜色之所以能自动显示在“样式”菜单中,是因为它们在编译时就已经确定。编译时已知的颜色仅限于“const”(常量)或“input”(输入)类型。
但若脚本中存在任何一个“simple color”(简单颜色)或“series color”(序列颜色)类型的计算颜色,所有颜色都将在运行时计算,此时“样式”界面将不会显示任何颜色选择器。
实际应用中,“simple”或“series”颜色的产生通常源于使用color.new()和color.rgb()函数。这些函数返回的颜色限定符,取决于传入参数的最强限定符。如果每次调用这些函数时仅传入“const”(常量)或“input”(输入)类型的值,生成的颜色也将保持“const”(常量)或“input”(输入)类型,脚本就会在“样式”菜单中显示这些颜色。
注意
color.from_gradient() 函数始终返回“系列颜色”值,无论传入什么参数。如果在脚本中使用该函数,该脚本的所有颜色都将在运行时计算。
例如,我们尝试通过color.new()给颜色添加50的透明度,使上述脚本中的绘图呈现半透明效果。最简单的方法是用color.new()包裹plotColor变量,如下例所示:
Mine Script®
已复制
我们可以确保通过color.new()创建的每个计算颜色都是“常量颜色(const color)”。如下所示,我们分别用color.new()包装teal和red——在此过程中创建两个常量计算颜色——然后根据条件决定将哪个颜色赋值给plotColor。虽然plotColor变量是“系列颜色(series color)”,但由于每个color.new()调用返回的都是常量颜色,因此脚本仍会在“样式”选项卡中显示颜色选择器:
Mine Script®
已复制
要在运行时计算颜色,请为所有需要可编辑的颜色创建自定义颜色输入项。这种方法需要更多工作量,但能显著增强对用户可调整参数的控制力。更多关于创建颜色输入项的内容,请参阅输入参数页面。
设计可用的配色方案
若您编写的脚本供其他交易者使用,请避免在绘图、标签、表格或填充中使用可能在某些环境下表现不佳的颜色。至少应测试您的视觉效果,确保在TradingVue的浅色和深色主题下都能令人满意——这两种是最常用的主题。例如,应避免使用纯黑和纯白等颜色。
构建适当的输入参数,让脚本用户能灵活调整视觉效果以适应其特定环境。
注意建立与视觉组件重要性相匹配的颜色层级。优秀的设计师懂得如何平衡色彩与权重,使视线自然聚焦到最重要的设计元素上。当所有元素都突出时,反而没有重点。通过弱化周边元素的视觉效果,为核心元素留出突出空间。
在输入参数中提供配色预设选项(而非仅提供单一可调颜色),可帮助对配色不敏感的用户。
绘制清晰线条
为保持视觉清晰度,建议对重要线条使用零透明度绘制。这样能确保线条在填充区域上精确显示。请注意填充层的z-index高于绘图层,因此会覆盖在绘图上方。适当增加线条宽度也能显著提升其突出程度。
若需特别突出某条线,可通过多重绘制来增强视觉效果。以下是调整连续绘图的宽度和透明度来实现此效果的示例:

Mine Script®
已复制
自定义渐变效果
构建渐变时,需根据应用场景调整参数。例如,若为K线着色,通常最好将渐变阶数限制在10级以内——人眼对离散对象的强度变化感知有限。如我们的示例所示,应设置透明度上下限,既保证视觉元素始终可见,又避免产生不必要的视觉压迫感。