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

Pine Script(183):标签样式,set_style、样式选项与输入设置

#Pine Script入门教学

用label.set_style()设置TradingView标签的样式

在我们的Pine Script代码绘制出标签后,可以使用label.set_style()函数来更改该标签的样式。此函数可以修改标签的视觉形状,例如,把它变为一个文本标签、圆形、三角形或旗形。

为了完成其工作,该函数必须知道要修改的是哪个标签以及要使用哪种新样式。我们来深入了解。

函数语法格式

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

label.set_style(id, style)

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

style参数通过一个常量值来定义标签的新样式。唯一允许使用的值包括:

  • label.style_xcross
  • label.style_cross
  • label.style_triangleup
  • label.style_triangledown
  • label.style_flag
  • label.style_circle
  • label.style_arrowup
  • label.style_arrowdown
  • label.style_label_up
  • label.style_label_down(这是新标签的默认样式)
  • label.style_label_left
  • label.style_label_right
  • label.style_label_lower_left
  • label.style_label_lower_right
  • label.style_label_upper_left
  • label.style_label_upper_right
  • label.style_label_center
  • label.style_square
  • label.style_diamond
  • label.style_none
  • label.style_text_outline

更改标签后,label.set_style()本身不返回任何值。我们看看如何使用这个函数。

快速示例

在更改标签的样式之前,我们需要一个可供操作的标签。因此,我们先用label.new()创建一个:

// 在当前K线的最高价处创建一个标签,以显示该K线的波幅
myLabel = label.new(x=bar_index, y=high, color=color.teal,
	 textcolor=color.white, size=size.large,
	 text="Range:\n" + str.tostring(high - low))

这段代码在当前K线的最高价(由bar_indexhigh确定)处绘制了一个标签。它的颜色是蓝绿色(color.teal),文字为白色(color.white),尺寸也设置为大号(size.large)。

标签的文本内容由字符串”Range:”与当前K线的高低点波幅(high - low)组合而成。由于后者是一个数值,而非label.new()所需的文本,我们使用Pine Script的str.tostring()函数把它转换为文本。

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

现在,要更改标签的样式,我们调用label.set_style()

// 将标签的样式更改为从其左下角指向的样式
label.set_style(id=myLabel, style=label.style_label_lower_left)

我们向该函数传递了两个参数。myLabel变量存有标签的标识符,它告诉函数要更改哪个标签。

另一个参数是我们期望的标签样式。这里我们使用label.style_label_lower_left。这个样式是一个带有从其左下角指向的箭头的文本标签。

图表示例

上述代码片段所创建的标签效果如下:

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

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

// 在图表的最后一根K线上,绘制并修改一个标签
if barstate.islast
    // 在当前K线的最高价处创建一个标签,以显示该K线的波幅
    myLabel = label.new(x=bar_index, y=high, color=color.teal,
         textcolor=color.white, size=size.large,
         text="Range:\n" + str.tostring(high - low))

    // 将标签的样式更改为从其左下角指向的样式
    label.set_style(id=myLabel, style=label.style_label_lower_left)

我们从indicator()函数开始,它为脚本命名并使其叠加显示在主图表上。

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

关键字参数

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

// 将标签的样式更改为从其左下角伸出箭头的样式
label.set_style(myLabel, label.style_label_lower_left)
//              ^        ^ 省略了 'id=' 和 'style='

label.set_style()的使用方式

label.set_style()的唯一职责就是更改标签的视觉样式。如果设置的样式与当前样式相同,则标签外观不变。

label.set_style()也可以通过把样式设置为label.style_none来移除或禁用标签的形状,这会使得图表上只显示标签的文本。如果标签没有文本,则什么都不会显示。

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

如果只想进行一次性的样式设置,在创建标签时直接通过label.new()style参数来完成会更方便。当然,如果需要根据条件动态地改变一个已存在标签的样式,label.set_style()仍然是不可或缺的。

脚本范例

