外观
文本和形状
约 7157 字大约 24 分钟
简介
在Mine Script®中,您可以通过五种不同的方式显示文本或图形:
- plotchar()
- plotshape()
- plotarrow()
- 使用label.new()创建的标签
- 使用table.new()创建的表格(参见表格章节)
选择哪种方式取决于您的需求:
表格可以在图表的相对位置上显示文本,这些文本不会随着用户水平滚动或缩放图表而移动。表格内容不与K线绑定。相比之下,使用plotchar()、plotshape()或label.new()显示的文本总是与特定K线绑定,因此会随着K线在图表上的位置移动。有关表格的更多信息,请参阅表格页面。
有三个函数可以显示预定义的图形:plotshape()、plotarrow()和使用label.new()创建的标签。
plotarrow()不能显示文本,只能显示向上或向下的箭头。
plotchar()和plotshape()可以在图表的任何K线或所有K线上显示非动态文本。
plotchar()只能显示一个字符,而plotshape()可以显示字符串(包括换行符)。
label.new()最多可以在图表上显示500个标签。其文本可以包含动态文本或“系列字符串”。标签文本也支持换行。
虽然plotchar()和plotshape()可以在过去或将来的固定偏移位置显示文本(这些偏移在脚本执行期间不能更改),但每个label.new()调用都可以使用可以动态计算的“系列”偏移。
以下是关于Mine脚本字符串的一些注意事项:
由于plotchar()和plotshape()中的
text参数需要“常量字符串”参数,因此不能包含只能在K线上才能知道的值(如价格)(“系列字符串”)。要在使用label.new()显示的文本中包含“系列”值,需要先使用str.tostring()将其转换为字符串。
Mine中字符串的连接运算符是
+。它用于将字符串组件连接成一个字符串,例如:msg = "图表品种:" + syminfo.tickerid(其中syminfo.tickerid是一个内置变量,以字符串格式返回图表的交易所和品种信息)。所有这些函数显示的字符可以是Unicode字符,包括Unicode符号。
有时可以使用函数参数控制文本的颜色或大小,但不支持内联格式(粗体、斜体、等宽字体等)。
Mine脚本中的文本始终以Trebuchet MS字体显示在图表上,该字体用于许多TradingVue文本,包括本文。
此脚本使用Mine脚本中可用的四种方法显示文本:

Mine Script®
已复制
请注意:
- 每种文本显示方法均标注在对应文本旁,但使用plotchar()显示的青色向上箭头除外(该函数仅支持显示单个字符)
- 标签和表格调用可置于条件结构中控制执行时机,而plotchar()和plotshape()必须通过首个“series bool”参数控制显示条件
- 表格和标签中显示的数值需先通过str.tostring()转换为字符串
- 使用
+运算符进行字符串拼接 - plotshape()设计用于显示带文本的图形,其
size参数控制图形尺寸而非文本大小(通过na参数隐藏图形显示) - 与其他文本不同,表格文本不会随图表滚动或缩放而移动
- 部分文本包含🠇 Unicode箭头符号(U+1F807)
- 部分文本包含
\n换行符序列
plotchar()
该函数适用于在K线上显示单个字符,其语法结构如下:
plotchar(series, title, char, location, color, offset, text, textcolor, editable, size, show_last, display, format, precision, force_overlay) → void有关plotchar()参数的详细信息,请参阅参考手册中的相应条目。
该函数可用于在数据窗口或图表上脚本名称右侧的指标值中显示和检查数值:

Mine Script®
已复制
请注意:
- 光标位于图表最后一根K线
- bar_index的值显示在指标值窗口(1)和数据窗口(2)中
- 使用location.top参数(默认location.abovebar会影响脚本比例计算,可能干扰其他绘图)
plotchar()同样适用于标记图表特定点位或验证条件触发情况。本示例在满足以下条件的K线下方显示上升箭头:收盘价、最高价和成交量连续两日上涨

