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

Pine Script(182):标签尺寸,set_size、尺寸选项与输入调整

#Pine Script入门教学

用label.set_size()更改TradingView标签的尺寸

在我们的Pine Script代码创建标签之后,可以使用label.set_size()函数来更改该标签的尺寸。此函数不仅会修改标签本身的尺寸,还会同时调整其文本和(如果适用的话)指向箭头的尺寸。

要调整标签尺寸,该函数必须知道要修改的是哪个标签以及要使用的新尺寸。我们来看看具体用法。

函数语法格式

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

label.set_size(id, size)

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

size参数通过一个常量值来定义标签的尺寸。唯一允许使用的值包括size.tinysize.smallsize.normalsize.largesize.hugesize.auto(新标签的默认尺寸)。

完成其工作后,label.set_size()不会返回任何值可供我们使用或检查。我们看看如何使用这个函数。

快速示例

要使用label.set_size()更改一个标签的尺寸,我们首先需要用label.new()创建一个标签:

// 在当前K线的编号和最高价处创建一个新标签
myLabel = label.new(x=bar_index, y=high, color=color.teal,
	 textcolor=color.white, text="True Range: " + str.tostring(ta.tr))

这段代码在当前K线的最高价处绘制了一个标签。它的颜色是蓝绿色(color.teal),文字为白色(color.white)。标签文本内容是字符串”True Range:”与当前K线的真实波幅(ta.tr)的组合。由于后者是一个数值而非文本(字符串),我们首先使用str.tostring()函数把它转换。

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

然后,我们调用label.set_size()来更改该标签的尺寸:

// 将我们刚刚创建的标签尺寸增大为 size.large
label.set_size(id=myLabel, size=size.large)

我们向该函数传递了两个参数。一个是myLabel变量,它存有标签的标识符,以此告知函数要访问哪个标签。

另一个参数是期望的标签尺寸。我们使用大号(size.large)来使标签明显变大。

图表示例

上述快速示例在图表上的效果如下:

我们把这些示例代码片段整合为一个完整的Pine Script指标,如下所示:

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

// 在最后一根价格K线上,绘制标签并更改其尺寸
if barstate.islast
    // 在当前K线的编号和最高价处创建一个新标签
    myLabel = label.new(x=bar_index, y=high, color=color.teal,
         textcolor=color.white, text="True Range: " + str.tostring(ta.tr))

    // 将我们刚刚创建的标签尺寸增大为 size.large
    label.set_size(id=myLabel, size=size.large)

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

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

关键字参数

label.set_size()idsize关键字参数是可选的。在范例中包含它们,主要是为了清晰地展示函数需要哪些数据。一旦我们熟悉了函数用法,通常会省略它们,以减少代码输入。如果省略可选的关键字参数,调用方式如下:

// 将我们刚创建的标签尺寸增加到 size.large
label.set_size(myLabel, size.large)
//            ^        ^ 省略了可选的 'id=' 和 'size='

label.set_size()的使用方式

label.set_size()的唯一职责就是更改标签的尺寸。它可以把标签调大、调小或保持不变(如果设置的尺寸与当前尺寸相同)。需要注意的是,该函数无法移除或禁用标签的尺寸属性,因为图表上的每个标签总是具有一种特定的尺寸。

在脚本中,我们通常把label.set_size()置于ifswitch语句中,以便只在满足特定条件时才去更改尺寸。无条件地在每个K线上都调用它并非必要,因为标签会记住其最后一次设置的尺寸,无需重复设置。

有时我们甚至不需要调用label.set_size()。如果只想进行一次性的尺寸设置,在创建标签时直接通过label.new()size参数来完成会更方便,代码也更简洁。

脚本范例

我们通过一个完整的脚本来深入理解label.set_size()的用法。本指标旨在捕捉成交量异常放大的K线。当成交量突破前期高点时,我们用一个醒目的大标签来标记;同时,我们会把上一个信号的标签缩小变色,以示其已过时。

该指标的完整代码如下:

//@version=5
indicator(title="更改标签尺寸")

// 计算并绘制最高成交量和每根K线的成交量
highestVolume = ta.highest(volume, 40)[1]
plot(volume, style=plot.style_columns, color=color.blue, title="成交量")
plot(highestVolume, color=color.fuchsia, title="最高成交量")