我们通过一个完整的脚本来深入理解label.set_style()的用法。本指标通过WMA均线交叉来识别交易方向,并结合成交量来验证信号强度。我们使用不同的标签样式来同时呈现这两个维度的信息:颜色代表买卖方向,形状则代表信号是否得到了成交量的确认。

该指标的完整代码如下:

//@version=5
indicator(title="更改标签样式", overlay=true)

// 计算并绘制两条移动平均线
fastAverage = ta.wma(close, 10)
slowAverage = ta.wma(ta.wma(close, 30), 5)
plot(fastAverage, color=color.orange, title="快速均线")
plot(slowAverage, color=color.teal, title="慢速均线", linewidth=2)

// 当两条均线交叉时,创建一个新标签
if ta.cross(fastAverage, slowAverage)
    crossLabel = label.new(bar_index, high, size=size.small)

    // 根据交叉方向设置不同的标签样式
    if fastAverage > slowAverage
        label.set_color(crossLabel, color.green) 

        // 如果成交量确认上穿,则使用菱形;
        // 否则,使用旗帜符号。
        if volume > volume[1] and volume[1] > volume[2]
            label.set_style(crossLabel, label.style_diamond)
        else
            label.set_style(crossLabel, label.style_flag)

    else if fastAverage < slowAverage
        label.set_color(crossLabel, color.red)

        // 如果成交量确认下穿,则创建方形标签;
        // 否则,显示为圆形。
        if volume > volume[1] and volume[1] > volume[2]
            label.set_style(crossLabel, label.style_square)
        else
            label.set_style(crossLabel, label.style_circle)

脚本始于indicator()函数,用于命名和设置图表叠加。接着,我们计算出一条快速WMA和一条平滑处理过的慢速WMA,并把它们绘制在图表上。

然后,我们检测均线是否发生交叉:

// 当两条均线交叉时,创建一个新标签
if ta.cross(fastAverage, slowAverage)
    crossLabel = label.new(bar_index, high, size=size.small)

这个if语句使用ta.cross()检测任何方向的交叉。一旦交叉发生,我们首先用label.new()创建一个基础的、小尺寸的标签,并把其标识符存入crossLabel变量。这个标签此时还没有颜色和特定的形状。

在确认交叉发生后,一个嵌套的if/else语句开始工作,它负责根据信号的具体情况来装扮这个基础标签。首先是处理买入信号(金叉)的部分:

// 根据交叉方向设置不同的标签样式
if fastAverage > slowAverage
    label.set_color(crossLabel, color.green) 

    // ... 根据成交量设置形状 ...
    if volume > volume[1] and volume[1] > volume[2]
        label.set_style(crossLabel, label.style_diamond)
    else
        label.set_style(crossLabel, label.style_flag)

这段代码判断是否为快速均线上穿慢速均线。如果是,我们首先用label.set_color()把标签设为绿色。接着,另一个嵌套的if/else判断成交量是否连续两根K线递增。如果成交量确认了信号,我们就用label.set_style()把标签形状设为菱形(label.style_diamond);否则,设为旗帜形(label.style_flag)。

接下来是处理卖出信号(死叉)的部分:

else if fastAverage < slowAverage
    label.set_color(crossLabel, color.red)

    // ... 根据成交量设置形状 ...
    if volume > volume[1] and volume[1] > volume[2]
        label.set_style(crossLabel, label.style_square)
    else
        label.set_style(crossLabel, label.style_circle)

这段else代码处理快速均线下穿慢速均线的情况。逻辑与买入信号类似:先把标签设为红色,然后根据成交量是否确认,把标签形状分别设为方形(label.style_square)或圆形(label.style_circle)。

最终,图表上出现的标签能够清晰地传递多维度信息:绿色菱形代表放量上涨,绿色旗帜代表缩量上涨;红色方形代表放量下跌,红色圆形代表缩量下跌:

label.set_style()的特性与限制

  • 只写不读:Pine Script无法通过代码读取一个标签当前的样式。我们只能设置它,无法查询它。
  • 样式应用于整体:设置的样式会应用到标签的全部元素,包括背景、边框和箭头(如果存在),无法对这些部分应用不同的样式。
  • 文本显示方式:一部分标签样式会把文本包含在形状内部,便于阅读;而另一些样式(如箭头、旗帜)则没有内容区域,文本会浮动在图表上。

总结

  • label.set_style()函数用于更改指定标签的形状样式。
  • 它需要两个参数:一个从label.new()获取的标签标识符,以及一个新的样式。
  • Pine Script提供了多种内置的标签样式选项,其名称都以label.style_开头。

TradingView标签的各种样式选项

每个TradingView标签在图表上都以特定的样式显示。多数情况下,这个样式是一个指向下方的标签。但其实还有很多其他样式可供选择。通过它们,我们可以根据个人喜好自定义标签的外观。

Pine Script使用名称以label.style_开头的常量来定义标签的样式。每个样式都有其自己独特的名称。

有两个Pine Script函数可以在图表上显示特定的标签样式:label.new()(在创建新标签时指定一个可选的样式)和label.set_style()(更改一个已存在标签的样式)。

但这些函数究竟能使用哪些样式呢?我们来看一下。

Pine Script中的标签样式

Pine Script标签可以使用以下这些样式:

标签样式 描述
label.style_label_center 创建一个不指向图表位置的文本标签。标签会以其价格(Y轴)和时间(X轴)坐标为中心点显示。
label.style_label_down 创建一个从其底部边框向下指向其坐标点的文本标签。
label.style_label_left 创建一个从其左侧边框向左指向其坐标点的文本标签。
label.style_label_right 创建一个从其右侧边框向右指向其坐标点的文本标签。
label.style_label_up 创建一个从其顶部边框向上指向其坐标点的文本标签。
label.style_label_lower_left 创建一个从其左下角指向其坐标点的文本标签。
label.style_label_lower_right 创建一个从其右下角指向其坐标点的文本标签。
label.style_label_upper_left 创建一个从其左上角指向其坐标点的文本标签。
label.style_label_upper_right 创建一个从其右上角指向其坐标点的文本标签。
label.style_arrowdown 在图表上绘制一个实心的向下箭头。任何标签文本都会出现在箭头上方。
label.style_arrowup 在图表上绘制一个实心的向上箭头。标签的文本会出现在箭头上方。
label.style_circle 在图表上绘制一个实心圆形。标签的文本会显示在圆形上方。
label.style_cross 在图表上绘制一个实心加号十字(+号)。任何标签文本都会显示在十字上方。
label.style_diamond 在图表上绘制一个实心菱形。标签文本会出现在菱形上方。
label.style_flag 在图表上绘制一个实心旗帜。标签的文本会悬停在旗帜上方。
label.style_square 在图表上绘制一个实心正方形。任何标签文本都会出现在这个图形上方。
label.style_triangledown 在图表上绘制一个实心的向下三角形。标签的文本会出现在三角形上方。
label.style_triangleup 在图表上绘制一个实心的向上三角形。标签的文本会显示在这个三角形上方。
label.style_xcross 在图表上绘制一个实心叉号十字(x号)。任何标签文本都会显示在叉号上方。
label.style_none 创建一个没有任何背景或形状的文本绘图。这种样式只在图表上显示标签的文本。如果标签没有文本,则什么也不显示。
label.style_text_outline 创建一个没有背景或形状的文本绘图。文本的字母周围会有一个实心、较粗的轮廓。

标签样式确实不少。但幸运的是,我们不必死记硬背它们的名字。只需在TradingView应用程序的Pine编辑器中输入label.style,然后按Ctrl + Space组合键,就会弹出一个包含所有标签样式的自动完成下拉菜单,我们可以从中轻松选择。

标签样式分组

为了简化Pine Script的标签样式,我们可以把它们归为三个不同的类别。

第一类是标签(Labels):label.style_label_centerlabel.style_label_downlabel.style_label_leftlabel.style_label_rightlabel.style_label_uplabel.style_label_lower_leftlabel.style_label_lower_rightlabel.style_label_upper_leftlabel.style_label_upper_right