Mine Script®
已复制
请注意:
- 使用
(na(volume) or ta.rising(volume, 2))确保脚本在没有成交量数据的品种上也能运行。若不使用na(volume)处理无成交量数据的情况(当无成交量时返回true),longSignal变量将永远不会为true,因为此时ta.rising(volume, 2)会返回false。 - 无成交量时显示灰色箭头,提示三个基础条件未全部满足。
- 由于 plotchar()在图表上显示字符,使用
size = size.tiny控制其大小。 - 调整
location参数使字符显示在 K 线下方。
如果仅需绘制圆形标记,也可使用 plot()实现类似效果:
Mine Script®
已复制
此方法的不足之处在于:由于 plot() 不具备相对定位机制,必须通过类似 ta.tr(K线的“真实波幅”)等方式将圆形标记向下偏移。

plotshape()
该函数适用于在K线上显示预定义图形和/或文本,其语法结构如下:
plotshape(series, title, style, location, color, offset, text, textcolor, editable, size, show_last, display, format, precision, force_overlay) → void有关plotshape()参数的详细信息,请参阅参考手册中的相应条目。
我们将使用该函数实现与前一节第二个示例大致相同的效果:
Mine Script®
已复制
请注意,此处我们通过将style参数设为shape.arrowup来使用向上箭头图形,而非字符箭头。

可以通过多个plotshape()调用来在K线上叠加文本。需要使用\n后接特殊不可见字符(确保换行功能生效且不被过滤),此处我们使用Unicode零宽度空格(U+200E)。虽然下方代码字符串中不可见,但该字符实际存在且可复制粘贴。当文本向上显示时,此特殊Unicode字符需置于字符串末尾;当在K线下方绘制且文本向下时,则需置于字符串开头:
Mine Script®
已复制

可通过style参数使用的预定义图形包括:
| 参数 | 图形 | 带文本 | 参数 | 图形 | 带文本 |
|---|---|---|---|---|---|
shape.xcross | ![]() | ![]() | shape.arrowup | ![]() | ![]() |
shape.cross | ![]() | ![]() | shape.arrowdown | ![]() | ![]() |
shape.circle | ![]() | ![]() | shape.square | ![]() | ![]() |
shape.triangleup | ![]() | ![]() | shape.diamond | ![]() | ![]() |
shape.triangledown | ![]() | ![]() | shape.labelup | ![]() | ![]() |
shape.flag | ![]() | ![]() | shape.labeldown | ![]() | ![]() |
plotarrow()
plotarrow函数会根据其第一个参数中使用的序列的相对值,显示长度可变的向上或向下箭头。该函数的语法如下:
plotarrow(series, title, colorup, colordown, offset, minheight, maxheight, editable, show_last, display, format, precision, force_overlay) → void关于plotarrow参数的详细信息,请查阅参考手册中的相关条目。
plotarrow函数中的series参数与plotchar()和plotshape()函数中的“series bool”类型不同,它属于“series int/float”类型,其功能不仅限于简单地通过true或false值来决定是否绘制箭头。以下是series参数控制plotarrow函数行为的逻辑规则:
series > 0:显示向上箭头,箭头长度与该K线上series值相对于其他series值的相对大小成正比;series < 0:显示向下箭头,箭头长度按相同比例规则显示;series == 0 or na(series):不显示任何箭头。
用户可以通过minheight和maxheight参数来控制箭头的最小和最大显示尺寸(以像素为单位)。
以下是一个演示plotarrow函数工作原理的简单脚本示例:
Mine Script®
已复制

请注意,箭头的高度与K线实体的相对大小成正比。
您可以使用任何序列来绘制这些箭头。在此示例中,我们使用“Chaikin振荡器”的数值来控制箭头的位置和大小:
Mine Script®
已复制