// 创建一个持久化的标签变量(以便我们能访问到上一个标签)
var label volumeLabel = na

// 当成交量高于最高成交量时,用标签注释该K线
if volume > highestVolume
    volumeLabel := label.new(bar_index, volume * 1.5, color=color.lime,
         style=label.style_diamond, size=size.large)

    // 将上一个标签设置为微小尺寸和灰色
    label.set_size(volumeLabel[1], size.tiny)
    label.set_color(volumeLabel[1], color.gray)

脚本始于indicator()函数,用于命名。接着,ta.highest()函数计算40周期内的最高成交量。[1]这个历史操作符至关重要,它确保我们获取的是不包含当前K线在内的前40根K线的最高值,这样当前的成交量才有机会创下新高。

然后,我们创建了一个持久化变量volumeLabel,用于在不同K线周期之间追踪最新创建的标签标识符。

接下来是信号识别与标签操作的核心逻辑:

// 当成交量高于最高成交量时,用标签注释该K线
if volume > highestVolume
    volumeLabel := label.new(bar_index, volume * 1.5, color=color.lime,
         style=label.style_diamond, size=size.large)

    // 将上一个标签设置为微小尺寸和灰色
    label.set_size(volumeLabel[1], size.tiny)
    label.set_color(volumeLabel[1], color.gray)

这个if语句判断当前K线的成交量是否超过了前期最高值。一旦条件满足,代码便会执行两组操作。第一组是创建新标签:label.new()创建一个大的(size.large)、酸橙绿色的菱形标签来标记这个放量信号。其标识符被存入volumeLabel

第二组是弱化旧标签:我们立即对上一个信号标签进行处理。通过volumeLabel[1]获取其标识符,然后调用label.set_size()把其尺寸设为微小(size.tiny),再调用label.set_color()把其颜色设为灰色(color.gray)。

最终效果是,图表上最新的成交量突破信号会以一个醒目的大号绿色菱形显示,而所有更早的、已过时的信号则以不起眼的小号灰色菱形呈现,主次分明:

label.set_size()的特性与限制

  • 只写不读:Pine Script无法通过代码读取一个标签当前的尺寸。要确保其尺寸,唯一的方法就是主动去设置它。
  • 尺寸与字体大小联动:更改标签的尺寸会同时改变其内部文本的字体大小。这两者无法分开设置。如果需要独立控制字体大小,应考虑使用Pine Script的表格(table)功能。
  • 必须使用内置常量:label.set_size()的尺寸参数必须是size.*系列的内置常量之一。使用其他任何值(如字符串或na)都会在脚本加载时导致unknown size value(未知的尺寸值)错误。

总结

  • label.set_size()函数用于更改指定标签的尺寸。
  • 它需要两个参数:一个从label.new()获取的标签标识符,以及一个新的尺寸。
  • 可用的尺寸选项包括:size.tinysize.smallsize.normalsize.largesize.hugesize.auto

TradingView标签的各种尺寸选项

我们用Pine Script代码创建的标签,可以在图表上以不同的尺寸显示。我们来看看都有哪些尺寸选项,还将讨论自动尺寸的作用以及哪些是最佳的标签尺寸。

Pine Script使用以下常量来设置标签的尺寸:

常量 描述
size.tiny 把标签设置为微小尺寸。
size.small 把标签设置为小号尺寸。
size.normal 把标签设置为正常尺寸。
size.large 把标签设置为大号尺寸。
size.huge 把标签设置为巨大尺寸。
size.auto 自动根据图表上K线的尺寸来调整标签的大小。当我们放大或缩小图表时,标签的尺寸也会随之改变。

可以使用这些标签尺寸的Pine Script函数是label.new()(在创建新标签时指定其尺寸)和label.set_size()(修改一个已存在标签的尺寸)。

标签尺寸示例

现在我们了解了有哪些标签尺寸,来看看它们在TradingView图表上的实际效果。

使用微小标签尺寸(size.tiny),标签在图表上会显示得非常小。如果标签包含文本,其文本几乎难以辨认:

小号标签尺寸(size.small)显示的标签大小适中。与微小尺寸相比,标签文本更容易阅读,标签形状本身也更加突出:

正常尺寸(size.normal)的标签,其文本在大小和可读性之间取得了很好的平衡。对于不含文本的标签,其形状也足够大,既容易被注意到,又不会让图表显得杂乱:

大号标签尺寸(size.large)会在图表上显示很大的标签。标签文本清晰可见,标签形状在图表上也非常显眼:

使用巨大尺寸(size.huge),标签在图表上会显示得非常大。任何标签文本都会以一种大到绝不会错过的字体大小显示,并且标签本身的尺寸也足以让人从远处轻易看到:

使用size.auto的图表自适应尺寸

还有一个标签尺寸:自动尺寸(size.auto)。这个尺寸的独特之处在于它能根据图表上K线的尺寸进行自适应调整。

基于我们对图表的缩放程度,size.auto会使标签变大或变小。也就是说,当我们放大图表时,价格K线会变大,size.auto也会使标签变大。当我们缩小图表时,价格K线会变小,size.auto同样会使标签变小。

size.auto的这种自适应、灵活的特性是其他固定尺寸所不具备的。我们在图表上看看它的效果。

为了观察标签尺寸如何随size.auto变化,我们从一个K线尺寸适中的图表开始看起:

在这个图表上,size.auto使得带文本的标签和不带文本的标签都显得相当小。

我们通过放大图表来改变这一点:

得益于其自适应特性,随着价格K线的增大,size.auto标签也随之变大。

然而,这些标签仍然有点小,文本也难以阅读。所以我们再放大一些:

现在,当价格K线变得巨大时,自动尺寸的标签就清晰可见了。

使用size.auto,当我们缩小图表时,标签会自动变小。在这个缩小的图表上,这些标签变成了小点:

标签尺寸比较

Pine Script的标签尺寸是按比例相互关联的。一个标签之所以是大号,是因为它比正常尺寸的标签更大,而正常尺寸又比小号尺寸更大。

以下是不同标签尺寸的直观比较:

第一行的标签分别是size.hugesize.largesize.normal尺寸。下一行展示的是size.smallsize.tinysize.auto

使用哪个尺寸?

一个好的标签尺寸首先取决于你使用标签的目的。标签应该是引人注目的,还是一个微妙的提示信号就足够了?

总的来说,有三种标签尺寸最为实用:size.smallsize.normalsize.large在不同的图表缩放级别下都表现良好。

其余的标签尺寸则不那么实用。size.tinysize.huge通常过于极端——它们要么太小,要么太大。size.auto在某些缩放级别下很有用,但如果我们过度放大,标签会变得太大;而如果我们过度缩小,标签又会变得太小。(当然,如果我们希望标签在这些缩放级别下消失,这反而是理想的选择。)

这并不是说我们永远不应该使用后三种标签尺寸。它们在特定情况下仍然可能很有用。

标签尺寸的特性

标签的尺寸会影响其文本的大小,以及其指向箭头的大小。我们无法单独调整这两个标签组件的尺寸。相反,当我们更改标签的尺寸时,文本和箭头的尺寸也会随之改变。

当我们使用label.new()label.set_size()设置标签尺寸时,必须使用我们上面讨论过的size.*常量之一。如果我们使用了其他任何值,比如一个字符串或na值,那么当我们把脚本添加到图表时,TradingView会生成unknown size value(未知尺寸值)的错误。为了让脚本正常工作,我们必须使用所提及的标签尺寸之一。

总结

  • Pine Script标签在图表上以6种可能的尺寸之一显示:size.tinysize.smallsize.normalsize.largesize.hugesize.auto
  • 除一种外,所有尺寸都使用固定大小:无论我们如何缩放图表,标签尺寸都保持不变。
  • 然而,使用size.auto尺寸,标签会自动适应图表的缩放级别。
  • 我们通过label.new()label.set_size()来使用这些标签尺寸。
  • 并非每种标签尺寸在图表上都看起来很美观。size.smallsize.normalsize.large是我们最常使用的标签尺寸。

用输入选项调整TradingView标签的尺寸

Pine Script的标签可以使用多种尺寸。通常,指标或策略会在其代码中直接定义要使用的标签尺寸。但有时,能让我们自己在脚本设置中手动配置这个尺寸会非常有用。那么该如何实现呢?