第二类是形状(Shapes):label.style_arrowdownlabel.style_arrowuplabel.style_circlelabel.style_crosslabel.style_diamondlabel.style_flaglabel.style_squarelabel.style_triangledownlabel.style_triangleuplabel.style_xcross

第三类是纯文本(Text drawings):label.style_nonelabel.style_text_outline

现在,我们看看不同标签样式在图表上的具体效果。我们将从标签类别开始,然后探索形状,最后再看纯文本。

标签样式示例

显示为实际文本标签的样式,其文本都包含在一个方框内,并且多数还带有一个指向其时间和价格坐标的箭头。我们来逐一看下。

使用label.style_label_center样式,标签会以其图表坐标为中心显示,并且不带指向箭头:

label.style_label_down样式会创建一个向下指向的标签:

使用向左的标签样式(label.style_label_left),标签会指向左侧:

label.style_label_right样式会创建一个向右指向的标签:

使用label.style_label_up作为标签样式,我们会得到一个指向上方的标签:

label.style_label_lower_left样式会生成一个从其左下角指向的标签:

得益于label.style_label_lower_right,标签会从其右下角指向坐标点:

label.style_label_upper_left样式会创建一个从其左上角伸出指向箭头的标签:

使用label.style_label_upper_right样式,标签会从其右上角伸出一个指向箭头:

形状示例

除了文本标签,标签绘图也可以显示为各种形状。使用这些样式时,图表上会出现某种图标,而标签的文本则会浮动在形状的上方,而不是显示在内部。我们来探索一下。

使用label.style_arrowdown,标签会显示为一个实心的向下箭头:

label.style_arrowup样式则恰恰相反,它会创建一个指向上方的箭头:

向上箭头形状会指向其自身的文本。当我们把此箭头放置在K线下方时,效果不太理想——箭头会指向其文本,而不是指向K线。

使用label.style_circle样式,标签在图表上会显示为一个实心圆形:

label.style_cross样式会使标签在图表上显示为一个+形的十字:

label.style_diamond是一个可以创建实心菱形形状的样式:

得益于label.style_flag样式,标签会显示为一面旗帜:

label.style_square标签样式可以把标签变为一个实心正方形:

我们可以通过label.style_triangledown样式得到一个向下指向的实心三角形:

label.style_triangleup样式则使标签显示为一个指向上方的实心三角形:

请注意,标签文本会出现在三角形指向的位置。如果我们把三角形放在K线下方,它会指向自己的文本而不是K线。

使用label.style_xcross样式,标签在图表上会显示为一个叉号(X形):

纯文本

最后一组标签样式是纯文本绘图。使用这些样式时,只有标签的文本会显示,而没有任何其他东西。当你想在图表上绘制文本,又不希望被标签或形状的背景所干扰时,它们是理想的选择。

label.style_none样式会显示一个没有任何形状或形态的标签,只显示其文本。如果标签没有文本,则什么也不会显示:

label.style_text_outline样式也只在图表上显示文本,但这次的文本会带有一个实心轮廓。如果标签没有文本,则什么也不会出现:

label.style_text_outline所产生的实心轮廓并不总能保证文本的可读性。例如,在上图中,标签的文本内容是label.style_text_outline。

标签样式的特性

文本标签样式有两个重要的命名约定。

其一,样式名称揭示了标签指向的方向。例如,label.style_label_down是一个向下指向的标签;label.style_label_upper_right是一个从其右上角指向的标签。

其二,标签本身会显示在其指向位置的正对面。因此,我们可以从样式名称中推断出标签本身将出现在哪里。例如,label.style_label_down是一个向下指向的标签,由于标签出现在其箭头的对面,所以标签框本身会出现在其时间和价格坐标的上方,也就是显示在其坐标的北面。而label.style_label_upper_right的标签,其右上角会指向其价格和时间坐标,这使得标签框本身显示在这些坐标的左下方,也就是出现在其坐标的西南角。

