脚本:编写指标(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 线的某个价格上打点,形状可为圆点、上箭头、下箭头或方块,可附标签。 |
| levels | to = 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 会让渲染器抬笔。穿过这些点作图等于凭空捏造周期尚未产生的数据。