请注意,我们在图表下方的独立面板中显示了实际的“Chaikin振荡器”数值,因此您可以清楚地看到用于确定箭头位置和大小的具体数值。
标签
标签仅在Mine Script v4及更高版本中可用。它们的工作方式与plotchar()和plotshape()有很大不同。
标签是对象,类似于线条、方框或表格。与其他对象一样,它们通过ID进行引用,ID的作用类似于指针。标签ID属于“label”类型。与其他对象一样,标签ID是“时间序列”类型,所有用于管理它们的函数都接受“序列”参数,这使得它们非常灵活。
注意
在TradingVue图表上,完整的绘图工具集允许用户通过鼠标操作创建和修改绘图。虽然这些绘图有时可能与Mine Script代码创建的绘图对象看起来相似,但它们是不同的实体。 通过Mine代码创建的绘图对象无法用鼠标操作修改,而通过图表界面手动绘制的绘图也无法从Mine脚本中访问。
标签具有以下优势:
- 可将“序列”值转换为文本并显示在图表上,因此非常适合显示无法预先确定的值(如价格数值、支撑位/阻力位或脚本计算的其他动态值)
- 定位选项比
plot*()函数更灵活 - 提供更多显示模式
- 与
plot*()函数不同,标签处理函数可放入条件语句或循环结构中,便于控制行为 - 支持为标签添加工具提示
相比plotchar()和plotshape(),标签的局限在于图表上可显示的数量有限(默认约50个,通过indicator()或strategy()声明语句的max_labels_count参数最多可设为500个)。标签与线条/方框类似,采用垃圾回收机制管理,仅保留最近绘制的标签。
标签管理函数均位于label命名空间,包括:
- label.new():创建标签
label.set_*()系列函数:修改现有标签属性label.get_*()系列函数:读取标签属性- label.delete():删除标签
- label.all数组:包含图表所有可见标签ID,其大小取决于脚本设置的标签上限和实际绘制数量(可通过
array.size(label.all)获取)
创建和修改标签
label.new()函数用于创建新标签,其函数签名如下:
label.new(point, text, xloc, yloc, color, style, textcolor, size, textalign, tooltip, text_font_family, force_overylay, text_formatting) → series label
label.new(x, y, text, xloc, yloc, color, style, textcolor, size, textalign, tooltip, text_font_family, force_overylay, text_formatting) → series label两种签名方式的区别在于它们如何指定标签在图表上的坐标。第一种签名使用point参数,该参数接受图表点对象。第二种签名使用x和y参数,这些参数接受“系列整数/浮点数”值。对于两种签名方式,标签的x坐标可以是K线索引或时间值,具体取决于xloc属性。
用于修改标签属性的设置函数包括:
- label.set_x() - 设置标签x坐标
- label.set_y() - 设置标签y坐标
- label.set_xy() - 同时设置x/y坐标
- label.set_text() - 设置标签文本
- label.set_xloc() - 设置x轴定位方式
- label.set_yloc() - 设置y轴定位方式
- label.set_color() - 设置标签颜色
- label.set_style() - 设置标签样式
- label.set_textcolor() - 设置文本颜色
- label.set_size() - 设置标签大小
- label.set_textalign() - 设置文本对齐方式
- label.set_tooltip() - 设置工具提示文本
- label.set_text_font_family() - 设置标签文本字体
- label.set_text_formatting() - 设置标签文本格式
这些函数具有相似的签名格式。以label.set_color()为例,其函数签名为:
label.set_color(id, color) → void其中:
id表示需要修改属性的标签ID。- 下一个参数是要修改的标签属性,具体取决于所使用的设置函数。label.set_xy()会同时修改两个属性,因此它有两个这样的参数。
以下是创建标签的最简形式示例:
Mine Script®
已复制

请注意:
- 标签创建时使用的参数为
x = bar_index(当前K线的索引值)和y = high(该K线的最高价) - 未指定函数的
text参数,该参数默认值为空字符串,因此不显示任何文本 - 由于未对label.new()调用添加逻辑控制,将在每根K线上创建标签
- 仅显示最后54个标签,因indicator()调用未使用
max_labels_count参数修改默认的约50个标签限制 - 标签会持续存在于K线上,直到脚本调用label.delete()删除或触发垃圾回收机制
在接下来的示例中,我们将在最近50根K线中最高价的K线上显示标签:
Mine Script®
已复制

