用label.set_textcolor()设置TradingView标签的文本颜色
在Pine Script代码绘制出标签后,可以使用label.set_textcolor()函数来设置该标签的文本颜色。
每当一个标签包含文本时,这些文本都会以一种特定的颜色显示(默认是黑色,color.black)。通过label.set_textcolor(),我们可以自定义标签文本的颜色外观。
要实现颜色更改,label.set_textcolor()必须知道要修改的是哪个标签以及要使用哪种颜色。我们来看看它的工作原理。
函数语法格式
该函数的标准语法格式如下:
label.set_textcolor(id, textcolor)
id参数用于指定我们想要修改其文本颜色的标签的标识符。这个标识符告知Pine Script要访问哪个标签;没有它,Pine Script将无从知晓我们想要修改哪个标签。这个标识符由label.new()在创建标签时返回。如果我们(不小心)为该参数传入了na值(而非一个有效的标签标识符),函数将无法找到目标标签,因而不会更改任何标签的文本颜色。(但好在这种情况下函数并不会抛出错误。)
textcolor参数用于定义标签的新文本颜色。我们可以使用的颜色值类型包括标准颜色变量、十六进制颜色值、RGB颜色值,以及带透明度的颜色。
如果此参数为na值而非一个颜色值,Pine Script会隐藏标签的文本。这使得标签看起来就像没有文本一样。当我们把文本颜色重新设置回一个有效的颜色值(而不是na)时,标签的文本便会再次出现。
label.set_textcolor()本身不返回任何值可供我们使用或检查。我们看看如何使用这个函数。
快速示例
为了更改一个标签的文本颜色,我们首先需要一个标签。因此,我们先用label.new()创建一个:
// 在K线最高价处绘制一个标签以显示最新价格
myLabel = label.new(x=bar_index, y=high, text="Last price:\n" +
str.tostring(close), color=color.black)
这段代码在当前K线的最高价(由bar_index和high确定)处绘制了一个标签。标签的背景颜色是黑色(color.black)。它的文本内容由一个字符串字面量、一个换行符(\n)和当前K线的收盘价组成。由于收盘价是一个数值而非字符串,我们使用Pine Script的str.tostring()函数把它转换为文本。
我们把从label.new()获取的标识符存入myLabel变量,这使得后续可以访问该标签。
然后,我们使用label.set_textcolor()来更改标签的文本颜色:
// 将标签的文本颜色设置为白色
label.set_textcolor(id=myLabel, textcolor=color.white)
我们向label.set_textcolor()传递了两个参数。第一个myLabel是存有标签标识符的变量,它告诉函数要更改哪个标签的文本颜色。
另一个参数是一个颜色值,它指定了标签的新文本颜色。这里我们使用了白色(color.white)这个标准颜色变量。
图表示例
上述示例代码所创建的标签效果如下:

以下代码展示了如何把之前的两个代码片段整合为一个完整的Pine Script指标:
//@version=5
indicator(title="label.set_textcolor() 快速示例", overlay=true)
// 在图表的最后一根K线上,创建一个标签并更改其文本颜色
if barstate.islast
// 在K线最高价处绘制一个标签以显示最新价格
myLabel = label.new(x=bar_index, y=high, text="Last price:\n" +
str.tostring(close), color=color.black)
// 将标签的文本颜色设置为白色
label.set_textcolor(id=myLabel, textcolor=color.white)
首先,我们用indicator()函数来配置指标。title参数为脚本命名,而overlay使脚本叠加显示在主图表上。
接着,一个if语句会判断脚本是否正在处理最后一根价格K线(barstate.islast)。如果条件为真,Pine Script便会执行我们前面讨论过的代码:label.new()创建一个新标签,然后label.set_textcolor()更改该标签的文本颜色。
其他颜色选项
除了使用color.red这类标准的颜色变量,label.set_textcolor()还支持三种额外的颜色类型,提供了更丰富的色彩选择。
第一种是十六进制颜色值。这种颜色以#号开头,后跟6位或8位字符(例如#FDBCB4)。尽管看起来有些神秘,但它能精确定义海量的颜色。下面是label.set_textcolor()如何使用十六进制颜色的范例:
// 将标签的文本颜色更新为瓜红色
label.set_textcolor(id=myLabel, textcolor=#FDBCB4)
第二种是RGB颜色值。这种颜色通过组合红(R)、绿(G)、蓝(B)三种颜色分量来定义。在Pine Script中,我们使用color.rgb()函数来创建它。label.set_textcolor()使用RGB颜色的范例如下:
// 将标签的文本颜色更改为柔和的绿色
label.set_textcolor(id=myLabel, textcolor=color.rgb(119, 221, 119))
最后一种是透明色。我们可以通过color.new()函数为上述任何一种颜色(标准颜色、十六进制色、RGB色)添加透明度。该函数的透明度参数范围从100(完全透明,即不可见)到0(完全不透明)。label.set_textcolor()使用透明色的范例如下:
// 将标签的文本颜色更改为带20%透明度的红色
label.set_textcolor(id=myLabel, textcolor=color.new(color.red, 20))
// 将标签的文本颜色设置为带65%透明度的绿黄色
label.set_textcolor(id=myLabel, textcolor=color.new(#ADFF2F, 65))
关键字参数
label.set_textcolor()的id和textcolor关键字参数是可选的。在范例中包含它们,主要是为了清晰地展示函数需要哪些数据。一旦我们熟悉了函数用法,便可以省略它们,以减少代码输入。如果省略可选的关键字参数,调用方式如下:
// 将标签的文本颜色更改为带20%透明度的红色
label.set_textcolor(myLabel, color.new(color.red, 20))
// ^ ^ 省略了可选的 'id=' 和 'textcolor='
label.set_textcolor()的使用方式
label.set_textcolor()主要有两个用途。一是更改颜色,把标签的文本设置为不同的颜色。二是暂时隐藏文本,要实现此效果,可把文本颜色设置为na或一个100%完全透明的颜色。(注意:这只是视觉上隐藏。若要彻底移除文本内容,应使用label.set_text()把它设置为空字符串""。)
在脚本中,我们通常把label.set_textcolor()置于if或switch语句中,以便只在满足特定条件时才去更新文本颜色。无条件地在每个K线上都调用它并不常见,除非文本颜色需要非常频繁地动态变化。
如果只想进行一次性的颜色设置,在创建标签时直接通过label.new()的textcolor参数来完成会更方便。当然,如果需要根据条件动态地改变一个已存在标签的文本颜色,label.set_textcolor()仍然是不可或缺的。
脚本范例
我们通过一个完整的脚本来深入理解label.set_textcolor()的用法。下面的指标使用指数移动平均线(EMA)交叉来生成信号。
当均线交叉时,我们会创建一个绿色买入或红色卖出标签。因为新信号的出现意味着旧信号已过时,我们会使用label.set_textcolor()来改变这些旧信号的文本颜色。这样,只需扫一眼图表,就能立即区分出最新的有效信号和历史信号。
该指标的完整代码如下:
//@version=5
indicator(title="设置标签的文本颜色", overlay=true)
// 计算并绘制移动平均线
fastAverage = ta.ema(close, 10)
slowAverage = ta.ema(close, 50)
plot(fastAverage, color=color.orange, title="快速均线")
plot(slowAverage, color=color.fuchsia, title="慢速均线")
// 创建一个持久化的标签变量(以便我们能访问到上一个标签)
var label maSignalLabel = na
// 当均线交叉时,用买入或卖出标签进行标记
if ta.crossover(fastAverage, slowAverage)
maSignalLabel := label.new(bar_index, low, color=color.green,
textcolor=color.white, text="BUY", style=label.style_label_up)
if ta.crossunder(fastAverage, slowAverage)
maSignalLabel := label.new(bar_index, high, color=color.red,
textcolor=color.white, text="SELL")
// 当均线交叉时,将上一个标签的颜色“降级”
if ta.cross(fastAverage, slowAverage)
label.set_textcolor(maSignalLabel[1], color.black)
label.set_color(maSignalLabel[1], #F8F8FF)
脚本始于indicator()函数,用于命名和设置图表叠加。接着,ta.ema()计算出10周期和50周期的两条EMA,并由plot()函数把它们绘制在图表上。
然后,我们创建了一个持久化变量:
// 创建一个持久化的标签变量(以便我们能访问到上一个标签)
var label maSignalLabel = na
这个maSignalLabel变量使用var关键字声明,使其值可以在K线之间传递。我们用它来追踪最新信号标签的标识符,以便后续能通过历史引用操作符(如maSignalLabel[1])来访问上一个信号的标签。
接下来,我们根据均线交叉创建信号标签:
// 当均线交叉时,用买入或卖出标签进行标记
if ta.crossover(fastAverage, slowAverage)
maSignalLabel := label.new(bar_index, low, color=color.green,
textcolor=color.white, text="BUY", style=label.style_label_up)
当快速均线上穿慢速均线时,ta.crossover()触发,我们创建一个绿底白字的BUY标签,并把其标识符存入maSignalLabel。
if ta.crossunder(fastAverage, slowAverage)
maSignalLabel := label.new(bar_index, high, color=color.red,
textcolor=color.white, text="SELL")
同理,当发生下穿时,我们创建一个红底白字的SELL标签,其标识符同样会覆盖到maSignalLabel中。
最后,是本策略的核心,即处理旧标签:
// 当均线交叉时,将上一个标签的颜色“降级”
if ta.cross(fastAverage, slowAverage)
label.set_textcolor(maSignalLabel[1], color.black)
label.set_color(maSignalLabel[1], #F8F8FF)
这个if语句使用ta.cross()来检测任何方向的交叉。一旦交叉发生,就说明一个新的BUY或SELL标签刚刚在上面的代码块中被创建。此时,maSignalLabel[1]就指向了上一个(现在已过时)的信号标签。
我们随即执行两个操作:label.set_textcolor()把旧标签的文本颜色改为黑色,label.set_color()把旧标签的背景色改为幽灵白(#F8F8FF)。由于每次出现新信号时,我们都会对上一个信号的标签进行此番降级处理,最终所有历史信号的标签都会变成统一的黑字白底样式。
在图表上,最新的信号标签会以醒目的绿色或红色显示。而所有更早的、已过时的信号则以不显眼的黑字白底标签呈现,从而清晰地区分出历史信号与最新的交易机会:

label.set_textcolor()的特性与限制
- 无文本则无效:如果标签本身没有文本内容,调用
label.set_textcolor()不会产生任何视觉效果。必须先通过label.new()或label.set_text()为标签赋予文本。 - 颜色应用于全体文本:设置的颜色会应用到标签的全部文本,无法为部分文字设置不同颜色。
- 默认颜色:如果没有特别设置,标签文本默认为黑色(
color.black)。 - 不支持渐变色:不能为标签文本设置渐变色。
- 只写不读:Pine Script无法通过代码读取一个标签当前的文本颜色。要确保颜色状态,唯一的方法就是主动去设置它。
总结
label.set_textcolor()函数用于更改指定标签的文本颜色。- 函数需要两个参数:一个从
label.new()获取的标签标识符,以及一个新的颜色值。 - 颜色值可以是标准颜色变量、十六进制颜色或RGB颜色,并且都可以通过
color.new()为其添加透明度。
用label.set_text_font_family()更改TradingView标签的字体
在我们的Pine Script代码创建标签之后,可以使用label.set_text_font_family()函数来更改该标签文本所使用的字体族。
我们使用这个函数把标签的文本从默认字体切换到等宽字体(monospace),反之亦然。在等宽字体族中,每个字母和字符(包括空格)都占据相同的宽度。这样,我们便可以在标签文本中精确地对齐每一行。
要改变一个标签的字体族,label.set_text_font_family()需要两个信息。我们来看一下。
函数语法格式
该函数的标准语法格式如下:
label.set_text_font_family(id, text_font_family)
id参数用于指定我们想要更改其字体族的标签的标识符。Pine Script正是通过这个标识符来识别要修改哪个标签,没有它,Pine Script将无从知晓要访问哪个标签。我们在创建标签时,可以从label.new()获得这个标识符。如果我们(不小心)为该参数传入了na值,函数将无法识别图表上的任何标签,因而不会更改任何标签的字体族,但函数在这种情况下不会报错。
text_font_family参数通过一个常量值来指定标签的字体族。唯一允许使用的值包括:font.family_default(把标签设置为Trebuchet MS字体,这是标签默认使用的字体)和font.family_monospace(使标签使用等宽字体)。
label.set_text_font_family()本身不返回任何值可供我们使用或检查。我们看看如何使用这个函数。
快速示例
要更改一个标签的字体族,我们首先需要一个标签。因此,我们先用label.new()创建一个:
// 在K线最高价处创建一个黄色标签,告知K线的收盘价
myLabel = label.new(x=bar_index, y=high, color=color.yellow,
textcolor=color.black, text="Last price:\n\t" +
str.tostring(close) + "\t")
这段代码在当前K线的最高价(由bar_index和high确定)处绘制了一个标签。它的颜色是黄色(color.yellow),文字为黑色(color.black)。
标签文本包含字符串”Last price:”、一个换行符(\n)和一个制表符(\t)转义字符,以及当前K线的收盘价。由于收盘价是一个数值,而标签需要的是文本,我们使用str.tostring()函数把它转换为文本。
我们把label.new()返回的标识符存储在myLabel变量中,以便后续通过该变量来访问此标签。
接下来,我们调用label.set_text_font_family()来更改标签的字体族:
// 为该标签使用等宽字体
label.set_text_font_family(id=myLabel, text_font_family=font.family_monospace)
我们向该函数传递了两个参数。第一个myLabel是存有标签标识符的变量,它告诉函数要修改哪个标签。
另一个参数是我们期望的字体族。这里我们使用font.family_monospace值,这会使Pine Script把该标签的字体切换为等宽字体。
图表示例
上述快速示例所创建的标签,在图表上的效果如下:

以下代码展示了如何把上面的两个代码片段整合为一个完整的Pine Script指标:
//@version=5
indicator(title="label.set_text_font_family() 快速示例",
overlay=true)
// 在图表的最后一根已确认的历史K线上创建一个标签
if barstate.islastconfirmedhistory
// 在K线的最高价处创建一个黄色标签,告知K线的收盘价
myLabel = label.new(x=bar_index, y=high, color=color.yellow,
textcolor=color.black, text="Last price:\n\t" +
str.tostring(close) + "\t")
// 为该标签使用等宽字体
label.set_text_font_family(id=myLabel,
text_font_family=font.family_monospace)
我们首先调用indicator()函数来配置脚本。title参数为脚本命名,而overlay使脚本叠加显示在主图表上。
接着,一个if语句会检查barstate.islastconfirmedhistory变量。该变量仅在图表的最后一根已确认的历史K线上为true。当脚本运行到该K线时,if代码块内的代码便会执行。这段代码调用label.new()来创建标签,然后label.set_text_font_family()更改该标签的字体族。
关键字参数
label.set_text_font_family()的id和text_font_family关键字参数是可选的。在范例中包含它们,主要是为了清晰地展示函数需要哪些数据。一旦我们熟悉了函数用法,便可以省略它们,以减少代码输入。如果省略可选的关键字参数,调用方式如下:
// 为标签应用等宽字体
label.set_text_font_family(myLabel, font.family_monospace)
// ^ ^ 省略了可选的 'id=' 和
// 'text_font_family='
label.set_text_font_family()的使用方式
label.set_text_font_family()的唯一职责就是更改标签的字体族。如果标签已是目标字体,则函数不执行任何操作。需要注意的是,该函数无法移除标签的字体族,因为标签文本总是具有一种字体。
在脚本中,我们通常把label.set_text_font_family()置于if或switch语句中,以便只在满足特定条件时才去更改字体。我们极少在每个K线上都无条件地调用此函数,因为标签会记住其最后一次设置的字体,重复设置并无必要。
如果只想进行一次性的字体设置,在创建标签时直接通过label.new()的text_font_family参数来完成会更方便。当然,如果需要根据条件动态地改变一个已存在标签的字体,label.set_text_font_family()仍然是不可或缺的。
脚本范例
我们通过一个完整的脚本来深入理解label.set_text_font_family()的用法。下面的指标绘制了一条平滑处理后的加权移动平均线(WMA)。当价格穿越这条均线时,产生买入或卖出信号。
我们使用标签来高亮这些信号。本策略的核心逻辑是:通过改变字体和文本内容,来区分最新的交易信号和已过时的历史信号,从而使图表更整洁、主次更分明。
该指标的完整代码如下:
//@version=5
indicator(title="更改标签文本字体", overlay=true)
// 计算并绘制一条平滑的WMA
wmaValue = ta.wma(ta.wma(close, 20), 5)
plot(wmaValue, color=color.orange, linewidth=2, title="WMA")
// 创建持久化变量,用于后续追踪买卖标签
var label buyLabel = na
var label sellLabel = na
// 当价格上穿WMA时,创建一个买入信号标签
if ta.crossover(close, wmaValue)
labelText = "Buy\n- - -\nVolume\n" + str.tostring(volume, format.volume)
buyLabel := label.new(bar_index, high, color=color.teal,
textcolor=color.white, text_font_family=font.family_monospace,
text=labelText)
// 将上一个买入标签重置为只用默认字体显示“Buy”
label.set_text(buyLabel[1], "Buy")
label.set_text_font_family(buyLabel[1], font.family_default)
// 当价格下穿WMA时,绘制一个卖出信号标签
if ta.crossunder(close, wmaValue)
labelText = "Sell\n- - -\nVolume\n" + str.tostring(volume, format.volume)
sellLabel := label.new(bar_index, low, color=color.aqua,
textcolor=color.black, style=label.style_label_up,
text_font_family=font.family_monospace, text=labelText)
// 将上一个卖出标签切换为只用标准字体显示“Sell”
label.set_text(sellLabel[1], "Sell")
label.set_text_font_family(sellLabel[1], font.family_default)
脚本始于indicator()函数,用于命名和设置图表叠加。接着,ta.wma()进行了二次调用,计算出一条平滑的WMA线,并由plot()函数把它绘制在图表上。
然后,我们创建了两个持久化变量:
// 创建持久化变量,用于后续追踪买卖标签
var label buyLabel = na
var label sellLabel = na
这两个变量buyLabel和sellLabel使用var关键字声明,使其值可以在K线之间传递。我们用它们来分别追踪最新的买入和卖出标签标识符。
接下来,我们创建买入信号标签:
// 当价格上穿WMA时,创建一个买入信号标签
if ta.crossover(close, wmaValue)
// ... 创建标签的代码 ...
buyLabel := label.new(...)
// ... 重置上一个标签的代码 ...
label.set_text(buyLabel[1], "Buy")
label.set_text_font_family(buyLabel[1], font.family_default)
当ta.crossover()检测到上穿信号时,我们执行两组操作。第一组是创建新标签:首先,构建包含成交量信息的labelText。然后,label.new()创建一个新的买入标签,其文本使用等宽字体(font.family_monospace)以便清晰展示数据。新标签的标识符被存入buyLabel。
第二组是降级旧标签:我们立即对上一个买入信号进行处理。通过buyLabel[1]获取其标识符,然后调用label.set_text()把其文本简化为Buy,再调用label.set_text_font_family()把其字体改回默认字体(font.family_default)。
卖出信号的处理逻辑与此完全相同:
// 当价格下穿WMA时,绘制一个卖出信号标签
if ta.crossunder(close, wmaValue)
// ... 创建标签的代码 ...
sellLabel := label.new(...)
// ... 重置上一个标签的代码 ...
label.set_text(sellLabel[1], "Sell")
label.set_text_font_family(sellLabel[1], font.family_default)
当检测到下穿信号时,我们创建一个新的、使用等宽字体的卖出标签,并同时把上一个卖出标签的文本和字体进行简化和重置。
最终效果是,图表上最新的买入和卖出信号会以信息详尽的等宽字体标签呈现,而所有历史信号则以简洁的、使用默认字体的标签作为标记,主次分明:

label.set_text_font_family()的特性与限制
- 只写不读:Pine Script无法通过代码读取一个标签当前的字体族。我们只能设置它,无法查询它。要确保字体状态,唯一的方法就是主动去设置。
- 无文本则无效:如果标签本身没有文本内容,调用此函数不会产生任何视觉效果。必须先通过
label.new()或label.set_text()为标签赋予文本。 - 有效值:标签的字体族必须是
font.family_default(默认字体)或font.family_monospace(等宽字体)之一。使用任何其他值都会在脚本加载时导致invalid value for ‘text_font_family’ parameter的运行时错误。
总结
label.set_text_font_family()函数用于更改指定标签的文本字体族。- 它需要两个参数:一个从
label.new()获取的标签标识符,以及一个新的字体族。 - 可用的字体族选项只有两个:
font.family_monospace(等宽字体)和font.family_default(默认字体)。
用label.set_tooltip()设置TradingView标签的工具提示文本
在我们的Pine Script代码创建标签之后,可以使用label.set_tooltip()函数来设置该标签的工具提示文本。
标签的工具提示是一个额外的文本框,当我们把鼠标光标悬停在特定标签上时,它就会出现。它表现为一个位于标签上方的小型弹出窗口,窗口中显示的是我们代码所设置的文本。
为了完成其工作,label.set_tooltip()必须知道要修改哪个标签以及要使用什么工具提示文本。我们来看一下。
函数语法格式
该函数的标准语法格式如下:
label.set_tooltip(id, tooltip)
id参数用于定义我们想要设置或更改其工具提示的标签的标识符。Pine Script正是通过这个标识符来识别要修改哪个标签,没有它,Pine Script将无从知晓我们想要修改哪个标签。这个标识符由label.new()在创建标签时返回。如果我们(不小心)为该参数传入了na值,函数将无法识别目标标签,因而不会设置任何标签的工具提示。(但好在这种情况下函数并不会报错。)
tooltip是一个字符串(一段文本),用于指定要与标签一起使用的新工具提示文本。当此参数为一个空字符串("")或na值时,函数会移除标签当前的工具提示文本。工具提示的最大长度是4096个字符,如果提供的字符串更长,Pine Script会生成string is too long(字符串太长)的错误,导致我们的脚本无法工作。
该函数本身不返回任何值。我们看看如何使用label.set_tooltip()。
快速示例
要设置一个标签的工具提示文本,我们首先需要一个标签。因此,我们先调用label.new()创建一个:
// 在当前K线的最高价上方绘制一个新标签
myLabel = label.new(x=bar_index, y=high, color=color.lime,
size=size.large)
这段代码在当前K线的最高价(由bar_index和high确定)处绘制了一个标签。它的颜色是青柠色(color.lime),尺寸为大号(size.large)。我们没有给这个标签设置要显示的文本。
我们把label.new()返回的标识符存储在myLabel变量中。现在,这个变量提供了对该标签的访问权限。
接下来,我们让label.set_tooltip()来设置该标签的工具提示文本:
// 将标签的工具提示文本设置为当前K线的价格和成交量
label.set_tooltip(id=myLabel, tooltip="Close: " + str.tostring(close) +
"\nVolume: " + str.tostring(volume, format.volume))
我们向label.set_tooltip()传递了两个参数。第一个myLabel是存有标签标识符的变量,它告诉函数要修改哪个标签。
另一个参数是期望的工具提示文本。这个文本由多个字符串字面量(”Close: “、”Volume: “)通过+连接而成。其中还包含了换行符(\n)来格式化文本。并且我们还引入了两个变量。
这两个变量是收盘价(close)和成交量(volume)。然而,它们都是数值类型,这与label.set_tooltip()需要的文本格式不兼容。为了解决这个问题,我们使用Pine Script的str.tostring()函数把这些变量转换为字符串(一段文本)。
图表示例
上述快速示例所创建的标签效果如下。请注意,鼠标指针正悬停在标签上,这是让工具提示文本出现的必要条件:

以下代码展示了如何把上面的示例代码片段整合为一个完整的Pine Script指标:
//@version=5
indicator(title="label.set_tooltip() 快速示例", overlay=true)
// 在最后一根价格K线上,创建一个标签并设置其工具提示
if barstate.islast
// 在当前K线的最高价上方绘制一个新标签
myLabel = label.new(x=bar_index, y=high, color=color.lime,
size=size.large)
// 将标签的工具提示文本设置为当前K线的价格和成交量
label.set_tooltip(id=myLabel, tooltip="Close: " + str.tostring(close) +
"\nVolume: " + str.tostring(volume, format.volume))
我们从indicator()函数开始,它用title为脚本命名,并用overlay使脚本叠加显示在主图表上。
接着,一个if语句会判断脚本是否正在处理最后一根价格K线(barstate.islast)。如果条件为真,Pine Script便会执行我们前面讨论过的代码:label.new()创建一个新标签,然后label.set_tooltip()为该标签设置工具提示文本。
关键字参数
label.set_tooltip()的id和tooltip关键字参数是可选的。在范例中包含它们,主要是为了清晰地展示函数需要哪些数据。一旦我们熟悉了函数用法,便可以省略它们,以减少代码输入。如果省略可选的关键字参数,调用方式如下:
// 将标签的工具提示文本设置为K线的当前价格和成交量
label.set_tooltip(myLabel, "收盘价: " + str.tostring(close) +
// ^ ^ 省略了可选的 'id=' 和 'tooltip='
"\n成交量: " + str.tostring(volume, format.volume))
label.set_tooltip()的使用方式
label.set_tooltip()可以实现三个核心功能,即对工具提示的增、改、删:为原本没有工具提示的标签添加内容,用新文本覆盖已有的工具提示,以及通过传入一个空字符串("")来彻底移除标签的工具提示。
在脚本中,我们有两种调用label.set_tooltip()的策略。一种是把它置于if或switch语句中,实现条件性更新,即只在满足特定条件时才去修改工具提示。另一种策略是在每个K线上都调用它,实现持续性更新,这非常适合用来显示最新的价格或成交量等动态数据。
如果只想进行一次性的、不会再改变的静态提示设置,那么在创建标签时直接通过label.new()的tooltip参数来完成会更方便。
脚本范例
我们通过一个完整的TradingView脚本来深入了解label.set_tooltip()的用法。本指标结合了相对强弱指数(RSI)和随机指标%K来生成交易信号,并通过标签的鼠标提示来精确说明是哪个指标触发了该信号,从而提供更详尽的分析依据。
当RSI或随机指标上穿20时,视为买入信号;当任一指标下穿80时,视为卖出信号。label.set_tooltip()将被用来设置相应的提示文本。
该指标的完整代码如下:
//@version=5
indicator(title="设置标签工具提示", overlay=true)
// 计算RSI和随机指标%K
rsiValue = ta.rsi(close, 9)
stKValue = ta.sma(ta.stoch(close, high, low, 14), 3)
// 定义两个震荡指标的买卖信号
rsiBuySignal = ta.crossover(rsiValue, 20)
stchBuySignal = ta.crossover(stKValue, 20)
rsiSellSignal = ta.crossunder(rsiValue, 80)
stchSellSignal = ta.crossunder(stKValue, 80)
// 当买入信号发生时,用“BUY”标签注释图表
if rsiBuySignal or stchBuySignal
buyLabel = label.new(bar_index, high, text="BUY", color=color.green,
textcolor=color.white)
// 根据具体的触发信号设置“BUY”标签的工具提示
if rsiBuySignal
label.set_tooltip(buyLabel, "RSI 上穿 20")
else
label.set_tooltip(buyLabel, "随机指标 %K 上穿 20")
// 若卖出信号发生,则在图表上绘制“SELL”标签
else if rsiSellSignal or stchSellSignal
sellLabel = label.new(bar_index, low, style=label.style_label_up,
text="SELL", color=color.red, textcolor=color.white)
// 根据具体的触发信号设置“SELL”标签的工具提示
if rsiSellSignal
label.set_tooltip(sellLabel, "RSI 下穿 80")
else
label.set_tooltip(sellLabel, "随机指标 %K 下穿 80")
脚本始于indicator()函数,用于命名和设置图表叠加。接着,我们分别计算RSI和经过平滑处理的随机指标%K值。然后,我们使用ta.crossover()和ta.crossunder()函数来定义四个布尔型信号变量,分别代表RSI和随机指标的买入与卖出信号。
接下来,我们为买入信号创建标签:
// 当买入信号发生时,用“BUY”标签注释图表
if rsiBuySignal or stchBuySignal
buyLabel = label.new(...)
// ...
if rsiBuySignal
label.set_tooltip(buyLabel, "RSI 上穿 20")
else
label.set_tooltip(buyLabel, "随机指标 %K 上穿 20")
这个if语句检测任一买入信号是否为真。一旦满足条件,代码首先用label.new()创建一个绿色的BUY标签,并把其标识符存入buyLabel变量。然后,一个嵌套的if/else语句判断信号的具体来源:如果rsiBuySignal为真,则通过label.set_tooltip()把提示设为”RSI 上穿 20″;否则,就设为”随机指标 %K 上穿 20″。
卖出信号的处理逻辑与此完全相同:
// 若卖出信号发生,则在图表上绘制“SELL”标签
else if rsiSellSignal or stchSellSignal
sellLabel = label.new(...)
// ...
if rsiSellSignal
label.set_tooltip(sellLabel, "RSI 下穿 80")
else
label.set_tooltip(sellLabel, "随机指标 %K 下穿 80")
这个else if块检测卖出信号,创建红色的SELL标签,并根据具体的触发原因(RSI或随机指标)设置相应的工具提示文本。
我们看看图表上的标签和工具提示效果。当出现买入信号时,把鼠标悬停在绿色标签上,即可看到具体的触发原因:

同样地,把光标指向红色标签,也会显示其详细的卖出信号原因:

label.set_tooltip()的特性与限制
- 只写不读:Pine Script无法通过代码读取一个标签当前的工具提示文本内容。我们只能设置它,无法查询它。
- 长度限制:工具提示的最大长度为4,096个字符。超出此限制会导致String is too long的编译错误。
- 自动换行:当文本内容过宽时,TradingView会自动为工具提示进行换行。这意味着我们通常不必手动插入
\n换行符(但依然可以为了格式需要而使用)。 - 实时刷新:当工具提示窗口保持打开状态时,如果代码更新了提示内容,窗口中的文本会自动刷新,无需用户移开再悬停鼠标。
- 样式无法自定义:工具提示的字体、字号、背景色、文本颜色和对齐方式等所有视觉样式均由TradingView平台统一控制,无法通过Pine Script代码进行修改。
总结
label.set_tooltip()函数用于设置指定标签的工具提示文本。- 工具提示指的是当鼠标光标悬停在标签上时出现的文本弹窗。
- 该函数需要两个核心参数:一个从
label.new()获取的标签标识符,以及一个包含新提示内容的字符串。 - 我们可以在文本字符串中使用
\n转义字符来手动换行。 - 要移除标签的工具提示,只需把其文本内容设置为空字符串(
"")即可。