要实现这一点,我们需要创建一个输入选项。当这个输入指定了标签尺寸后,其他代码就可以使用该输入的值来调整标签的大小。当脚本在图表上运行时,我们便可以通过输入设置轻松地更改标签尺寸。

有几种方法可以实现这一点,其中一种是使用下拉菜单。我们来看看如何制作。

所需步骤

要创建一个用于设置标签尺寸的下拉输入,我们需要完成以下步骤:首先创建一个带有下拉菜单的字符串输入,菜单中包含各种标签尺寸选项;然后把下拉菜单中选定的字符串值转换为一个Pine Script可识别的标签尺寸值;最后使用这个转换后的值来更改标签尺寸——既可以在创建标签时通过label.new()直接应用,也可以使用label.set_size()来更改一个已存在标签的尺寸。

我们逐一完成这些步骤并探讨它们的代码实现。

步骤1:创建输入选项

输入选项允许脚本用户手动更改标签尺寸。要创建一个这样的选项,我们使用input.string()函数:

// 步骤 1:创建一个包含不同标签尺寸的文本输入选项
labelSizeInput = input.string("default", title="Label Size",
     options=["very small", "small", "default", "large", "very large"])

这段代码调用input.string()并传入了三个参数。第一个参数"default"是该输入的默认值。如果用户没有配置此输入,脚本将使用这个值。

通过title参数我们为该输入命名。这个文本会显示在脚本设置窗口中该输入控件的前面。

options参数指定了一个包含多个可选值的列表,这会使输入控件呈现为一个下拉菜单。我们在此菜单中包含了从very small到very large的多个选项。

顺便一提,这些尺寸描述可以是任何字符串,只要每个尺寸的名称是唯一的即可。我们可以使用非英语的其他语言,甚至可以用图标和表情符号来代表不同的尺寸。此外,也不一定需要5个不同的尺寸;如果我们的脚本只需要三种标签尺寸,那么我们就在options列表中定义三个即可。(但请记住,input.string()的默认值必须是options列表中的一个。)

我们把输入控件的当前值存储在labelSizeInput变量中,以便后续代码通过此变量来访问用户选择的值。

步骤2:把输入值转换为size.*常量

在上一步中,我们创建了一个包含多个字符串选项的下拉输入。但这里有一个问题:标签尺寸并不使用字符串,而是使用size.*这种常量值(例如size.normalsize.huge)。

因此,在第二步中,我们需要把输入选项的字符串值转换为一个size.*常量值:

// 步骤 2:将输入的可能值映射为 size.* 常量
labelSizeOption = switch labelSizeInput
    "very small" => size.tiny
    "small"      => size.small
    "default"    => size.normal
    "large"      => size.large
    "very large" => size.huge

这个switch语句处理上一步中创建的labelSizeInput变量。该变量持有用户在下拉菜单中当前选择的值。

switch语句中,Pine Script把输入选项的每个可能值与其对应的size.*常量进行匹配。这就把下拉菜单中的项目映射到了它们各自正确的尺寸常量。例如,"small"变成了size.small,而"very large"则被转换成了size.huge

因此,switch语句会根据输入的当前值(从labelSizeInput变量获取)选择正确的size.*值,并把它返回。我们把这个返回的size.*值存储在labelSizeOption变量中,以供下一步使用。

步骤3:设置标签尺寸

至此,我们已经有了一个变量,它包含一个与用户输入选项相匹配的size.*标签尺寸常量。现在,我们需要把这个变量应用到一个标签函数上,这样所选的尺寸才能真正在图表上生效。

有两种实现方式:我们可以创建一个新标签,并直接使用输入中配置的尺寸;或者,我们可以把一个已存在标签的尺寸更改为输入所设定的尺寸。

第一种方法让标签在创建时就拥有正确的尺寸,这是我们通常使用的方式。而另一种方式则适用于我们希望在特定情况下(即当某个条件发生时)才改变标签尺寸的场景。

要创建一个带有由输入设置的尺寸的新标签,我们可以这样做:

// 使用从输入派生的尺寸创建一个新标签
label.new(bar_index[7], high[7], color=color.orange, textcolor=color.white,
	 size=labelSizeOption, text="Label size:\n" + labelSizeInput)

这里的label.new()绘制了一个新标签。这个标签出现在7根K线前的最高价处(bar_index[7]high[7])。它的颜色是橙色(color.orange),文字为白色(color.white)。

