外观
线段与方框
约 15374 字大约 51 分钟
简介
Mine Script® 通过line(线段)、box(方框)和polyline(折线)类型,支持以编程方式在图表上绘制支撑阻力位、趋势线、价格区间等几何图形。
与普通绘图不同,这些对象类型具有更高的灵活性,能够在图表任意位置可视化当前计算数据(不受脚本执行所在K线的限制)。
线段、方框和折线属于对象类型(与标签、表格等特殊类型类似)。脚本通过ID引用这些对象(ID起指针作用)。与其他对象一致,这些ID具有“序列”特性,所有相关操作函数均接受“序列”参数。
注意
使用本页介绍的绘图对象类型时,通常需要配合数组操作——尤其是处理polyline(折线)时,必须使用chart.point实例构成的数组。因此,我们建议您充分掌握数组知识,以最大限度发挥这些绘图类型的潜力。
脚本绘制的线段可以是垂直、水平或斜向的,方框始终为矩形,而折线则按顺序连接多个垂直/水平/斜向或曲线段。尽管这些绘图类型特性各异,但具有以下共同点:
- 坐标范围:线段、方框和折线的坐标可位于图表任意位置(包括最后一根K线之后的未来时间点)
- 坐标设置:可通过chart.point实例定义坐标
- 横轴基准:根据
xloc属性设置,横坐标可使用K线序号或时间值 - 线型选择:支持多种预设线型
- 流程控制:可在循环和条件结构中调用绘图函数,实现迭代或条件化绘图
- 数量限制:单个脚本实例最多显示500条线段、500个方框和100条折线。用户可通过indicator()或strategy()声明语句中的
max_lines_count、max_boxes_count和max_polylines_count参数分别设置各类对象的上限值(未指定时默认约50个)。与标签和表格类型类似,当绘图对象总数超过限制时,线段/方框/折线将通过垃圾回收机制自动删除最旧的对象。
注意
在TradingVue图表中,一整套绘图工具允许用户通过鼠标操作创建和修改绘图。虽然这些工具绘制的图形有时可能与Mine脚本代码创建的绘图对象相似,但它们是彼此独立的实体。Mine脚本无法与来自图表用户界面的绘图工具进行交互,同时鼠标操作也不会直接影响Mine绘图对象。
线段
line.*命名空间中的内置函数用于线条对象的创建和管理:
- line.new()函数创建新线条
line.set_*()函数修改线条属性line.get_*()函数从线条实例获取值- line.copy()函数克隆线条实例
- line.delete()函数删除现有线条实例
- line.all变量引用一个包含脚本显示的所有线条ID的只读数组。数组大小取决于indicator()或strategy()声明语句中的
max_lines_count参数以及脚本已绘制的线条数量
脚本可以以函数或方法的形式调用line.set_*()、line.get_*()、line.copy()和line.delete()内置函数。
创建线段
line.new()函数用于在图表上创建新的线段对象,其定义形式如下:
line.new(first_point, second_point, xloc, extend, color, style, width, force_overlay) → series line
line.new(x1, y1, x2, y2, xloc, extend, color, style, width, force_overlay) → series line该函数的第一个重载版本包含first_point和second_point参数。first_point是一个表示线条起点的chart.point,second_point是一个表示线条终点的chart.point。该函数通过复制这些图表点的信息来确定线条的坐标。它使用first_point和second_point中的index字段还是time字段作为x坐标,取决于函数的xloc值。
第二个重载版本独立指定x1、y1、x2和y2值,其中x1和x2是表示线条起始和结束x坐标的整型值,y1和y2是表示y坐标的浮点值。线条将x值视为K线索引还是时间戳,取决于函数调用中的xloc值。
两种重载形式共享以下参数:
xloc 控制新线段x坐标使用K线序号还是时间值,默认值为xloc.bar_index。- 第一种重载形式中:xloc.bar_index表示使用
first_point和second_point的index字段, xloc.bar_time表示使用time字段 - 第二种重载形式中:xloc.bar_index将
x1/x2视为K线序号,xloc.bar_time将x1/x2视为时间值,注意:当x坐标为K线序号时,最小允许值为bar_index - 9999,更大偏移需使用xloc.bar_time。
- 第一种重载形式中:xloc.bar_index表示使用
extend 控制线段是否无限延伸超出定义坐标,可选值:- extend.left(向左延伸)
- extend.right(向右延伸)
- extend.both(双向延伸)
- extend.none(不延伸,默认值)
color指定线段颜色,默认为color.bluestyle设置线型(详见“线条样式”章节),默认为line.style_solidwidth线宽(像素单位),默认值1force_overlay设为true时强制在主图表显示(即使脚本位于独立面板),可选参数,默认false
以下示例展示了如何以最简单的形式绘制线条。该脚本在每根K线的水平中心位置绘制一条新的垂直线,连接开盘价和收盘价:

