概述:处理TradingView标签文本的Pine Script函数
当我们创建一个标签时,多数情况下我们会为该标签指定一段特定的文本。这能让标签显示关于价格、交易信号及脚本本身的附加信息。但我们该如何设置、更改或以其他方式调整标签的文本呢?
TradingView的指标和策略可以使用以下函数来处理标签文本:
| 函数 | 描述 |
|---|---|
label.set_text() |
设置或更改一个现有标签的文本。 |
label.get_text() |
从一个先前创建的标签中检索文本。 |
label.set_textalign() |
设置标签的文本对齐方式为左对齐、居中或右对齐。 |
label.set_textcolor() |
修改一个现有标签的文本颜色。 |
label.set_tooltip() |
设置或更改一个现有标签的工具提示文本。 |
顺带一提,Pine Script中还有一些函数可以改变标签本身的外观,这些函数也会间接改变标签文本的显示效果:label.set_size()会同时改变标签的尺寸和其字体大小;label.set_style()会修改标签的样式,并决定文本是在标签内部还是外部显示;而label.set_color()设置标签的背景颜色,这会影响其与标签文本颜色的对比度。
我们来快速了解一下这些与标签文本相关的函数是如何工作的。
设置标签文本:label.set_text()
label.set_text()函数用于设置一个标签的文本。该函数有多种用途:为没有文本的标签添加文本,把标签文本更改为其他内容,或者移除标签文本(通过把文本更新为空字符串)。
为了更改标签的文本,label.set_text()需要两个信息:一个用于指定要修改哪个标签的标识符,以及标签应该显示什么新文本。
这个标识符是在我们使用label.new()创建标签时获得的。因此,我们首先需要创建一个标签:
// 在K线收盘价处创建一个黑底白字的标签
myLabel = label.new(x=bar_index, y=close, color=color.black,
textcolor=color.white, style=label.style_label_left, size=size.large)
这里的label.new()在当前K线的收盘价处绘制了一个新标签。标签颜色为黑色,文字为白色。我们把函数返回的标识符存入myLabel变量,以便后续通过该变量来访问此标签。
然后,我们就可以使用label.set_text()来设置标签的文本:
// 更新标签的文本,使其包含当前的收盘价
label.set_text(id=myLabel, text="Last price: " + str.tostring(close))
这里的myLabel变量标识了需要修改的标签。该标签获得的新文本是字符串”Last price: “与当前K线的收盘价(close)通过+连接而成。由于收盘价是一个数值而非文本,我们使用str.tostring()函数把它转换为文本格式。
由label.set_text()设置文本后的标签效果如下所示:

顺便一提,label.set_text()不仅能为标签添加文本,也可以移除标签的文本。要实现这一点,我们只需把标签的文本更新为一个空字符串(""):
// 将标签的文本更改为空字符串(即移除标签内容)
label.set_text(id=myLabel, text="")
获取标签文本:label.get_text()
label.get_text()函数用于返回一个标签的文本。获取到文本后,我们可以对其进行操作、检查,或者把它用于其他的绘图对象。
在函数返回文本之前,它必须知道要访问哪个标签。为了告知label.get_text(),我们需要向它传递一个标签标识符。
这个标识符是label.new()在创建标签时返回的。所以我们首先要创建一个标签:
// 在K线最高价处绘制一个标签,并在标签内显示该K线的成交量
myLabel = label.new(x=bar_index, y=high, color=color.black,
textcolor=color.white, text="Volume: " + str.tostring(volume))
此处的label.new()在当前K线的最高价处创建了一个标签。标签背景为黑色,文字为白色。标签的文本内容为”Volume: “加上当前K线的成交量(volume)。由于成交量是一个数值,我们使用Pine Script的str.tostring()函数把它转换为文本。
我们把label.new()返回的标识符存入myLabel变量。现在,label.get_text()就可以使用这个变量来访问该标签了:
// 从标签中获取文本
labelText = label.get_text(id=myLabel)
这段代码会检索myLabel标签的文本,并把其字符串内容存入labelText变量。
需要注意的是,label.get_text()返回的是标签文本的一个副本。当我们修改这个返回的文本时,图表上的原始标签并不会改变——因为我们修改的是副本,而不是源数据。要更新图表上的标签,我们需要把修改后的文本通过label.set_text()重新设置回去。
设置标签文本对齐方式:label.set_textalign()
label.set_textalign()函数用于设置一个标签的文本对齐方式。该函数可以把标签的文本内容进行水平对齐,可设置为左对齐、居中对齐或右对齐。
要实现此更改,label.set_textalign()需要两个信息:一个用于指定要修改哪个标签的标识符,以及要使用的对齐方式。对于后者,我们可以从以下选项中选择:text.align_left(左对齐)、text.align_center(居中对齐)和text.align_right(右对齐)。
这三种对齐方式的效果如下所示:

从代码层面看,我们首先需要一个标签标识符。当我们使用label.new()创建一个新标签时,便会获得一个:
// 在当前K线的最高价处绘制一个新标签,以显示最新价格
myLabel = label.new(x=bar_index, y=high, color=color.yellow,
textcolor=color.black, text="Last\nprice:\n" + str.tostring(close))
此处的label.new()在当前K线的最高价处绘制了一个标签。它的背景为黄色,文字为黑色。标签文本包含”Last price:”、换行符\n以及当前K线的收盘价(close)。由于收盘价是一个数值,我们使用str.tostring()函数把它转换为文本。
我们把label.new()返回的标签标识符存入myLabel变量。现在,label.set_textalign()就可以使用这个标识符来更改标签的文本对齐方式了:
// 将标签的文本对齐方式修改为右对齐
label.set_textalign(id=myLabel, textalign=text.align_right)
这里的myLabel告知函数要修改哪个标签。该标签的新对齐方式为水平向右(text.align_right)。
这些代码片段所创建的标签效果如下:

设置标签文本颜色:label.set_textcolor()
label.set_textcolor()函数用于更改一个标签的文本颜色。该函数可以使用标准颜色变量、十六进制颜色值和RGB颜色值,以及通过color.new()函数创建的带透明度的颜色。
label.set_textcolor()需要知道两个信息:一个用于指定要修改哪个标签的标识符,以及要为该标签的文本使用什么颜色。
label.new()在绘制标签时会返回这样一个标识符。所以我们先来创建一个标签:
// 在K线的最高价处绘制一个标签以显示最新价格
myLabel = label.new(x=bar_index, y=high, text="Last price:\n" +
str.tostring(close), color=color.black)
此处的label.new()在当前K线的最高价处绘制了一个标签。其文本内容是”Last price:”与当前K线收盘价(close)的组合。由于收盘价是一个数值(而非文本),我们使用str.tostring()函数把它转换为文本。我们把label.new()返回的标识符存储在myLabel变量中。
然后,label.set_textcolor()便可使用该变量来更改标签的文本颜色:
// 将标签的文本颜色设置为白色
label.set_textcolor(id=myLabel, textcolor=color.white)
这里的myLabel告知函数要修改哪个标签的文本颜色。我们为该文本设置的颜色是白色(color.white)。
这个修改了文本颜色的标签在图表上的显示效果如下:

设置标签工具提示文本:label.set_tooltip()
label.set_tooltip()函数用于设置标签的工具提示文本。工具提示是指当我们把鼠标悬停在标签上时,出现的一个弹出式信息窗口。
在函数能够更改标签的工具提示之前,label.set_tooltip()需要两个信息:一个用于指定要修改哪个标签的标识符,以及一个指定新工具提示内容的字符串。
这样的标识符是label.new()在创建标签时返回的。所以我们先来创建一个标签:
// 在当前K线的最高价上方绘制一个新标签
myLabel = label.new(x=bar_index, y=high, color=color.lime,
size=size.large)
此处的label.new()在当前K线的最高价处绘制了一个标签。它以青柠色(color.lime)显示,并设置为大号尺寸(size.large)。我们把从函数获得的标识符存储在myLabel变量中。
然后,label.set_tooltip()便可使用该变量来设置标签的工具提示文本:
// 将标签的工具提示文本设置为当前K线的价格和成交量
label.set_tooltip(id=myLabel, tooltip="Close: " + str.tostring(close) +
"\nVolume: " + str.tostring(volume, format.volume))
这里的myLabel变量告知label.set_tooltip()要修改哪个标签。对于新的工具提示文本,我们使用+连接了几个字符串片段。其中有两个字符串字面量(”Close:”和”Volume:”)和两个变量(close和volume)。由于这些变量是数值,我们首先使用str.tostring()函数把它们转换为文本。
在图表上,这样一个工具提示的效果如下:

总结
Pine Script有五个用于处理标签文本的函数。
label.set_text()用于设置或更改标签的文本内容。label.get_text()用于检索标签的当前文本。label.set_textalign()用于更改标签文本的水平对齐方式。label.set_textcolor()用于修改标签的文本颜色。- 而
label.set_tooltip()用于设置标签的工具提示文本。
用label.set_text()设置TradingView标签的文本
在我们的Pine Script代码创建标签之后,可以使用label.set_text()函数来设置该标签的文本。
如果一个标签原先没有文本,label.set_text()会为它添加要显示的文本。而如果该标签已有文本,此函数则会覆盖掉原有的文本。
为了完成其工作,该函数必须知道要修改哪个标签以及要使用什么文本。我们来深入了解。
函数语法格式
该函数的标准语法格式如下:
label.set_text(id, text)
id参数用于定义我们想要修改其文本的标签的标识符。函数正是通过这个标识符来识别要访问哪个标签,没有标识符,Pine Script将无从知晓我们想要修改哪个标签。这个标识符由label.new()在创建标签时返回。如果我们(不小心)为该参数传入了na值,函数将无法识别目标标签,因而不会更改任何标签的文本,但好在这种情况下函数并不会抛出错误。
text是一个字符串(一段文本),包含标签的新文本内容。标签文本的最大长度是4096个字符,如果提供的字符串更长,Pine Script会触发string is too long(字符串太长)的错误。如果此参数为na值或一个空字符串(""),那么该函数会移除标签现有的文本,也就是说,它会清空标签的文本内容。
label.set_text()本身不返回任何值可供我们使用或检查。
快速示例
我们看看如何使用label.set_text()。在修改标签的文本之前,我们首先需要一个标签。因此,我们先来创建一个:
// 在右侧三根K线处创建一个黑底白字、指向左侧的标签。
myLabel = label.new(x=bar_index + 3, y=close, color=color.black,
textcolor=color.white, style=label.style_label_left, size=size.large)
此处的label.new()在距离当前K线右侧三根K线的位置(bar_index + 3),并以收盘价(close)为Y轴坐标,绘制了一个标签。标签的背景为黑色(color.black),文字为白色(color.white)。标签样式为指向左侧的箭头(label.style_label_left),尺寸也设置为大号(size.large)。
我们把label.new()返回的标识符存储在一个变量中,以便后续可以访问该标签。
接下来,我们使用label.set_text()来设置标签的文本:
// 更新标签的文本,使其包含当前的收盘价
label.set_text(id=myLabel, text="Last price: " + str.tostring(close))
我们向label.set_text()传递了两个参数。第一个参数myLabel是存有标签标识符的变量,它告诉函数要修改哪个标签。
另一个参数是一个字符串,它将成为标签的新文本。我们使用一个字符串字面量与当前K线的收盘价(close)通过+连接而成。
由于价格是一个数值,而label.set_text()需要的是字符串,我们使用Pine Script的str.tostring()函数把数值转换为文本字符串,使其符合label.set_text()的要求。
图表示例
上述快速示例所创建的标签效果如下:

以下代码展示了如何把上面的示例代码片段整合为一个完整的脚本:
//@version=5
indicator(title="label.set_text() 快速示例", overlay=true)
// 在图表的最后一根K线上,创建一个标签并设置其文本
if barstate.islast
// 在右侧三根K线处创建一个黑底白字、指向左侧的标签。
myLabel = label.new(x=bar_index + 3, y=close, color=color.black,
textcolor=color.white, style=label.style_label_left,
size=size.large)
// 更新标签的文本,使其包含当前的收盘价
label.set_text(id=myLabel, text="Last price: " + str.tostring(close))
首先,我们调用indicator()函数,它为脚本命名并使脚本叠加显示在主图表上。
接着,一个if语句判断脚本是否正在处理最后一根价格K线(barstate.islast)。如果条件为真,Pine Script便会执行我们前面讨论过的代码:label.new()创建一个新标签,然后label.set_text()为该标签设置文本。
关键字参数
label.set_text()的id和text关键字参数是可选的。我在范例中加入它们,主要是为了让代码意图更清晰。但我们完全可以省略它们,以减少代码输入量。如果省略可选的id和text关键字,label.set_text()的调用方式如下:
// 更新标签文本,以包含当前收盘价
label.set_text(myLabel, "最新价: " + str.tostring(close))
// ^ ^ 省略了可选的 'id=' 和 'text='
label.set_text()的使用方式
label.set_text()可以实现三个核心功能:为原本没有文本的标签添加内容,更改已有标签的文本,以及把标签的文本完全清空。
如果我们只想为标签设置一次性的、不会再改变的静态文本,那么在创建标签时直接通过label.new()来设置会更高效,代码也更简洁。
在脚本中,我们有两种调用label.set_text()的策略。一种是把它置于if或switch语句中,这样只会在满足特定条件时才执行,从而实现对标签文本的条件性更新。另一种策略是在每个K线上都调用该函数,不做任何条件过滤。这样可以实现对标签文本的实时更新,非常适合用来显示最新的价格或指标值。
与设置文本相对应,如果我们想获取标签的文本,应该使用label.get_text()函数。
脚本范例
我们通过一个完整的脚本来深入理解label.set_text()的用法。下面的指标绘制了资金流量指标(MFI)。当此震荡指标上穿80时,我们创建一个卖出信号标签;当其下穿20时,则绘制一个买入信号标签。
我们的主要关注点是最新的买卖信号。因此,当一个新信号出现时,我们会使用label.set_text()把上一个同类信号标签的文本移除。通过这种方式,图表上将只保留最新的Buy和Sell文本。
指标的完整代码如下:
//@version=5
indicator(title="更改标签文本")
// 计算并绘制资金流量指标(MFI)
mfiValue = ta.mfi(hlc3, 14)
plot(mfiValue, color=color.teal, title="资金流量指标")
hline(80, title="超买区")
hline(20, title="超卖区")
// 创建持久化标签变量 (用于访问历史标签)
var label mfiBuyLabel = na
var label mfiSellLabel = na
// 当MFI上穿80时,创建卖出标签
if ta.crossover(mfiValue, 80)
mfiSellLabel := label.new(bar_index, mfiValue,
color=#FDBCB4, text="Sell")
// 移除上一个卖出信号的文本
label.set_text(mfiSellLabel[1], "")
// 当MFI下穿20时,创建买入标签
if ta.crossunder(mfiValue, 20)
mfiBuyLabel := label.new(bar_index, mfiValue,
style=label.style_label_up, color=#D0F0C0, text="Buy")
// 移除上一个买入信号的文本
label.set_text(mfiBuyLabel[1], "")
脚本始于indicator()函数,它通过title为脚本命名。接着,ta.mfi()函数用14周期的hlc3(高、低、收盘价的平均值)数据计算出资金流量指标。plot()函数把MFI以青色线图的形式绘制在副图上,而hline()函数则在80和20价位绘制了水平线,分别代表超买和超卖区域。
接下来,我们使用var关键字创建了两个持久化变量:
// 创建持久化标签变量 (用于访问历史标签)
var label mfiBuyLabel = na
var label mfiSellLabel = na
这两个变量mfiBuyLabel和mfiSellLabel将用于存储标签的标识符。之所以把它们声明为var类型,是因为var变量的值会在每个K线上持续存在,除非被重新赋值。这种特性使得我们可以通过历史引用操作符[1](例如mfiBuyLabel[1])来方便地获取上一个买入或卖出信号所创建的标签标识符。
在if语句之前声明这些变量,是为了确保Pine Script能够在时间序列中正确地追踪和存储它们的值。
然后,我们创建第一个基于MFI的信号标签:
// 当MFI上穿80时,创建卖出标签
if ta.crossover(mfiValue, 80)
mfiSellLabel := label.new(bar_index, mfiValue,
color=#FDBCB4, text="Sell")
// 移除上一个卖出信号的文本
label.set_text(mfiSellLabel[1], "")
这个if语句使用ta.crossover()函数检测MFI值是否上穿了80。一旦条件满足,代码首先会用label.new()创建一个新标签。该标签被放置在当前K线的MFI值所在的位置(bar_index、mfiValue),背景色为瓜红色(#FDBCB4),文本内容为Sell。
我们希望这个卖出信号文字只在最新的标签上显示。因此,紧接着调用label.set_text()来清除上一个标签的文本。它的第一个参数mfiSellLabel[1],正是获取上一个卖出标签标识符的关键。
它的工作原理是:mfiSellLabel是一个var变量,它的值会延续到下一个K线。所以当一个新的卖出信号出现时,当前K线的mfiSellLabel被赋予了新标签的标识符,而mfiSellLabel[1]则自然地引用到了上一个信号周期的值,也就是上一个卖出标签的标识符。
label.set_text()的第二个参数是一个空字符串(""),它的作用就是把目标标签的文本清空。由于每次创建新标签时我们都会清除上一个标签的文本,最终的效果就是所有历史的Sell标签都会变成空白。
接着,我们用同样的方式来处理MFI的买入信号:
// 当MFI下穿20时,创建买入标签
if ta.crossunder(mfiValue, 20)
mfiBuyLabel := label.new(bar_index, mfiValue,
style=label.style_label_up, color=#D0F0C0, text="Buy")
// 移除上一个买入信号的文本
label.set_text(mfiBuyLabel[1], "")
这个if语句使用ta.crossunder()检测MFI是否下穿了20。如果条件成立,脚本会执行两个操作。首先,label.new()创建一个向上的(label.style_label_up)、茶绿色(#D0F0C0)的标签,文本为Buy。然后,label.set_text()同样使用mfiBuyLabel[1]来定位上一个买入标签,并用空字符串把其文本清除。这样就确保了只有最新的买入信号标签会显示Buy字样。
最终图表上,只有最近的买入和卖出信号会显示Buy和Sell文本。所有更早的信号标签都将是空白的,仅作为历史标记存在:

label.set_text()的特性与限制
- 手动换行:Pine Script的标签文本不会自动换行。如果需要多行显示,我们必须在文本字符串中手动插入换行符
\n。 - 长度限制:标签文本的最大长度为4,096个字符。虽然在某些特殊情况下可能允许更长的字符串,但这并非可靠特性。为避免脚本出现string is too long的错误,最好把文本长度控制在此限制之内。
- 字体控制:我们无法通过代码控制标签的字体族、字重(如粗体)或样式(如斜体),这些均由TradingView平台统一设定。不过,我们可以通过
label.set_size()来改变标签的整体尺寸,文字大小会随之按比例缩放。
总结
label.set_text()函数用于设置指定标签的文本内容。- 它需要两个核心参数:一个用于定位标签的标识符(从
label.new()获取),以及作为新内容的文本字符串。 - 标签文本最大长度为4,096字符,可使用
\n进行换行。 - 要移除标签的文本,只需把其文本设置为空字符串(
"")即可。
用label.get_text()获取TradingView标签的文本
在我们的Pine Script代码绘制出标签后,可以使用label.get_text()函数来返回该标签的文本。
通过这个函数,我们的代码可以读取特定标签中显示的内容。然后我们就可以处理这段文本,比如更改其内容、添加或移除部分文字,以及检查标签文本的具体内容。当我们修改了文本后,通常也希望把标签的文本更新为新的内容。
在label.get_text()返回标签的文本之前,它必须知道要从哪个标签获取文本。我们来深入了解。
函数语法格式
该函数的标准语法格式如下:
label.get_text(id)
id参数用于指定我们想要检索其文本的标签的标识符。这个标识符告知Pine Script要访问哪个标签;没有它,Pine Script将无从知晓我们指的是哪个标签。这个标识符由label.new()在创建标签时返回。如果我们(不小心)为该参数传入了na值,label.get_text()将无法识别目标标签,因而不会返回任何标签的文本,但好在这种情况下函数并不会抛出错误。
label.get_text()会返回以下两种可能的值之一:
- 一个字符串(一段文本),它是指定标签文本的一个副本。
- 或者,在以下情况下,函数会返回一个空字符串(
""):标签本身没有文本(即内容为空),或函数收到的id参数是一个na值,而非一个有效的标签标识符。
快速示例
在获取标签的文本之前,我们首先需要一个可供操作的标签。因此,我们先用label.new()创建一个:
// 在K线最高价处绘制一个标签,并在标签内显示该K线的成交量
myLabel = label.new(x=bar_index, y=high, color=color.black,
textcolor=color.white, text="Volume: " + str.tostring(volume))
这段代码在当前K线的最高价(由bar_index和high确定)处绘制了一个标签。它的颜色是黑色(color.black),文字为白色(color.white)。标签的文本内容由字符串字面量(”Volume: “)和当前K线的成交量(volume)连接而成。
因为volume变量返回的是一个数值,而标签需要的是文本,所以我们使用Pine Script的str.tostring()函数把数值转换为字符串。
我们把label.new()返回的标识符存入myLabel变量,以便后续通过该变量来访问此标签。
然后,我们来检索该标签的文本:
// 从标签中获取文本
labelText = label.get_text(id=myLabel)
我们向label.get_text()传递了一个参数,即存有标签标识符的myLabel变量。这会告知函数要从哪个标签检索文本。
我们把label.get_text()返回的文本存储在labelText变量中。
现在,我们就可以使用这段文本了,比如把它显示在另一个标签中:
// 创建另一个标签,用于显示前面那个标签的文本
label.new(x=bar_index[10], y=high[10], color=color.silver,
text=labelText)
这里的label.new()创建了另一个标签。这个标签显示在10根K线前的最高价处(bar_index[10]、high[10])。它的背景颜色是银色(color.silver)。
该标签的文本内容就是labelText变量的值,它持有我们通过label.get_text()从第一个标签获取的内容。
请注意,我们没有把这次label.new()调用返回的标签标识符存储在变量中。原因何在?因为在Pine Script创建这个标签后,我们不打算再对它进行任何操作,所以也就没有必要保存它的标识符了。
图表示例
这两个标签在图表上的效果如下:

以下代码展示了如何把这些代码片段整合为一个完整的TradingView脚本:
//@version=5
indicator(title="label.get_text() 快速示例", overlay=true)
// 在最后一根K线上,创建一个标签,获取其文本,再创建另一个标签
if barstate.islast
// 在K线最高价处创建一个标签,显示该K线的成交量
myLabel = label.new(x=bar_index, y=high, color=color.black,
textcolor=color.white, text="Volume: " + str.tostring(volume))
// 从标签中获取文本
labelText = label.get_text(id=myLabel)
// 创建另一个标签,用于显示前面那个标签的文本
label.new(x=bar_index[10], y=high[10], color=color.silver,
text=labelText)
首先,我们调用indicator()函数来配置脚本,它为脚本命名并使脚本叠加显示在主图表上。
接着,一个if语句判断脚本是否正在处理最后一根价格K线(barstate.islast)。如果条件为真,脚本便会执行我们前面讨论过的代码:首先label.new()创建一个标签,然后label.get_text()检索该标签的文本,最后label.new()再创建另一个标签(其文本内容来自第一个标签)。
关键字参数
label.get_text()的id关键字参数是可选的。我在范例中使用了它,主要是为了让代码的意图更清晰。一旦我们熟悉了该函数,便可以省略它,以减少代码输入。如果省略可选的关键字参数,label.get_text()的调用方式如下:
// 从标签中获取文本
labelText = label.get_text(myLabel)
// ^ 省略了可选的 'id='
label.get_text()的使用方式
label.get_text()用于检索一个标签的文本。根据标签内容,它会返回一段文本或一个空字符串。
获取到文本后,我们便可以对其进行多种处理。我们可以使用字符串函数来替换部分文本、把它转换为大写或小写、添加新内容,或是删除部分内容。
在脚本中,我们有两种调用label.get_text()的策略。一种是把它置于if或switch语句中,实现按需获取,即只在满足特定条件时才读取标签文本。另一种策略是在每个K线上都调用它。在没有任何条件过滤的情况下,脚本会持续追踪标签的文本内容,这使我们能在每个K线上都对其进行操作。
一个核心概念是:label.get_text()返回的是标签内容的一个副本,而非引用。这意味着,我们可以随意修改返回的字符串,而不会影响到原始标签。如果想更新标签上显示的文本,我们必须使用label.set_text()函数,或者用修改后的文本创建一个全新的标签。
脚本范例
我们通过一个完整的TradingView脚本来深入了解label.get_text()的用法。下面的指标绘制了SuperTrend指标。当这个趋势跟踪指标产生买入或卖出信号时,我们会在图表上放置一个标签。
当新信号出现时,我们还会用label.get_text()来获取上一个信号标签的文本。我们会对这个文本进行修改,然后更新旧标签。这样做的目的是让历史信号在图表上显示的文本与最新的买卖信号有所区别。
指标的完整代码如下:
//@version=5
indicator(title="获取标签文本", overlay=true)
// 获取10周期、3.0 ATR乘数的SuperTrend值及其方向
[superTrend, stDirection] = ta.supertrend(3.0, 10)
// 绘制SuperTrend线
plot(stDirection < 0 ? superTrend : na, color=color.green,
style=plot.style_linebr, linewidth=2, title="上升趋势")
plot(stDirection > 0 ? superTrend : na, color=color.red,
style=plot.style_linebr, linewidth=2, title="下降趋势")
// 创建一个持久化的标签变量(以便我们能访问到历史标签)
var label supTrndLabel = na
// 当出现SuperTrend买卖信号时,创建相应的标签
if stDirection < 0 and stDirection[1] > 0
supTrndLabel := label.new(bar_index, superTrend, color=color.green,
textcolor=color.white, style=label.style_label_up, text="BUY\nSIGNAL")
else if stDirection > 0 and stDirection[1] < 0
supTrndLabel := label.new(bar_index, superTrend, color=color.red,
textcolor=color.white, text="SELL\nSIGNAL")
// 当SuperTrend方向穿越零轴时,即买卖信号发生时,
// 我们修改“已过时”的旧标签的文本。
if ta.cross(stDirection, 0)
// 1. 获取上一个标签的文本
prvLabelText = label.get_text(supTrndLabel[1])
// 2. 移除'SIGNAL'字样并将剩余部分转为小写
prvLabelText := str.replace(prvLabelText, "\nSIGNAL", "")
prvLabelText := str.lower(prvLabelText)
// 3. 最后,用处理过的新文本更新上一个标签
label.set_text(supTrndLabel[1], prvLabelText)
脚本始于indicator()函数,它通过title为脚本命名,并通过overlay使脚本叠加到主图表上。
接着,ta.supertrend()函数计算SuperTrend的值。我们把趋势线的值存入superTrend变量,把方向(1代表下降,-1代表上升)存入stDirection变量。
plot()函数负责绘制SuperTrend线。我们使用条件运算符(?:)来根据当前趋势方向选择性地绘图:上升趋势时绘制绿色线,下降趋势时绘制红色线。plot.style_linebr样式确保了非连续的数据能被正确地以断点线的形式呈现。
之后,我们为标签创建一个变量:
// 创建一个持久化的标签变量(以便我们能访问到历史标签)
var label supTrndLabel = na
这个supTrndLabel变量被声明为var类型,这意味着它的值可以在K线之间持久化。我们用它来追踪最新信号标签的标识符,以便后续能通过历史引用操作符(如supTrndLabel[1])来访问上一个信号的标签。
接下来,我们创建SuperTrend的买卖信号标签:
// 当出现SuperTrend买卖信号时,创建相应的标签
if stDirection < 0 and stDirection[1] > 0
supTrndLabel := label.new(bar_index, superTrend, color=color.green,
textcolor=color.white, style=label.style_label_up, text="BUY\nSIGNAL")
else if stDirection > 0 and stDirection[1] < 0
supTrndLabel := label.new(bar_index, superTrend, color=color.red,
textcolor=color.white, text="SELL\nSIGNAL")
这个if/else结构用于判断趋势的反转。if部分的条件(stDirection < 0 and stDirection[1] > 0)判断趋势是否由下降转为上升(买入信号)。一旦满足,label.new()便会创建一个绿色的、文本为”BUY\nSIGNAL”的标签,并把其标识符存入supTrndLabel变量。else部分则以类似的方式处理卖出信号。
最后,我们检查并修改上一个标签的文本:
// 当SuperTrend方向穿越零轴时,即买卖信号发生时,
// 我们修改“已过时”的旧标签的文本。
if ta.cross(stDirection, 0)
// 1. 获取上一个标签的文本
prvLabelText = label.get_text(supTrndLabel[1])
// 2. 移除'SIGNAL'字样并将剩余部分转为小写
prvLabelText := str.replace(prvLabelText, "\nSIGNAL", "")
prvLabelText := str.lower(prvLabelText)
// 3. 最后,用处理过的新文本更新上一个标签
label.set_text(supTrndLabel[1], prvLabelText)
这个if语句使用ta.cross()函数来检测stDirection是否穿越了零轴,这是趋势反转的明确信号。当信号发生时,我们执行一个三步流程。
第一步获取文本:label.get_text(supTrndLabel[1])读取上一个标签的文本。第二步处理文本:str.replace()函数移除换行符和SIGNAL字样,然后str.lower()把剩余的BUY或SELL转换为小写。第三步更新标签:label.set_text()把处理后的新文本(buy或sell)写回到上一个标签上。
由于每次出现新信号时,我们都会对上一个信号的标签进行降级处理,最终所有历史信号的文本都会被修改。在下方的图表中,最新的SuperTrend信号以大写的SELL SIGNAL标签显示,而所有之前的、已过时的信号则只显示为小写的buy或sell:

label.get_text()的核心要点
label.get_text()返回的是标签文本的一个副本。因此,对返回的文本进行任何修改,都不会影响到标签本身。若要把修改后的字符串应用到标签上,必须通过label.set_text()来更新标签。
总结
label.get_text()函数返回指定标签的文本内容。- 函数需要一个参数:从
label.new()获取的标签标识符。 label.get_text()返回的字符串是标签内容的副本,对它的修改不会自动更新到标签上。- 要更新标签的文本,必须使用
label.set_text()函数。


