脚本:编写指标(JavaScript)

指标脚本定义 compute(bars, params, ctx) 并返回一组输出。本页列出它可以返回的形态、参数从哪里读取,以及脚本保存在何处。

Senzoukria · 文档 · 更新于 2026 年 9 月


位置

位置
脚本页面 → 新建指标
入口函数
compute(bars, params, ctx),返回一个输出数组
绘制目标
「叠加在图表上」或「独立窗格」
默认语言
JavaScript;未记录语言的脚本按 JavaScript 读取
预算
每次运行 2 秒,在无网络、无文件访问、无平台接口的 worker 中执行

它做什么

compute() 接收 K 线、参数值和一个上下文,返回一组输出。渲染器只认识这些输出,永远不知道是哪个脚本产生的,所以新增一个指标不会触碰渲染管线。

时间由每根 K 线以纳秒表示的时间桶戳承载,它是整条足迹图管线的时间键。取值为 null 的点表示缺口:渲染器会抬笔,而不是穿过预热期或时段重置画出一条虚假的直线。

有两条约定值得遵守,因为内置指标都是这么做的:某一价位的 delta 等于主动买量减主动卖量,一根 K 线的 delta 是其各价位之和;以及最小变动价位(tick size)来自上下文,绝不写死。

输出形态

指标可以返回的形态
形态默认值它改变什么
line宽度 1与 K 线对齐的一条序列;null 值表示缺口。
histogram带正负两种颜色的柱;没有取值的 K 线不产生点。
bands填充 0.12上轨、中轨和下轨三条序列,填充不透明度限制在 0 到 1 之间。JavaScript 中没有 lib.bands 辅助函数:在 Python 中用 of.bands 构建,或直接返回一个普通对象。
markers在某根 K 线的某个价格上打点,形状可为圆点、上箭头、下箭头或方块,可附标签。
levelsto = null从一根 K 线延伸到另一根的水平线;终点为 null 时一直延伸到右边缘。
table左对齐DOM 中的浮动表格——可以阅读、选中和复制。
panel由「标签 + 数值」行组成的小面板,可选着色。

参数

参数可以在编辑器面板中声明,但脚本也可以直接从源码读取某个键。参数读取器会静态扫描代码中真正写出的三种写法——params.get("key", default)、params["key"] 和 params.key ?? default——以及把 params 包在单行 lambda 或箭头函数里的别名形式。

回测助手的「探索所有可读参数」选项正是以此为依据:它会从你的脚本真正读取的参数中生成最多五个维度,取值围绕各自的默认值展开。那是一个可以修改的字段里的建议,不是契约:拼接出来的键或对字典的遍历不会被识别。

限制与陷阱

  • 返回上述形态之外的内容会被报告为无法识别的返回值,而不是被绘制出来。
  • 一次没有报错却什么都没画出来的运行,通常意味着返回的值不是数字。
  • 脚本保存在本机的本地存储中;它们不会被同步,也不会被自动备份。
  • table 和 panel 是唯二不在画布上绘制的形态——它们以 DOM 呈现,因为表格必须可以选中。

其他语言版本

常见问题

怎样把我的指标放到图表上?
先保存,然后打开「在图表上显示」。它会进入指标面板的「我的脚本」分组,在那里像其他指标一样开关。
一个脚本可以返回多个输出吗?
可以。compute() 返回一个数组,内置指标也是这么做的——例如一个 VWAP 会同时输出一个 bands 和一条 line。
为什么图表开头处我的均线不见了?
因为预热期的值返回的是 null,而 null 会让渲染器抬笔。穿过这些点作图等于凭空捏造周期尚未产生的数据。