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

Pine Script(179):标签文本对齐,set_textalign与对齐选项

#Pine Script入门教学

用label.set_textalign()设置TradingView标签的文本对齐

在我们的Pine Script代码创建标签之后,可以使用label.set_textalign()函数来配置该标签的文本对齐方式。

借助标签的对齐设置,其文本可以显示在标签的中央,我们也可以让文本显示在标签的左侧或右侧。(当一个标签没有文本时,其对齐方式不会影响标签的外观。)

要更改一个标签的文本对齐方式,label.set_textalign()需要两个信息。我们来看一下。

函数语法格式

该函数的标准语法格式如下:

label.set_textalign(id, textalign)

id参数用于指定我们想要更改其文本对齐方式的标签的标识符。Pine Script正是通过这个标识符来识别要修改哪个标签,没有它,Pine Script将无从知晓要访问哪个标签。我们在创建标签时,可以从label.new()获得这个标识符。如果我们(不小心)为该参数传入了na值,函数将无法识别目标标签,因而不会更改任何文本对齐方式。(函数在这种情况下不会报错。)

textalign参数通过一个常量值来定义标签的文本对齐方式。唯一允许使用的值包括:text.align_left(把标签文本向左对齐)、text.align_center(把标签文本居中对齐;新标签默认使用此对齐方式)和text.align_right(把标签文本向右对齐)。

label.set_textalign()本身不返回任何值可供我们使用或检查。

快速示例

我们在实践中看看label.set_textalign()是如何工作的。在更改标签的文本对齐方式之前,我们首先需要一个标签。我们可以使用label.new()来创建一个:

// 在当前K线的最高价处绘制一个新标签,以显示最新价格
myLabel = label.new(x=bar_index, y=high, color=color.yellow,
	 textcolor=color.black, text="Last\nprice:\n" + str.tostring(close))

这段代码在当前K线的最高价(由bar_indexhigh确定)处绘制了一个标签。它的颜色是黄色(color.yellow),文字为黑色(color.black)。标签文本包含字符串”Last price:”、换行符(\n)以及当前K线的收盘价(close)。为了把数值类型的收盘价转换为文本,我们使用了Pine Script的str.tostring()函数。

我们把label.new()返回的标识符存储在myLabel变量中,以便后续通过该变量来访问此标签。

接下来,我们调用label.set_textalign()来更改标签的文本对齐方式:

// 将标签的文本对齐方式修改为右对齐
label.set_textalign(id=myLabel, textalign=text.align_right)

我们向该函数提供了两个参数。第一个myLabel是存有标签标识符的变量,它告诉函数要修改哪个标签。

另一个参数是期望的文本对齐方式。我们使用text.align_right值来让标签的文本内容靠右显示。

图表示例

上述快速示例所创建的标签,在图表上的效果如下:

以下代码展示了如何把上面的示例代码片段整合为一个完整的Pine Script指标:

//@version=5
indicator(title="label.set_textalign() 快速示例", overlay=true)

// 在图表的最后一根K线上,创建一个标签并设置其文本对齐方式
if barstate.islast
    // 在当前K线的最高价处绘制一个新标签,以显示最新价格
    myLabel = label.new(x=bar_index, y=high, color=color.yellow,
         textcolor=color.black, text="Last\nprice:\n" + str.tostring(close))

    // 将标签的文本对齐方式修改为右对齐
    label.set_textalign(id=myLabel, textalign=text.align_right)

我们首先使用indicator()函数来配置脚本。title参数为脚本命名,而overlay使脚本叠加显示在主图表上。

接着,一个if语句会验证脚本是否正在处理最后一根价格K线(barstate.islast)。如果条件为真,Pine Script便会执行我们前面讨论过的代码:label.new()创建一个新标签,然后label.set_textalign()更改该标签的文本对齐方式。

关键字参数

label.set_textalign()idtextalign关键字参数是可选的。我在代码范例中加入它们,主要是为了让代码的意图更清晰。但我们完全可以省略它们,以减少代码输入量。如果省略可选的关键字参数,label.set_textalign()的调用方式如下:

// 将标签的文本对齐方式修改为右对齐
label.set_textalign(myLabel, text.align_right)
//                 ^        ^ 省略了可选的 'id=' 和 'textalign='

label.set_textalign()的使用方式

label.set_textalign()主要用于更改标签的文本对齐方式。如果标签已是目标对齐方式,则函数不执行任何操作。需要注意的是,该函数无法移除标签的对齐方式,因为标签文本总是具有某种对齐属性(左、右或居中)。

在脚本中,我们通常把label.set_textalign()置于ifswitch语句中,以便只在满足特定条件时才去更改文本对齐方式。我们极少在每个K线上都无条件地调用此函数,因为标签会记住其最后一次设置的对齐方式,重复设置并无必要。

