外观
表格
约 3426 字大约 11 分钟
简介
表格是一种可用于在脚本的可视空间中特定且固定位置放置信息的对象。与 Mine Script® 中绘制的所有其他图表或对象不同,表格不会锚定到特定的 K 线;无论脚本处于叠加模式还是窗格模式,无论是研究还是策略,表格都会浮动在脚本的空间中,与所查看的图表 K 线或使用的缩放因子无关。
表格包含按列和行排列的单元格,类似于电子表格。表格的创建和填充分为两个不同的步骤:
- 使用 table.new() 定义表格的结构和关键属性,该函数返回一个表格 ID,其作用类似于指向表格的指针,就像标签、线段或数组 ID 一样。table.new() 调用会创建表格对象,但不会显示它。
- 创建后,为了显示表格,必须为每个单元格调用一次 table.cell() 来填充表格。表格单元格可以包含文本,也可以不包含。此第二步是定义单元格宽度和高度的时候。
可以使用 table.set*() 设置函数更改先前创建的表格的大多数属性。可以使用 table.cell_set*() 函数修改先前填充的单元格的属性。
表格通过锚定到九个参考点之一(四个角或中点,包括中心)来定位在指标的空间中。表格的定位方式是从其锚点展开表格,因此锚定到 position.middle_right 参考点的表格将从该锚点向左、向上和向下展开绘制。
有两种模式可用于确定表格单元格的宽度/高度:
- 默认的自动模式根据列/行中最宽/最高的文本计算单元格的宽度/高度。
- 显式模式允许程序员使用指标可用
x/y空间的百分比来定义单元格的宽度/高度。
显示的表格内容始终表示表格的最后状态,即脚本最后一次执行时在数据集的最后一根 K 线上绘制的状态。与数据窗口或指标值中显示的值不同,表格中显示的变量内容不会随着脚本用户在特定图表 K 线上移动光标而改变。因此,强烈建议始终将所有 table.*() 调用的执行限制在数据集的第一根或最后一根 K 线上。相应地:
- 使用 var 关键字声明表格。
- 将所有其他调用包含在 if barstate.islast 块中。
只要每个表格锚定到不同的位置,就可以在一个脚本中使用多个表格。每个表格对象由其自己的 ID 标识。所有表格中单元格数量的限制由脚本中使用的单元格总数决定。
创建表格
使用 table.new() 创建表格时,必须提供三个参数:表格位置、列数和行数。另有五个可选参数:表格背景色、外框颜色和宽度,以及所有单元格边框(不包括外框)的颜色和宽度。除列数和行数外,所有表格属性均可通过以下设置函数修改:table.set_position()、table.set_bgcolor()、table.set_frame_color()、table.set_frame_width()、table.set_border_color() 和 table.set_border_width()。
可使用 table.delete() 删除表格,或使用 table.clear() 选择性清除表格内容。
使用 table.cell() 填充单元格时,必须提供四个参数:单元格所属表格的 ID、从零开始的列索引和行索引,以及单元格包含的文本字符串(可为空)。另有七个可选参数:单元格宽度和高度、文本属性(颜色、水平和垂直对齐方式、大小)以及单元格背景色。所有单元格属性均可通过以下设置函数修改:table.cell_set_text()、table.cell_set_width()、table.cell_set_height()、table.cell_set_text_color()、table.cell_set_text_halign()、table.cell_set_text_valign()、table.cell_set_text_size() 和 table.cell_set_bgcolor()。
请注意,每次调用 table.cell() 都会重新定义单元格的所有属性,覆盖之前对同一单元格的所有属性设置。
在固定位置显示单个值
让我们创建第一个表格,将ATR值显示在图表右上角。首先创建一个单元格表格,然后填充该单元格:

Mine Script®
已复制
请注意:
- 使用 var 关键字声明 table.new() 创建的表格
- 在 if barstate.islast 代码块中通过 table.cell() 填充单元格
- 填充单元格时未指定宽度和高度,单元格尺寸将根据文本内容自动调整
- 在 if 代码块外部调用
ta.atr(14)以保证每根 K 线都进行计算。若在 if 代码块内部使用str.tostring(ta.atr(14)),该函数将无法正确计算,因其仅在数据集最后一根 K 线调用,无法获取之前 K 线的必要计算值
现在我们来优化脚本的实用性和美观性:

Mine Script®
已复制
请注意:
- 使用 table.new() 定义了背景色、边框颜色及其宽度
- 通过 table.cell() 填充单元格时,将文本颜色设为白色
- 将 format.mintick 作为第二个参数传递给 str.tostring() 函数,以将 ATR 的精度限制为图表的最小变动价位
- 现在使用输入参数允许脚本用户指定 ATR 周期。该输入还包含工具提示,用户将鼠标悬停在脚本“设置/输入”选项卡中的“i”图标上时可以看到。
图表背景着色示例
本示例使用单单元格表格,根据RSI的多空状态为图表背景着色:
Mine Script®
已复制
请注意:
- 我们为用户提供输入选项,允许他们指定用于背景的多头/空头颜色,并将这些输入颜色作为参数传递给
colorChartBg()函数 - 我们仅创建一次表格,使用 var 关键字声明表格
- 我们仅在最后一根 K 线上使用 table.cell() 来指定单元格属性。我们将单元格设置为指标空间的宽度和高度,使其覆盖整个图表
创建显示面板
表格是创建复杂显示面板的理想选择。它们不仅能让面板始终固定在可视区域,还提供更灵活的格式控制——每个单元格的背景、文本颜色、大小和对齐方式等属性均可单独设置。
本例创建一个基础显示面板,展示用户指定数量的移动平均线数值。第一列显示均线周期,第二列显示其数值,并根据价格相对均线位置使用绿/红/灰背景色:当价格高于/低于均线时,单元格背景分别显示为多头/空头颜色;当均线位于当前K线开盘价与收盘价之间时,则使用中性色背景。

Mine Script®
已复制
请注意:
- 用户可通过输入选项选择表格位置,以及右侧列单元格背景使用的多头/空头/中性颜色
- 表格行数由用户选择的移动平均线数量决定,并额外添加一行作为列标题
- 虽然仅在最后一根K线填充表格单元格,但需要在每根K线执行ta.sma()调用以确保计算结果正确。编译时出现的警告可安全忽略
- 使用
group将输入参数分为两个部分,通过inline将相关参数置于同一行,并利用tooltip为某些字段的限制条件提供说明文档
热力图显示项目
我们接下来的项目是一个热力图,用于显示当前价格相对于历史值的多空关系。为此,我们将在图表底部放置一个表格。该表格仅显示颜色而不包含文本,通过为单元格背景着色来生成热力图。热力图使用用户可选的回溯周期,循环检查当前价格相对于该周期内每根K线的位置关系,并随着时间回溯逐渐降低多空颜色的显示强度:

Mine Script®
已复制
请注意:
- 我们定义了
MAX_LOOKBACK常量作为最大回溯周期。这个重要数值有两个用途:指定单行表格的列数,以及确保函数中的_src参数具有足够的历史缓冲区大小,以便在for循环中引用所需数量的历史值。 - 我们允许用户通过输入选项配置多空颜色,并使用
inline将这些颜色选择项排列在同一行。 - 在函数内部,我们将表格创建代码封装在if barstate.islast结构中,确保仅在图表最后一根K线执行。
- 表格初始化在if语句内部完成。由于使用了var关键字,初始化仅在脚本首次在最后一根K线执行时发生。注意这种行为与脚本全局作用域中var声明的区别(后者在数据集的第一根K线,即bar_index为零时初始化)。
- 在table.cell()调用中,我们没有指定
text参数,因此使用空字符串。 - 我们设计的透明度计算方式使得颜色强度随着历史回溯逐渐减弱。
- 使用动态颜色生成技术根据需要创建不同透明度的基础颜色。
- 与Mine脚本中其他显示对象不同,此热力图的单元格不与图表K线关联。配置的回溯周期决定热力图包含的表格单元格数量,且热力图不会随图表水平平移或缩放而改变。
- 脚本可视空间中可显示的单元格最大数量取决于显示设备的分辨率和图表所占区域。更高分辨率的屏幕和更宽的窗口可以显示更多表格单元格。
使用技巧
在策略脚本中创建表格时需注意:除非策略设置calc_on_every_tick=true,否则封装在if barstate.islast代码块中的表格代码不会在每次实时更新时执行,这将导致表格显示不符合预期。
关键注意事项:
- 连续调用table.cell()会覆盖该单元格之前的所有属性设置,如需修改单元格属性应使用
setter函数 - 通过将表格代码限制在必要的K线上执行,可节省服务器资源并提升图表显示速度