对于形状样式,文本是浮动在形状外部的。这样,无论标签是否有文本,形状本身看起来都一样。而文本标签样式则不同,它们会根据文本内容的多少而调整大小。

要设置一个标签样式,我们必须使用上面讨论过的样式之一。如果我们对label.new()label.set_style()使用了na值或一个随机字符串,那么当我们把脚本添加到图表时,TradingView会生成unknown label style value(未知的标签样式值)错误。

总结

  • Pine Script有多种标签样式,可以自定义标签的外观。
  • 标签样式主要有三类:文本标签、形状和纯文本绘图。
  • 文本标签样式的名称告诉我们其箭头的指向,也由此决定了标签框本身相对于其图表坐标的位置。
  • 我们可以在创建标签时通过label.new()使用这些标签样式,或者通过label.set_style()来更改一个已存在标签的样式。

用输入选项设置TradingView标签的样式

Pine Script的标签可以在图表上以多种样式显示。通常,我们的代码会直接指定脚本中的标签使用哪种样式。但有时,能让我们自己在脚本设置中手动配置这个样式会非常有用。那么该如何实现呢?

要实现这一点,我们需要创建一个输入选项。当这个输入定义了标签样式后,其他代码就可以查询该输入的值来应用相应的标签样式。这样,当脚本在图表上运行时,我们便可以通过脚本的输入设置轻松地更改其标签样式。

我们来看看实现这一功能所需的三个步骤。

所需步骤

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

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

步骤1:创建输入选项

通过输入选项,我们可以手动选择一个标签样式。由于标签样式众多,我们创建一个带有精选样式选项的下拉菜单。

我们使用input.string()函数来创建这样一个输入:

// 步骤 1:创建一个带有下拉菜单的文本输入,用于选择标签样式
labelStyleInput = input.string("Label down (↓)", title="Label Style",
     options=["Label down (↓)", "Label left (←)", "Label right (→)",
         "Label up (↑)", "Label lower left (↙)", "Label lower right (↘)",
         "Label upper left (↖)", "Label upper right (↗)", "Circle (●)",
         "Cross (+)", "Diamond (◆)", "Flag (⚑)", "Square (■)",
         "X-cross (⨯)", "None"])

这里我们向input.string()传递了三个参数。第一个参数"Label down (↓)"是该输入的默认值。如果我们不更改此输入,脚本将使用这个标准值。(向下标签样式也是Pine Script新标签的默认样式。)

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

options参数指定了下拉菜单中可供选择的值列表。这个列表包含多个命名的标签样式,每个都带有一个示例图标以帮助用户做出正确的选择。(为了保持列表的简洁易用,我们没有把所有标签样式都包含在内。你可以参阅Pine Script中的标签样式以了解所有可用样式,并帮助你做出自己的选择。)

对于字符串输入,Pine Script要求下拉菜单中的每个项目都是一个字符串值。但我们在这些描述中具体填写什么内容,则完全由我们自己决定。我们可以使用非英语的其他语言,甚至只使用表情符号。

为了方便后续在代码中访问该输入,我们把其当前值存储在labelStyleInput变量中。

步骤2:转换为label.style_*常量值

在上一步中,我们创建了一个包含多个字符串选项的下拉输入。但这里有一个问题:Pine Script的标签样式并不直接使用我们定义的字符串,而是使用label.style_*这种常量值(例如label.style_label_downlabel.style_label_upper_left)。

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

// 步骤 2:将输入值转换为正确的标签样式常量值
labelStyleOption = switch labelStyleInput
    "Label down (↓)"        => label.style_label_down
    "Label left (←)"        => label.style_label_left
    "Label right (→)"       => label.style_label_right
    "Label up (↑)"          => label.style_label_up
    "Label lower left (↙)"  => label.style_label_lower_left
    "Label lower right (↘)" => label.style_label_lower_right
    "Label upper left (↖)"  => label.style_label_upper_left
    "Label upper right (↗)" => label.style_label_upper_right
    "Circle (●)"            => label.style_circle
    "Cross (+)"             => label.style_cross
    "Diamond (◆)"           => label.style_diamond
    "Flag (⚑)"              => label.style_flag
    "Square (■)"            => label.style_square
    "X-cross (⨯)"           => label.style_xcross
    "None"                  => label.style_none