实际上,如果只想进行一次性的对齐设置,在创建标签时直接通过label.new()textalign参数来完成会更方便,代码也更简洁。label.set_textalign()的核心价值在于根据条件动态地改变一个已存在标签的对齐方式。

脚本范例

我们通过一个完整的脚本来深入理解label.set_textalign()的用法。下面的指标绘制了肯特纳通道(Keltner Channel)。当价格收盘突破该通道时,我们会绘制一个标签来标记这个交易信号。

这个策略的核心在于通过对齐方式来区分信号的新旧:最新买入信号的文本右对齐,最新卖出信号的文本左对齐。而每当有新信号出现时,我们会使用label.set_textalign()把上一个信号的文本改为居中对齐。这样,过时的信号便以不同的对齐方式呈现,一目了然。

该指标的完整代码如下:

//@version=5
indicator(title="更改标签文本对齐方式", overlay=true)

// 计算并绘制肯特纳通道
[keltMa, keltUpper, keltLower] = ta.kc(close, 20, 1.75)
plot(keltUpper, color=color.blue, title="上轨")
plot(keltMa, color=color.orange, title="肯特纳通道中轨")
plot(keltLower, color=color.blue, title="下轨")

// 创建一个持久化的标签变量,以便我们能方便地访问
// 上一个标签
var label signalLabel = na

// 当价格收盘突破上轨时,绘制一个“买入”信号标签
if ta.crossover(close, keltUpper)
    signalLabel := label.new(bar_index, low, style=label.style_label_up,
         color=color.green, textcolor=color.white,
         textalign=text.align_right, size=size.small,
         text=str.format("Buy\n{0}\n@\n{1}", syminfo.ticker, close))

// 当价格收盘跌破下轨时,创建一个“卖出”信号标签
if ta.crossunder(close, keltLower)
    signalLabel := label.new(bar_index, high, color=color.red,
         textcolor=color.white, textalign=text.align_left, size=size.small,
         text=str.format("Sell\n{0}\n@\n{1}", syminfo.ticker, close))

// 当脚本创建了一个新标签时,将上一个标签的
// 对齐方式设置回居中
if signalLabel != signalLabel[1]
    label.set_textalign(signalLabel[1], text.align_center)

脚本始于indicator()函数,用于命名并设置图表叠加。接着,ta.kc()函数计算出肯特纳通道的中轨、上轨和下轨,并由plot()函数把它们绘制在图表上。

之后,我们为标签标识符创建了一个变量:

// 创建一个持久化的标签变量,以便我们能方便地访问
// 上一个标签
var label signalLabel = na

我们使用var关键字来声明signalLabel,使其成为一个持久化变量。这意味着它的值可以在K线之间传递。这个特性是后续访问上一个标签(通过signalLabel[1])的关键。

接下来,我们创建买入信号标签:

// 当价格收盘突破上轨时,绘制一个“买入”信号标签
if ta.crossover(close, keltUpper)
    signalLabel := label.new(bar_index, low, style=label.style_label_up,
         color=color.green, textcolor=color.white,
         textalign=text.align_right, size=size.small,
         text=str.format("Buy\n{0}\n@\n{1}", syminfo.ticker, close))

这个if语句使用ta.crossover()检测价格是否上穿了通道上轨。一旦满足条件,label.new()便会创建一个新的买入标签。注意,我们在创建时就把文本设为右对齐(text.align_right)。标签的文本内容由str.format()函数构建,包含了交易品种和价格信息。新标签的标识符被存入signalLabel变量。

然后,我们用类似的方式处理卖出信号:

// 当价格收盘跌破下轨时,创建一个“卖出”信号标签
if ta.crossunder(close, keltLower)
    signalLabel := label.new(bar_index, high, color=color.red,
         textcolor=color.white, textalign=text.align_left, size=size.small,
         text=str.format("Sell\n{0}\n@\n{1}", syminfo.ticker, close))

这段代码检测价格是否下穿了下轨,并创建一个左对齐(text.align_left)的卖出标签。其标识符同样被存入signalLabel变量,覆盖掉之前可能存在的旧标识符。

最后,是本策略的点睛之笔,即处理旧标签:

// 当脚本创建了一个新标签时,将上一个标签的
// 对齐方式设置回居中
if signalLabel != signalLabel[1]
    label.set_textalign(signalLabel[1], text.align_center)

这个if语句的条件signalLabel != signalLabel[1]是一个非常巧妙的技巧,它用于检测signalLabel变量的值在本根K线上是否发生了变化。只有当新的买入或卖出标签被创建并赋值给signalLabel时,这个条件才会成立。