Mine Script®
已复制
请注意:
- 如果
firstPoint和secondPoint引用相同的坐标,脚本将不会显示线条(因为两点之间没有可绘制的距离),但线条ID仍然存在。 - 由于在indicator()函数调用中没有指定
max_lines_count参数,脚本在图表上仅会显示大约最近的50条线条。线条绘制会一直保留在图表上,直到使用line.delete()删除或被垃圾回收器移除。 - 脚本会在未闭合的K线(即带有橙色背景高亮的K线)上重新绘制线条,直到该K线闭合。K线闭合后,将不再更新该绘制。
让我们来看一个更复杂的示例。该脚本使用前一根K线的hl2价格以及当前K线的最高价和最低价,绘制一个包含用户指定数量线条的扇形图,这些线条预测下一根K线可能出现的一系列假设价格区间。该脚本在for循环中调用line.new()函数,在每根K线上创建linesPerBar条线:

Mine Script®
已复制
需要注意:
- 我们在indicator()函数调用中包含了
max_lines_count = 500参数,这意味着脚本会在图表上保留最多500条线。 - 每个line.new()调用都会复制
firstPoint和secondPoint变量所引用的chart.point信息。因此,脚本可以在每次循环迭代时修改secondPoint的price字段,而不会影响其他线条的y坐标。
修改线条
line.* 命名空间包含多个用于修改线条实例属性的setter函数:
- line.set_first_point() 和 line.set_second_point() 分别使用指定点的信息更新
id线条的起点和终点。 - line.set_x1() 和 line.set_x2() 将
id线条的某个x坐标设置为新值(根据线条的xloc属性,该值可以是K线索引或时间值)。 - line.set_y1() 和 line.set_y2() 将
id线条的某个y坐标设置为新值。 - line.set_xy1() 和 line.set_xy2() 使用新的x和y值更新
id线条的某个点。 - line.set_xloc() 设置
id线条的xloc属性,并用新的x1和x2值更新其所有x坐标。 - line.set_extend() 设置
id线条的extend属性。 - line.set_color() 更新
id线条的颜色值。 - line.set_style() 修改
id线条的样式。 - line.set_width() 设置
id线条的宽度。
所有设置函数都会直接修改传入的线条id,且不返回任何值。每个设置函数都接受"series"参数,因为脚本可以在执行过程中动态修改线条属性。
以下示例绘制连接特定时间周期开盘价和收盘价的线条:
- 使用var关键字声明
periodLine变量及引用chart.point值的变量(openPoint和closePoint),这些变量仅在首个K线初始化 - 当检测到时间周期变化时:
- 使用line.set_color()设置现有
periodLine的颜色 - 使用chart.point.now()为
openPoint和closePoint创建新值 - 使用这些点创建新线条并赋值给
periodLine
- 使用line.set_color()设置现有
在其他periodLine值不为na的K线上:
- 为
closePoint分配新的chart.point - 使用方法形式的line.set_second_point()和line.set_color()更新线条属性

Mine Script®
已复制
请注意:
本示例中的每条线条绘制均采用line.style_arrow_right样式 所有可用样式设置的完整说明请参阅下文"线条样式"章节
线条样式
用户可通过在line.new()或line.set_style()函数调用中传递以下任一变量作为style参数,来控制脚本线条的样式:
| 参数 | 线条 |
|---|---|
line.style_solid | ![]() |
line.style_dotted | ![]() |
line.style_dashed | ![]() |
line.style_arrow_left | ![]() |
line.style_arrow_right | ![]() |
line.style_arrow_both | ![]() |
请注意:
- 折线(polylines)同样可以使用这些变量作为其
line_style参数值 - 具体使用方法请参阅本文档创建折线章节
读取线条值
line.* 命名空间包含 getter 函数,允许脚本从线条对象中检索值以供进一步使用:
- line.get_x1() 和 line.get_x2() 分别从
idline获取第一个和第二个x坐标。返回值代表的是K线索引还是时间值取决于线条的xloc属性。 - line.get_y1() 和 line.get_y2() 分别获取
idline的第一个和第二个y坐标。 - line.get_price() 从指定
x值(包括线条起点和终点之外的K线索引)处的线条id检索价格(y坐标)。此函数仅兼容使用 xloc.bar_index 作为xloc值的线条。
该脚本在价格形成持续length根K线的上涨或下跌形态时绘制新线段。它使用var关键字在首个K线声明directionLine变量。分配给directionLine的ID将在后续K线持续存在,直到出现newDirection条件时,脚本会为该变量分配一条新线段。
在每根K线上,脚本以方法形式调用line.get_y2()、line.get_y1()、line.get_x2()和line.get_x1()获取函数,从当前directionLine检索数值并计算其斜率,该斜率用于确定每个绘图和指标的颜色。脚本使用line.get_price()获取directionLine第二个点之外的延伸值,并将它们绘制在图表上:

Mine Script®
已复制
需要注意以下事项:
- 本示例调用的是line.new()函数的第二种重载形式,该形式使用
x1、y1、x2和y2参数来定义线条的起点和终点。其中x1值为当前bar_index往前length根K线的位置,y1值为该位置对应的hlc3价格;而x2和y2参数则使用当前K线的bar_index和hlc3值。 - line.get_price()函数调用会将
directionLine视为无限延伸的线条进行处理,无论该线条实际的extend属性如何设置。 - 脚本在图表上仅会显示约50条最近的线条,但通过外推计算得出的数值会贯穿显示在整个图表历史中。
线条克隆
脚本可以使用line.copy()函数克隆线条ID及其所有属性。对复制线条实例的任何修改都不会影响原始线条。
例如,该脚本每隔length根K线在开盘价位置创建一条水平线,并将其赋值给mainLine变量。在其他所有K线上,它使用line.copy()创建copiedLine,并调用line.set_*()函数修改其属性。如下所示,修改copiedLine不会以任何方式影响mainLine:

Mine Script®
已复制
需要注意:
secondPoint的index字段设置为当前bar_index往后length根K线的位置- 由于使用xloc.bar_index时允许的最大x坐标值为
bar_index + 500 - 因此我们将
length输入参数的最大值(maxval)设置为500
删除线条
要删除脚本绘制的线条ID,请使用line.delete()函数。该函数会从脚本中移除线条实例,并删除其在图表上的绘制。
删除线条实例通常在以下情况下很有用:
- 当需要仅保留特定数量的线条在图表上时
- 或需要根据条件在图表推进过程中移除绘图时
例如,该脚本在RSI穿越其EMA时,会绘制一条带有extend.right属性的水平线。
脚本将所有线条ID存储在lines数组中,该数组被用作队列以仅显示图表上最新的numberOfLines条线。当数组大小超过指定的numberOfLines时,脚本会使用array.shift()移除数组中最旧的线条ID,并通过line.delete()将其删除:

Mine Script®
已复制
请注意:
- 我们使用“const int”限定类型声明了
MAX_LINES_COUNT变量,该变量被脚本同时用于:- indicator()函数中的
max_lines_count参数 - 赋值给
numberOfLines变量的input.int()函数的maxval参数
- indicator()函数中的
- 本示例使用line.new()函数的第二个重载版本,该版本独立指定
x1、y1、x2和y2坐标值。
填充线条之间的空间
脚本可以通过linefill.new()函数创建一个引用两条线条的线填充对象,来填充它们之间的空间。线填充会根据其引用的line1和line2 ID的属性自动确定填充边界。
例如,该脚本计算一个简单的线性回归通道。在首根K线上,脚本声明basisLine、upperLine和lowerLine变量来引用通道的线条ID,然后进行两次linefill.new()调用来创建填充通道上下部分的线填充对象。第一个线填充填充basisLine和upperLine之间的空间,第二个填充basisLine和lowerLine之间的空间。
脚本在后续K线上更新这些线条的坐标。但请注意,脚本从不需要更新在首根K线上声明的线填充对象。它们会根据所分配线条的坐标自动更新填充区域:

Mine Script®
已复制
要了解更多关于线填充(linefill)类型的信息,请参阅填充页面中的相关章节。
方框
box.*命名空间中的内置函数用于创建和管理方框对象:
- box.new()函数创建新方框
box.set_*()函数修改方框属性box.get_*()函数从方框实例获取值- box.copy()函数克隆方框实例
- box.delete()函数删除方框实例
- box.all变量引用包含脚本显示的所有方框ID的只读数组。数组大小取决于indicator()或strategy()声明语句中的
max_boxes_count参数以及脚本已绘制的方框数量
与线条一样,用户可以将box.set_*()、box.get_*()、box.copy()和box.delete()内置函数作为函数或方法进行调用。
创建方框
box.new()函数用于在图表上创建新的方框对象,具有以下两种签名形式:
box.new(top_left, bottom_right, border_color, border_width, border_style, extend, xloc, bgcolor, text, text_size, text_color, text_halign, text_valign, text_wrap, text_font_family, force_overlay) → series box
box.new(left, top, right, bottom, border_color, border_width, border_style, extend, xloc, bgcolor, text, text_size, text_color, text_halign, text_valign, text_wrap, text_font_family, force_overlay) → series box该函数的第一个重载版本包含top_left和bottom_right参数,分别接收表示方框左上角和右下角位置的chart.point对象。函数通过复制这些图表点的信息来设置方框角点的坐标。具体使用top_left和bottom_right中的index字段还是time字段作为x坐标,取决于函数的xloc参数值。
第二个重载版本直接指定方框的左、上、右、下边界值:
left和right参数接收表示方框左右x坐标的整型值(根据函数调用中的xloc参数,可以是K线索引或时间值)top和bottom参数接收表示方框上下y坐标的浮点值
两种重载形式共享以下参数:
border_color
- 设置方框四边边框颜色,默认为color.blue
border_width
- 边框宽度(像素单位),默认值1
border_style
- 边框样式(可选值参见方框样式章节)
extend
- 控制边框是否无限延伸:
- extend.left(向左延伸)
- extend.right(向右延伸)
- extend.both(双向延伸)
- extend.none(不延伸,默认值)
xloc
- 设置方框左右边界的x坐标类型:
- xloc.bar_index(使用K线序号,默认)
- xloc.bar_time(使用时间戳)
- 实现细节:
- 第一种重载中: ▸ xloc.bar_index使用
top_left/bottom_right的index字段 ▸ xloc.bar_time使用time字段 - 第二种重载中: ▸ xloc.bar_index将
left/right视为K线序号 ▸ xloc.bar_time视为时间戳 - 注意:当x坐标为K线序号时,最小允许值为
bar_index - 9999,更大偏移需使用xloc.bar_time。
- 第一种重载中: ▸ xloc.bar_index使用
bgcolor
- 方框内部填充色,默认为color.blue
text
- 方框内显示的文本内容,默认为空字符串
text_size
- 文本字号,可选值:size.tiny | size.small | size.normal | size.large | size.huge | size.auto(默认)
text_color
- 文本颜色,默认为color.black
text_halign
- 文本水平对齐方式:text.align_left | text.align_right | text.align_center(默认)
text_valign
- 文本垂直对齐方式:text.align_top | text.align_bottom | text.align_center(默认)
text_wrap
- 文本换行控制:
- text.wrap_auto(自动换行并裁剪超出部分)
- text.wrap_none(单行显示,允许超出边界,默认)
text_font_family
- 字体类型:
- font.family_default(系统默认字体,默认值)
- font.family_monospace(等宽字体)
force_overlay
- 设为
true时强制在主图表显示(即使脚本位于独立面板),可选参数,默认false
text_formatting
- 指定框文本的格式。使用text.format_none时,文本不带任何特殊格式。此参数也接受参数text.format_bold或text.format_italic。同时使用
text.format_bold + text.format_italic这两种格式,文本将同时以粗体和斜体显示。默认值为text.format_none。
让我们编写一个简单的脚本来在图表上显示方框。以下示例从当前K线的水平中心到下一个可用K线的中心,根据每个K线的最高价和最低价绘制一个方框。
在每个K线上,脚本通过 chart.point.now() 和 chart.point.from_index() 创建 topLeft 和 bottomRight 点,然后调用 box.new() 构建一个新方框并将其显示在图表上。它还使用 bgcolor() 在未确认的图表K线上高亮背景,以表示脚本会重新绘制该方框,直到该K线的最后一次更新:

Mine Script®
已复制
请注意:
bottomRight点的index字段比topLeft的index大一个K线。如果两个角的 x 坐标相同,脚本将在每个K线的水平中心绘制一条垂直线,类似于本页创建线条部分的示例。- 与线条类似,如果
topLeft和bottomRight的坐标完全相同,方框将不会显示在图表上,因为它们之间没有空间可供绘制。然而,其 ID 仍然存在。 - 由于未在 indicator() 函数调用中指定
max_boxes_count,此脚本仅在图表上显示大约最后 50 个方框。
修改方框
box.* 命名空间下存在多种设置函数,允许脚本修改方框对象的属性:
box.set_top_left_point()和box.set_bottom_right_point()分别使用指定点的信息更新id方框的左上角和右下角坐标。box.set_left()和box.set_right()将id方框的左侧或右侧x坐标设置为新的left/right值,该值可以是K线索引或时间值(取决于方框的xloc属性)。box.set_top()和box.set_bottom()将id方框的顶部或底部y坐标设置为新的top/bottom值。- box.set_xloc()设置框
xloc的属性id并将其 x 坐标更新为新的left值right,分别表示条形索引或时间值。 box.set_lefttop()设置id方框的左侧和顶部坐标,box.set_rightbottom()设置其右侧和底部坐标。box.set_border_color()、box.set_border_width()和box.set_border_style()分别更新id方框边框的颜色、宽度和样式。box.set_extend()设置id方框的水平延伸属性。box.set_bgcolor()将id方框内部空间的颜色设置为新颜色。box.set_text()、box.set_text_size()、box.set_text_color()、box.set_text_halign()、box.set_text_valign()、box.set_text_wrap()、box.set_text_font_family()和 box.set_text_formatting() 更新id方框的文本相关属性。
与 line.* 命名空间中的设置函数类似,所有 box 设置函数直接修改 id 方框而不返回值,且每个设置函数均接受“series”参数。
本示例使用方框可视化用户自定义时间范围内最高成交量的上涨和下跌K线的范围。当脚本检测到时间范围变化时,它会将新方框分配给 upBox 和 downBox 变量,重置 upVolume 和 downVolume 值,并高亮显示图表背景。
当上涨或下跌K线的成交量超过 upVolume 或 downVolume 时,脚本会更新成交量跟踪变量,并调用 box.set_top_left_point() 和 box.set_bottom_right_point() 来更新 upBox 或 downBox 的坐标。设置函数使用通过 chart.point.now() 和 chart.point.from_time() 创建的图表点信息,将该K线的最高价和最低价从当前时间投射到时间范围的收盘时间:
请注意:
- indicator() 函数调用中设置了
max_boxes_count = 100,这意味着脚本将保留图表上最近的 100 个方框。 - 本示例中同时使用了 box.new() 的两种重载形式:
- 在时间范围的首根K线上,若该K线为上涨K线,则调用第一种重载形式创建
upBox; - 若该K线为下跌K线,则调用第一种重载形式创建
downBox; - 对于同一根K线上的另一个方框变量(未触发条件的一方),则使用第二种重载形式为其分配一个值为
na的新方框。
- 在时间范围的首根K线上,若该K线为上涨K线,则调用第一种重载形式创建

Mine Script®
已复制
方框样式
用户可以在 box.new() 或 box.set_border_style() 函数调用中包含以下 line.style_* 变量之一,以设置脚本绘制方框的边框样式:
| 参数 (Argument) | 方框样式 (Box Style) |
|---|---|
line.style_solid | ![]() |
line.style_dotted | ![]() |
line.style_dashed | ![]() |
读取方框数值
box.* 命名空间包含多个获取函数,允许脚本从方框实例中检索坐标值:
- box.get_left() 和 box.get_right() 分别获取
id方框左右边缘的 x 坐标。返回值代表K线索引还是时间值取决于方框的xloc属性。 - box.get_top() 和 box.get_bottom() 分别获取
id方框顶部和底部的 y 坐标。
以下示例绘制方框来可视化假设的价格范围,时间跨度为 length 根K线。在每个新周期开始时,它使用平均蜡烛范围乘以 scaleFactor 输入值来计算方框的角点位置,该方框以 hl2 价格为中心且具有 initialRange 高度。绘制第一个方框后,它在 for 循环内创建 numberOfBoxes - 1 个新方框。
在每次循环迭代中,脚本通过从只读数组 box.all 中获取最后一个元素来得到 lastBoxDrawn,然后调用 box.get_top() 和 box.get_bottom() 来获取其 y 坐标。它使用这些值来计算新方框的坐标,新方框的高度是前一个方框的 scaleFactor 倍:

Mine Script®
已复制
请注意:
- indicator() 函数调用设置了
max_boxes_count = 500,这意味着脚本最多可在图表上显示500个方框。 - 每个绘制方框的右侧索引比左侧索引大
length根K线。由于这些方框的 x 坐标可能延伸至未来500根K线,我们已将length输入参数的maxval设为500。 - 在每个新周期开始时,脚本使用 color.rgb() 随机生成的数值作为方框的
border_color(边框颜色)和bgcolor(背景色)。 - 每次 box.new() 调用都会复制分配给
topLeft和bottomRight变量的 chart.point 对象的坐标值,因此脚本可以在每次循环迭代中修改它们的price字段,而不会影响其他方框。
克隆方框
要克隆特定方框 id,请使用 box.copy()。此函数会复制方框及其属性。对复制方框的任何修改都不会影响原始方框。
例如,该脚本在第一根K线上声明 originalBox 变量,并每隔 length 根K线为其分配一个新方框。在其他K线上,它使用 box.copy() 创建 copiedBox,并调用 box.set_*() 函数修改其属性。如下图所示,这些修改不会影响 originalBox:

Mine Script®
已复制
删除方框
要删除脚本绘制的方框,请使用 box.delete()。与其他绘图命名空间中的 *.delete() 函数类似,此函数可用于条件性删除方框或控制图表上显示的方框数量。
本示例展示代表周期性累积成交量值的方框。脚本每隔 length 根K线创建一个新方框 id 并将其存储在 boxes 数组中。若数组大小超过指定的 numberOfBoxes,则使用 array.shift() 移除数组中最旧的方框,并通过 box.delete() 删除该方框。
在其他K线上,脚本通过修改 boxes 数组中最后一个方框的顶部值来累积每周期成交量。随后使用 for 循环找出所有方框中的 highestTop 值,并根据各方框 box.get_top() 值与 highestTop 的相对比例设置渐变色背景:

Mine Script®
已复制
请注意:
- 在代码顶部,我们使用 “const int” 限定类型声明了
MAX_BOXES_COUNT变量。该值同时用作 indicator() 函数中的max_boxes_count参数,以及numberOfBoxes输入的最大可能值。 - 本脚本使用了 box.new() 函数的第二种重载形式,该形式需单独指定方框的左、顶、右、底坐标。
- 我们在 indicator() 调用中设置了 format.volume 作为格式参数,这表示图表面板的 y 轴将显示成交量数值。每个方框还会将其顶部值显示为成交量格式的文本。
折线
Mine Script 折线是高级绘图工具,可通过直线或曲线段依次连接由 chart.point 实例数组提供的坐标点。
这些强大的绘图工具能在图表任意位置连接最多 10,000 个点,使脚本能够绘制自定义序列、多边形及其他复杂几何图形——这些图形若使用线段或方框对象将难以或无法实现。
polyline.* 命名空间包含以下内置函数用于创建和管理折线对象:
- polyline.new() 函数用于创建新折线实例
- polyline.delete() 函数用于删除现有折线实例
- polyline.all 变量引用只读数组,包含脚本显示的所有折线
id。数组大小取决于 indicator() 或 strategy() 声明语句中的max_polylines_count参数及脚本绘制的折线数量
与线段或方框不同,折线不提供属性修改或读取函数。若需重绘折线,可删除现有实例后创建包含所需变更的新折线。
创建折线
polyline.new() 函数用于创建新的折线实例并显示在图表上,其函数签名如下:
polyline.new(points, curved, closed, xloc, line_color, fill_color, line_style, line_width, force_overlay) → series polyline以下八个参数会影响折线绘图的行为:
points
- 接受一个由chart.point对象组成的数组,用于确定折线中每个点的坐标。绘图会按顺序连接数组中每个元素的坐标,从第一个开始。折线是使用每个图表点的
index字段还是time字段作为x坐标,取决于函数调用中的xloc值。
curved 指定绘图是否使用曲线段来连接points数组中的每个chart.point。默认值为false,表示使用直线段。
closed 控制折线是否会将points数组中的最后一个chart.point连接到第一个,形成闭合折线。默认值为false。
xloc 指定折线使用points数组中每个chart.point的哪个字段作为x坐标。当值为xloc.bar_index时,函数使用index字段创建折线;当值为xloc.bar_time时,函数使用time字段。默认值为xloc.bar_index。
line_color 指定折线绘图中所有线段的颜色。默认为color.blue。
fill_color 控制折线绘图填充的闭合区域的颜色。默认值为na。
line_style 指定折线的样式,可以是本页线型样式部分中的任何可用选项。默认为line.style_solid。
line_width 指定折线的宽度(以像素为单位)。默认值为1。
force_overlay 如果为true,即使脚本位于单独的面板中,绘图也会显示在主图表面板上。可选参数,默认为false。
该脚本演示了在图表上绘制折线的简单示例。它每隔length根K线就将一个具有交替价格值的新chart.point推送到points数组中,并使用bgcolor()为背景着色一次。
在最后一根确认的历史K线上,脚本会在图表上绘制一条新的折线,按顺序连接数组中每个图表点的坐标,从第一个点开始:

Mine Script®
已复制
请注意:
- 该脚本仅使用一条折线,通过直线段连接数组中的每个图表点,且该绘图从第一根K线开始贯穿整个可用图表数据。
- 虽然使用线段也能实现类似效果,但每次满足
newPoint条件时都需要创建一个新的线段实例,且此类绘图最多只能包含500个线段。而这条未闭合的单一折线绘图最多可包含9,999个线段。
曲线绘图
折线可以绘制出其他方式(如线段或方框)无法实现的曲线。当启用polyline.new()函数的curved参数时,生成的折线会在其点数组中的每个chart.point坐标之间进行非线性插值,从而产生弯曲效果。
例如,我们先前示例中的“振荡折线”脚本使用直线段生成类似三角波的图形(即在波峰和波谷之间呈锯齿状)。若将该示例中polyline.new()调用的curved参数设为true,生成的图形会通过曲线段连接各点,形成类似正弦波的光滑非线性形状:

Mine Script®
已复制
请注意,在此示例中,平滑曲线的行为相对一致,且绘图没有任何部分超出其定义的坐标范围——但这并非曲线折线的常态。用于构建折线的数据会极大影响其在各点之间插值的平滑分段函数。在某些情况下,插值曲线可能会超出实际坐标范围。
让我们在示例的点数组中为图表点添加一些变化来演示这种行为。在下方修改版中,脚本在chart.point.now()调用中将yValue乘以随机值。
为直观展示该行为,此脚本还在点数组中每个chart.point的价格位置创建水平线,并显示另一条用直线段连接相同点的折线。如图所示,两条折线都通过了点数组中的所有坐标。但曲线折线偶尔会突破水平线标示的垂直边界,而使用直线段绘制的折线则不会出现这种情况:

Mine Script®
已复制
闭合形状
由于单条折线可包含大量直线或曲线段,且closed参数允许绘图连接其点数组中首个与末个chart.point的坐标,因此我们可以利用折线绘制多种不同类型的闭合多边形。
让我们在Mine中绘制一些多边形。以下脚本会定期在hl2价格值附近绘制随机化多边形。
每当满足newPolygon条件时,脚本会清空points数组,根据math.random()值计算新多边形的numberOfSides(边数)和rotationOffset(旋转偏移量),随后通过for循环向数组推送numberOfSides个新图表点——这些点包含椭圆路径(xScale和yScale为半轴)的阶梯状坐标。脚本通过用闭合折线(直线段)连接点数组中的每个chart.point来绘制多边形:

Mine Script®
已复制
请注意:
- 此示例显示图表上最后约50条折线,因为我们未在indicator()函数调用中指定
max_polylines_count值。 yScale计算将input.float()乘以ta.atr(2),使绘图的垂直比例适应近期价格波动范围。- 生成的多边形最大宽度为水平半轴的两倍(
2 * xScale),并四舍五入到最接近的整数。newPolygon条件使用该值来防止多边形绘图重叠。 - 脚本将
xValue计算四舍五入到最接近的整数,因为chart.point的index字段仅接受整数值(图表x轴不包含小数形式的K线索引)。
删除折线
要删除特定的折线ID,请使用polyline.delete()。此函数会从脚本及其图表绘图中移除该折线对象。
与其他绘图对象一样,我们可以使用polyline.delete()来维持特定数量的折线绘图,或根据条件从图表中移除绘图。
例如,下面的脚本会定期绘制近似的算术螺旋线,并将其折线ID存储在数组中,该数组被用作队列来管理显示的绘图数量。
当满足newSpiral条件时,脚本会创建一个points数组,并在for循环中添加图表点。在每次循环迭代中,它会调用用户定义的spiralPoint()函数来创建一个新的chart.point,其中包含随着角度增长而变化的椭圆路径的阶梯值。然后,脚本创建一个随机颜色的曲线折线来连接这些点坐标,并将其id推送到polylines数组中。
当数组大小超过指定的numberOfSpirals时,脚本会使用array.shift()移除最旧的折线,并使用polyline.delete()删除该对象:

Mine Script®
已复制
请注意:
- 我们声明了一个值为100的全局常量
MAX_POLYLINES_COUNT。该常量被同时用作indicator()函数的max_polylines_count参数和numberOfSpirals输入项的maxval(最大值)。 - 与前一节中「N边形」示例相同,由于chart.point的
index字段仅接受整数值,我们对x坐标的计算结果进行了四舍五入取整。 - 尽管绘图外观平滑,但每条折线的
points数组每个螺旋旋转周期仅包含4个chart.point对象。由于polyline.new()调用包含curved = true参数,每条折线都使用平滑曲线连接各点,从而在视觉上近似呈现螺旋线的实际曲率。 - 每个螺旋的宽度约为
4 * math.pi * rotations * xScale(四舍五入到最接近的整数)。我们在newSpiral条件中使用该值来间隔每个绘图并防止重叠。
重绘折线
在某些情况下,可能需要在脚本执行过程中修改折线绘图。虽然polyline.*命名空间不包含内置的设置函数,但我们可以通过删除现有折线并重新创建带有修改内容的新实例,来重绘变量或集合引用的折线。
以下示例使用polyline.delete()和polyline.new()调用来更新折线变量的值。
该脚本绘制连接包含length根K线的周期内开盘价、最高价、最低价和收盘点的闭合折线。它在第一根K线上创建currentDrawing变量,并在每根图表K线上为其分配折线id。脚本使用openPoint、highPoint、lowPoint和closePoint变量来跟踪周期内变化的OHLC值对应的图表点。当出现新值时,脚本会为这些变量分配新的chart.point对象,使用array.from将它们收集到数组中,然后创建连接数组各点坐标的新折线,并将其分配给currentDrawing。
当newPeriod条件为false时(即当前周期未完成),脚本会在创建新折线前删除currentDrawing引用的折线,从而产生随周期发展而变化的动态绘图:

Mine Script®
已复制
实时行为
线段、方框和折线都会受到提交(commit)和回滚(rollback)操作的影响,这些操作会影响脚本在实时K线上执行时的行为。请参阅Mine脚本执行模型的相关说明。
该脚本演示了在实时未确认的图表K线上执行时回滚操作产生的影响:

Mine Script®
已复制
此示例中的line.new()调用会在未确认K线数值变化时,在每次迭代中创建新的线段id。由于每次迭代前的回滚操作,脚本会自动删除该K线上每次变化时创建的对象。仅当K线收盘前最后创建的线段会被提交,且该线段实例将成为确认K线上保留的唯一对象。
限制条件
对象总数
线段、方框和折线会占用服务器资源,因此每个脚本的绘图对象数量存在限制。当脚本创建的绘图对象超过允许上限时,Mine脚本运行时会自动删除最旧的对象,这一过程称为垃圾回收。
单个脚本最多可包含500条线段、500个方框和100条折线。用户可通过在脚本的indicator()或strategy()声明语句中指定max_lines_count、max_boxes_count和max_polylines_count值来控制垃圾回收限制。
该脚本演示了Mine中的垃圾回收机制。它在每根K线上创建新的线段、方框和折线。由于未在indicator()函数调用中指定max_lines_count、max_boxes_count或max_polylines_count参数值,脚本将默认保留图表上最近的约50个线段、方框和折线对象(这是每个参数的默认设置):

Mine Script®
已复制
请注意:
- 我们使用了Tradingvue的「测量」绘图工具来测量脚本绘图对象覆盖的K线数量。
使用 xloc.bar_index 的未来坐标参考
采用 xloc.bar_index 定位的对象,其 x 坐标最多只能设置到未来 500 根 K 线处。
其他使用限制
脚本无法在 request.*() 函数中使用线段、方框或折线。这些类型的实例可以调用 request.*() 函数获取数值,但脚本只能在图表上下文中创建和绘制它们。
此限制也是为什么当 indicator() 声明语句中使用 timeframe 参数时,绘图对象将无法正常工作。
历史缓存与 max_bars_back
将 barstate.isrealtime 与绘图功能结合使用时,有时会产生意外结果。例如,本脚本的设计意图是忽略所有历史 K 线,仅在实时 K 线上绘制跨度 300 根 K 线的水平线段:
Mine Script®
已复制
但运行时将失败并报错。该脚本失败的原因是它无法确定基础时间序列历史值的缓冲区大小。虽然代码中不包含内置的time变量,但内置的bar_index在其内部运作中使用时间序列。因此,要获取300根K线前的bar_index值,要求时间序列的历史缓冲区至少为300根K线。
Mine脚本包含一个在大多数情况下能自动检测所需历史缓冲区大小的机制。其工作原理是允许脚本在有限时间内访问任意数量K线前的历史值。在本脚本案例中,使用barstate.isrealtime控制线段绘制会阻止其访问历史序列,因此无法推断所需的历史缓冲区大小,导致脚本失败。
此问题的简单解决方案是在评估条件结构前,使用max_bars_back()函数明确定义时间序列的历史缓冲区大小:
Mine Script®
已复制
这类问题可能令人困惑,但它们相当罕见。