这个switch语句把下拉菜单的值与一个标签样式值进行匹配。我们通过上一步创建的labelStyleInput变量来访问下拉菜单的当前值。

switch语句内部,我们为下拉菜单中的每个值都提供了一个字面字符串。在这些字符串的右侧,=>操作符之后,是其对应的标签样式常量。这就是Pine Script把用户输入值翻译成样式常量的方式。例如,"Label up (↑)"会变成label.style_label_up,而"Cross (+)"则被转换为label.style_cross

我们把switch语句找到的匹配标签样式存储在labelStyleOption变量中,以便在下一步中使用。

我们不可以直接在下拉菜单中使用这些标签样式常量吗?理论上确实可行,因为label.style_*常量的底层值也是字符串。但那些字符串并不易读,例如label.style_label_left的字符串值是llf,而label.style_label_downldn

因此,我们选择在下拉菜单中定义我们自己的、更友好的标签样式名称,即便这意味着需要这第二步的额外转换工作。

步骤3:设置标签样式

至此,我们已经有了一个变量,它包含一个与用户输入选项相匹配的标签样式。现在,我们需要把这个样式应用到图表上。

有两种方法可以做到这一点:我们可以创建一个新标签,并直接使用输入中配置的样式;或者,我们可以把一个已存在标签的样式更改为输入所设定的样式。我们分别来看。

要创建一个从一开始就使用用户指定样式的标签,我们可以这样做:

// 创建一个新标签,并使用来自输入的样式
label.new(bar_index, high, color=color.teal, textcolor=color.white,
	 style=labelStyleOption, text="Label style:\n" + labelStyleInput)

这段代码使用label.new()绘制了一个新标签。这个绘图显示在当前K线的最高价处(bar_indexhigh)。它的颜色是蓝绿色(color.teal),文字为白色(color.white)。

为了设置标签样式,我们使用了labelStyleOption变量。在上一步中,我们已经为这个变量赋予了一个label.style_*标签样式常量。

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

另一种选择是把一个已存在标签的样式更改为输入所设定的样式。这种方式适用于我们只希望在特定情况下才应用该标签样式的场景,而不是从标签创建开始就一直使用它。

要更改一个已存在标签的样式,我们首先需要一个可操作的标签。因此,我们先创建一个:

// 或者,先创建一个标签
myLabel = label.new(bar_index[30], high[30], color=color.orange,
	 textcolor=color.white, text=labelStyleInput)

此处的label.new()在30根K线前的最高价处(bar_index[30]high[30])绘制了一个标签。该标签以橙色(color.orange)显示,文字为白色(color.white)。标签的文本内容就是我们在输入下拉菜单中选择的值。

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

然后,在脚本代码的稍后部分,我们再来更改这个已存在标签的样式:

// 之后再将标签样式自定义为输入所设定的值
label.set_style(myLabel, labelStyleOption)

我们调用label.set_style()来修改先前创建的标签的样式。通过myLabel变量,我们指定了要修改的标签。而labelStyleOption变量则指定了要使用的标签样式,这个变量是我们上一步从用户的当前输入值转换而来的。

完整脚本范例

下面的指标把我们讨论的三个步骤整合到了一个脚本中。该代码绘制了两个标签,两者的样式都由用户输入选项来控制。我们把下拉菜单中用户选择的文本值,转换为Pine Script内部的标签样式常量,然后把这个样式应用在图表上。

该指标的完整代码如下:

//@version=5
indicator(title="通过输入设置标签样式", overlay=true)