对于标签尺寸,我们使用了labelSizeOption变量,这个变量正是上面的switch语句根据用户输入所设定的size.*常量。

标签的文本显示了labelSizeInput变量的值,即我们在第一步中创建的输入变量。这使得标签能够直观地展示我们从下拉菜单中选择了哪个选项。

另一种选择是把一个已存在标签的尺寸更改为输入所设定的尺寸:

// 或者,将一个现有标签的尺寸自定义为输入所设定的尺寸
myLabel = label.new(bar_index[20], high[20], color=color.teal)
label.set_size(myLabel, labelSizeOption)

这里的label.new()首先创建了一个新标签。我们把它放置在20根K线前的最高价处(bar_index[20]high[20]),并把其颜色设置为蓝绿色(color.teal)。

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

接着,我们调用label.set_size()来更改这个已存在标签的尺寸。我们向该函数传递了两个参数:第一个myLabel是存有标签标识符的变量,它告诉函数要修改哪个标签;另一个labelSizeOption则是包含来自用户输入的size.*值的变量。这样,用户的输入值就成功地改变了标签的尺寸。

示例脚本

下面的指标把上述三个步骤整合到了一个脚本中。该代码会创建两个标签,它们的尺寸都由同一个输入选项控制。为了把用户的输入转换为标签可以使用的形式,我们遵循了上面讨论的三个步骤。

该指标的完整代码如下:

//@version=5
indicator(title="通过输入设置标签尺寸(详细版)", overlay=true)

// 步骤 1:创建一个包含不同标签尺寸的文本输入选项
labelSizeInput = input.string("default", title="Label Size",
     options=["very small", "small", "default", "large", "very large"])

// 步骤 2:将输入的可能值映射为 size.* 常量
labelSizeOption = switch labelSizeInput
    "very small" => size.tiny
    "small"      => size.small
    "default"    => size.normal
    "large"      => size.large
    "very large" => size.huge

// 步骤 3:将转换后的尺寸值应用于Pine Script标签
if barstate.islastconfirmedhistory
    // 使用从输入派生的尺寸创建一个新标签
    label.new(bar_index[7], high[7], color=color.orange, textcolor=color.white,
         size=labelSizeOption, text="Label size:\n" + labelSizeInput)

    // 或者,将一个现有标签的尺寸自定义为输入所设定的尺寸
    myLabel = label.new(bar_index[20], high[20], color=color.teal)

    label.set_size(myLabel, labelSizeOption)

我们从indicator()函数开始,它配置了脚本的设置。title为脚本命名,而overlay使指标叠加显示在主图表上。

然后,我们使用input.string()创建输入选项,并把其当前值存储在labelSizeInput变量中。

接下来,一个switch语句根据该变量的值来确定对应的size.*常量,switch语句选择的值被存储在labelSizeOption变量中。

然后,一个if语句检查脚本是否正在处理最后一根已确认的历史K线(barstate.islastconfirmedhistory)。这根K线在图表上只出现一次,这样可以确保if语句内的代码(以及它所创建的标签)只执行一次。

if代码块内部,label.new()创建了两个标签。第一个在创建时就直接使用了由输入设定的尺寸。第二个标签则是在创建后,通过label.set_size()来更改其尺寸。

图表示例

我们看看上面脚本的运行效果。指标的输入选项如下所示:

当我们把指标添加到图表时,它默认使用default(默认)标签大小,两个示例标签的显示效果如下:

如果我们通过输入选项把标签大小更改为large(大),图表上的标签会随之变化:

总结

要通过用户输入来配置标签的尺寸,我们通常遵循以下三个步骤:

  1. 首先,创建一个带有下拉菜单的字符串输入框(input.string)。这为用户提供了可供选择的不同尺寸名称。
  2. 接着,在代码中把用户选择的字符串值转换为Pine Script可识别的、有效的标签尺寸值(例如,从”Large”字符串转换为size.large常量)。
  3. 最后,把这个转换后的尺寸值应用于label.new()label.set_size(),从而控制标签的大小。
赞(0)
未经允许不得转载:图道交易 » Pine Script(182):标签尺寸,set_size、尺寸选项与输入调整
分享到

评论 抢沙发

登录

找回密码

注册