请注意:
- 我们仅在首根K线创建标签,这是通过使用var关键字声明包含标签ID的
lbl变量实现的。该label.new()调用中的x、y和text参数并不重要,因为标签将在后续K线上更新。不过,我们特意设置了标签所需的颜色和样式,这样后续就不需要再更新这些属性。 - 在每根K线上,我们通过检测hi值的变化来判断是否出现新的高点:
- 当最高价发生变化时,我们使用三个
label.set*()函数调用来更新标签信息 - 通过lbl变量(存储我们的标签ID)来引用标签
- 这样脚本就能在所有K线上维护同一个标签,但在检测到新高时移动它并更新其信息
- 当最高价发生变化时,我们使用三个
在下面这个例子中,我们在每根K线上都创建一个标签,但会根据K线的涨跌情况有条件地设置其属性:
Mine Script®
已复制

标签定位
标签在图表上的位置由x(K线)和y(价格)坐标决定。五个参数影响此行为:x、y、xloc、yloc和style:
x 是K线索引或时间值。使用K线索引时,该值可偏移到过去或未来(最多未来500根K线)。使用时间值时也可计算过去或未来的偏移。现有标签的x值可通过label.set_x()或label.set_xy()修改。
xloc 是xloc.bar_index(默认)或xloc.bar_time。它决定x必须使用的参数类型。使用xloc.bar_index时,x必须是绝对K线索引;使用xloc.bar_time时,x必须是对应K线开盘时间的UNIX时间戳(毫秒)。现有标签的xloc值可通过label.set_xloc()修改。
y 是标签定位的价格水平。仅在默认yloc值为yloc.price时生效。若yloc为yloc.abovebar或yloc.belowbar,则y参数会被忽略。现有标签的y值可通过label.set_y()或label.set_xy()修改。
yloc 可以是yloc.price(默认)、yloc.abovebar或yloc.belowbar。y参数仅在yloc.price时生效。现有标签的yloc值可通过label.set_yloc()修改。
style 使用的参数会影响标签的视觉外观及其相对于参考点的位置(参考点由y值或yloc.abovebar/yloc.belowbar决定的K线顶部/底部确定)。现有标签的样式可通过label.set_style()修改。
以下是可用的style参数:
| 参数 | 纯标签样式 | 带文本标签样式 | 参数 | 纯标签样式 | 带文本标签样式 |
|---|---|---|---|---|---|
label.style_xcross | ![]() | ![]() | label.style_label_up | ![]() | ![]() |
label.style_cross | ![]() | ![]() | label.style_label_down | ![]() | ![]() |
label.style_flag | ![]() | ![]() | label.style_label_left | ![]() | ![]() |
label.style_circle | ![]() | ![]() | label.style_label_right | ![]() | ![]() |
label.style_triangleup | ![]() | ![]() | label.style_label_lower_left | ![]() | ![]() |
label.style_triangledown | ![]() | ![]() | label.style_label_lower_right | ![]() | ![]() |
label.style_arrowup | ![]() | ![]() | label.style_label_upper_left | ![]() | ![]() |
label.style_arrowdown | ![]() | ![]() | label.style_label_upper_right | ![]() | ![]() |
label.style_square | ![]() | ![]() | label.style_label_center | ![]() | ![]() |
label.style_diamond | ![]() | ![]() | label.style_none | ![]() |
当使用xloc.bar_time时,x值必须是UNIX时间戳(毫秒)。有关时间的更多信息,请参阅时间页面。当前K线的起始时间可从内置变量time获取。之前K线的时间为time[1]、time[2]等。时间也可以通过timestamp函数设置为绝对值。您可以加减时间段来实现相对时间偏移。
以下示例在距离最后一根K线日期一天前的位置放置一个标签:
Mine Script®
已复制
请注意,由于市场休市时存在时间间隔和缺失K线,标签的定位可能并不总是精确。这类时间偏移在24x7连续交易的市场中通常更为可靠。
您也可以使用K线索引作为x值进行偏移,例如:
Mine Script®
已复制
读取标签属性
以下getter函数可用于获取标签属性:
这些函数具有相似的签名格式。以label.get_text()为例,其函数签名为:
label.get_text(id) → series string其中,id 表示需要获取文本内容的标签ID。
标签克隆
label.copy()函数用于克隆标签,其语法如下:
label.copy(id) → void删除标签
label.delete()函数用于删除标签,其语法如下:
label.delete(id) → void要在图表上仅保留用户指定数量的标签,可以使用如下代码:
Mine Script®
已复制