// 步骤 1. 创建一个带下拉菜单的字符串输入框,用于选择标签样式
labelStyleInput = input.string("Label down (↓)", title="标签样式",
     options=["Label down (↓)", "Label left (←)", "Label right (→)",
         "Label up (↑)", "Label lower left (↙)", "Label lower right (↘)",
         "Label upper left (↖)", "Label upper right (↗)", "Circle (●)",
         "Cross (+)", "Diamond (◆)", "Flag (⚑)", "Square (■)",
         "X-cross (⨯)", "None"])

// 步骤 2. 将输入的字符串值转换为对应的标签样式常量
labelStyleOption = switch labelStyleInput
    "Label down (↓)"        => label.style_label_down
    "Label left (←)"        => label.style_label_left
    "Label right (→)"       => label.style_label_right
    "Label up (↑)"          => label.style_label_up
    "Label lower left (↙)"  => label.style_label_lower_left
    "Label lower right (↘)" => label.style_label_lower_right
    "Label upper left (↖)"  => label.style_label_upper_left
    "Label upper right (↗)" => label.style_label_upper_right
    "Circle (●)"            => label.style_circle
    "Cross (+)"             => label.style_cross
    "Diamond (◆)"           => label.style_diamond
    "Flag (⚑)"              => label.style_flag
    "Square (■)"            => label.style_square
    "X-cross (⨯)"           => label.style_xcross
    "None"                  => label.style_none

// 步骤 3. 将用户选择的样式应用到 Pine Script 标签上
if barstate.islastconfirmedhistory
    // 方法一:在创建时直接使用来自输入的样式
    label.new(bar_index, high, color=color.teal, textcolor=color.white,
         style=labelStyleOption, text="标签样式:\n" + labelStyleInput)

    // 方法二:先创建标签,然后用 set 函数将其样式修改为输入值
    myLabel = label.new(bar_index[30], high[30], color=color.orange,
         textcolor=color.white, text=labelStyleInput)

    label.set_style(myLabel, labelStyleOption)

我们首先使用indicator()函数来配置脚本的基本信息。接着,input.string()创建了一个用户输入选项,并把用户选择的值保存在labelStyleInput变量中。这是上述的步骤1。

然后,我们使用一个switch语句把用户选择的字符串(如”Circle (●)”)映射到Pine Script内部对应的样式常量(如label.style_circle)。转换后的结果被保存在labelStyleOption变量中。这是步骤2。

之后,一个if语句使用barstate.islastconfirmedhistory条件,来确保绘图代码只在图表的最后一个历史K线上执行一次。这是一种常见的性能优化技巧,避免在每个K线上重复创建不必要的绘图对象。在这个特定的K线上,我们演示了两种应用样式的方法(步骤3):第一个label.new()在创建标签时,直接通过style参数使用了我们从输入中得到的labelStyleOption;第二个标签先以默认样式创建,随后再通过label.set_style()把其样式修改为用户选择的样式。

图表示例

我们看看代码的运行效果。脚本创建的用户输入选项,在图表设置中显示为一个包含所有可选样式的下拉菜单:

上述示例指标默认使用label down样式,其在图表上的显示效果如下:

当我们使用下拉菜单把标签样式修改为label upper right时,图表上的指标会随之更新:

这个下拉菜单不仅包含带文本框的标签,也包含纯形状的样式。例如,选择circle样式后,图表会显示为:

最后这种样式(圆形)的文本是显示在形状外部的。由于我们的示例标签文字为白色,在白色的图表背景下,这些浮动的文本便看不见了。

总结

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

  1. 创建输入:首先,创建一个带有下拉菜单的字符串输入框(input.string),其列表项(options)定义了所有可供用户选择的样式名称。
  2. 转换数值:接着,在代码中把用户选择的字符串值转换为Pine Script可识别的、以label.style_*开头的样式常量。
  3. 应用样式:最后,把转换后的样式常量应用于label.new()(在创建新标签时)或label.set_style()(在修改已存在标签的外观时)。
赞(0)
未经允许不得转载:图道交易 » Pine Script(183):标签样式,set_style、样式选项与输入设置
分享到

评论 抢沙发

登录

找回密码

注册