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

Pine Script(180):标签文本颜色、字体与工具提示

#Pine Script入门教学

用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_indexhigh确定)处绘制了一个标签。标签的背景颜色是黑色(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()idtextcolor关键字参数是可选的。在范例中包含它们,主要是为了清晰地展示函数需要哪些数据。一旦我们熟悉了函数用法,便可以省略它们,以减少代码输入。如果省略可选的关键字参数,调用方式如下:

// 将标签的文本颜色更改为带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()置于ifswitch语句中,以便只在满足特定条件时才去更新文本颜色。无条件地在每个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_indexhigh确定)处绘制了一个标签。它的颜色是黄色(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()idtext_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()置于ifswitch语句中,以便只在满足特定条件时才去更改字体。我们极少在每个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

这两个变量buyLabelsellLabel使用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_indexhigh确定)处绘制了一个标签。它的颜色是青柠色(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()idtooltip关键字参数是可选的。在范例中包含它们,主要是为了清晰地展示函数需要哪些数据。一旦我们熟悉了函数用法,便可以省略它们,以减少代码输入。如果省略可选的关键字参数,调用方式如下:

// 将标签的工具提示文本设置为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()的策略。一种是把它置于ifswitch语句中,实现条件性更新,即只在满足特定条件时才去修改工具提示。另一种策略是在每个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转义字符来手动换行。
  • 要移除标签的工具提示,只需把其文本内容设置为空字符串("")即可。
赞(0)
未经允许不得转载:图道交易 » Pine Script(180):标签文本颜色、字体与工具提示
分享到

评论 抢沙发

登录

找回密码

注册