请注意:
- 我们定义了一个
MAX_LABELS常量来保存脚本可以容纳的最大标签数量。我们使用这个值来设置indicator()调用中的max_labels_count参数值,同时也作为input.int()调用的maxval值来限制用户输入值。 - 当我们的RSI突破过去20根K线的最高值时,我们会创建一个新标签。注意我们在
if myRSI > ta.highest(myRSI, 20)[1]中使用的[1]偏移量。这是必要的。如果没有这个偏移量,ta.highest()返回的值将始终包含myRSI的当前值,因此myRSI永远不会高于该函数的返回值。 - 之后,我们删除label.all数组中最旧的标签,该数组由Mine Script运行时自动维护,包含我们脚本绘制的所有可见标签的ID。我们使用array.get()函数获取索引为零的数组元素(最旧的可见标签ID),然后使用label.delete()删除与该ID关联的标签。
请注意,如果只想在最后一根K线上放置标签,那么在脚本在所有K线上执行时创建和删除标签是不必要且低效的,这样只会保留最后一个标签:
Mine Script®
已复制
以下是实现相同功能的高效方式:
Mine Script®
已复制
实时行为
标签会受到提交(commit)和回滚(rollback)操作的影响,这些操作会影响脚本在实时K线中的执行行为。详见Mine脚本执行模型页面。
以下脚本演示了在实时K线中运行时回滚的效果:
Mine Script®
已复制
在实时K线上,label.new()会在每次脚本更新时创建一个新标签。但由于回滚机制,同一根K线上前次更新创建的标签会被删除。只有实时K线收盘前最后创建的标签才会被提交并保留。
文本格式设置
标签、表格和方框等绘图对象具有与文本相关的属性,允许用户自定义对象文本在图表上的显示方式。一些常见属性包括文本颜色、大小、字体族和排版强调。
程序员可以在使用label.new()、box.new()或table.cell()参数初始化对象时设置其文本属性。或者,他们可以使用相应的设置函数,例如label.set_text_font_family()、table.cell_set_text_color()、box.set_text_halign()等。
所有三种绘图对象都具有text_formatting参数,用于设置排版强调以显示粗体、斜体或未格式化的文本。它接受常量text.format_bold、text.format_italic或text.format_none(无特殊格式;默认值)。也接受text.format_bold + text.format_italic来显示同时加粗和斜体的文本。
label.new()中的size参数以及box.new()和table.cell()中的text_size参数指定绘图对象中显示的文本大小。这些参数既接受“字符串”类型的size.*常量,也接受“整数”类型的排版大小。“字符串”类型的size.*常量代表六种固定大小选项之一。“整数”类型的大小值可以是任何正整数,允许脚本复制size.*值或使用其他自定义大小。
此表列出了表格、方框和标签的size.*常量及其等效的“整数”大小:
| “string” 常量 | “int” 表格和方框中的文本尺寸 | “int” 标签中的尺寸 |
|---|---|---|
size.auto | 0 | 0 |
size.tiny | 8 | ~7 |
size.small | 10 | ~10 |
size.normal | 14 | 12 |
size.large | 20 | 18 |
size.huge | 36 | 24 |
以下示例在最后一根可用柱上创建标签和表格。标签显示当前收盘值的字符串表示形式。单单元格表格显示一个字符串,表示当前收盘价与开盘价之间的价格和百分比差异。标签的文本大小由返回内置size.*常量值的字符串输入定义,表格的文本大小由整数输入定义。此外,脚本创建一个方框,可视化最近20根柱的最高价到最低价的范围。方框显示自定义文本,文本大小固定为19,以显示收盘价与当前最高价或最低价之间的距离。两个布尔输入指定所有三个绘图是否对其显示的文本应用粗体和斜体格式:

Mine Script®
已复制






























