一旦条件满足,就说明一个新信号刚刚产生,而signalLabel[1]中保存的正是上一个信号的标签标识符。我们随即调用label.set_textalign(),把这个过时的旧标签的文本对齐方式改为居中(text.align_center)。由于每次出现新信号时,我们都会对上一个信号的标签进行此操作,最终所有历史信号标签的文本都将是居中对齐的。

在图表上,绿色和红色的标签分别代表了肯特纳通道的买卖信号。所有旧的信号标签文本都是居中的,只有最新的买入或卖出信号会根据其方向,分别以右对齐或左对齐的方式显示:

label.set_textalign()的特性与限制

  • 只写不读:Pine Script无法通过代码读取一个标签当前的文本对齐方式。我们只能设置它,无法查询它。要确保标签具有某种对齐方式,唯一的方法就是使用label.set_textalign()主动去设置。
  • 有效值:标签的文本对齐方式必须是text.align_lefttext.align_righttext.align_center这三个常量之一。使用任何其他值都会在脚本加载时导致unknown text align value的运行时错误。

总结

  • label.set_textalign()函数用于更改指定标签的文本对齐方式。
  • 函数需要两个参数:一个从label.new()获取的标签标识符,以及一个新的对齐方式。
  • 有效的对齐方式选项包括:左对齐(text.align_left)、右对齐(text.align_right)和居中(text.align_center)。

TradingView标签文本的三种对齐选项

当Pine Script创建一个带文本的标签时,默认情况下,文本会在标签内部居中显示。但居中对齐并非是标签文本的唯一选项。

此外还有两种水平对齐方式可供选择。我们来深入了解这些样式具体是什么。

文本对齐选项

Pine Script提供了三个常量值来控制标签的水平文本对齐。这些值是:

常量值 描述
text.align_left 把标签的文本内容设置为左对齐。
text.align_center 把标签的文本内容设置为居中对齐(这使文本显示在标签的中央)。
text.align_right 把标签的文本内容设置为右对齐。

有两个Pine Script函数可以使用上述三种文本对齐值:label.new()用于在创建新标签时指定其文本对齐方式,label.set_textalign()用于更改一个已存在标签的文本对齐方式。

文本对齐的效果

为了更清晰地说明标签文本对齐的作用,我们在TradingView图表上看看这三种不同样式的效果。

使用Pine Script的text.align_left值,标签的文本会靠左对齐显示:

text.align_center值会使标签的文本显示在标签的中央(居中):

第三种也是最后一种标签文本对齐选项是text.align_right。该值使标签内的文本靠右显示:

标签样式与文本对齐的关系

标签的视觉样式与其内部文本的对齐方式是两个独立的概念。在上面的图片中,三个标签分别拥有不同的样式,但它们的文本依然能正确地实现左对齐、居中和右对齐。例如,即便我们使用一个不带文本框的标签样式(如下箭头),文本对齐依然能正常工作:

label.style_none样式也是同理。这个样式仅仅在图表上显示一串浮动的文本,这串文本同样可以被设置为左对齐、居中或右对齐:

标签文本对齐的特性与注意事项

  • 单行文本的对齐效果:对于仅包含单行文本的标签,其对齐效果在视觉上并不明显。这是因为TradingView会自动把标签的宽度收缩以完全贴合文本宽度,从而掩盖了对齐方式。若要创建多行文本以观察对齐效果,可在字符串中使用换行符\n(例如"Buy\nsignal")。
  • 文本缩进:在使用左对齐或右对齐时,我们可以在文本行的开头添加空格来实现缩进效果,从而更精细地控制文本布局。
  • 对齐方式的唯一性:一个标签的对齐设置会应用到其全部文本内容上。我们无法在同一个标签内混合使用多种对齐方式。
  • 图表显示与鼠标提示:文本对齐设置仅影响标签在图表上直接显示的文本。当鼠标悬停在标签上时出现的工具提示(tooltip)文本,其对齐方式不受此设置影响。工具提示文本的对齐规则是固定的:多行文本总是左对齐,单行文本则总是居中。
  • 有效值限制:标签的文本对齐方式必须是text.align_lefttext.align_centertext.align_right这三个常量之一。若使用用于方框(box)和表格(table)的text.align_toptext.align_bottom,脚本加载时会产生unknown text align value(未知的文本对齐值)错误。若使用na值或任意字符串作为对齐参数,同样会触发此错误。

总结

  • Pine Script的标签文本支持三种水平对齐方式:text.align_left文本靠左对齐、text.align_center文本居中对齐、text.align_right文本靠右对齐。
  • 我们可以在创建标签时通过label.new(),或在后续通过label.set_textalign()来设定这些对齐方式。
赞(0)
未经允许不得转载:图道交易 » Pine Script(179):标签文本对齐,set_textalign与对齐选项
分享到

评论 抢沙发

登录

找回密码

注册