脚本(自定义指标与策略)

在交易平台里,脚本(Scripting)就是用代码写自己的指标和策略,让它们跑在平台的数据上,而不必被内置目录框死。指标脚本返回画在图上的数值;策略脚本返回决策,用来驱动模拟账户、回放、回测,或者在获准并且经过显式武装的前提下,驱动实盘订单。

Senzoukria · 术语表 · 更新于 2026 年 9 月


指标和策略是两种不同的脚本

指标脚本接收 K 线,返回一条或多条序列,画在主图或它自己的副图上。策略脚本接收同样的数据,在每根收盘 K 线上返回一个决策:买入、卖出、全平,或者什么都不做。这个区分很要紧,因为策略的后果会超出屏幕:它可以驱动一个模拟账户、在历史上被回测,或者通过一条必须单独获准的自动化通路抵达经纪商。

订单流脚本能拿到哪些输入

  • 每根 K 线内部、逐个价位的:主动卖出成交量、主动买入成交量,以及两者的 delta(主动买量减主动卖量)。
  • 失衡,按 ATAS 的约定做对角计算,把某价位的主动买量与下方一个跳动点的主动卖量相比。
  • K 线的 OHLC、时间戳和时段边界;光有这些,只够写经典的蜡烛图指标。
  • 缺失的数据保持缺失:一个没有成交记录的价位不是零成交量,脚本也应当这样对待它。

沙箱及其代价

在交易应用内部运行用户代码,首先是一个安全问题,其次才是一项功能。沙箱运行时没有网络、没有文件访问、也没有直接的经纪商 API;它接收数据、返回数值,运行太久就会被杀掉。代价是脚本没法抓取外部数据或写文件;好处是脚本里的一个 bug 既不会把应用搞崩,也不会误发一笔订单。

在 Senzoukria 里

脚本页面(「编写你自己的指标和全自动策略。一切都在这台机器上沙箱运行 —— 没有网络、没有文件访问、没有经纪商 API。」)把「指标」和「自动策略」分开,配有「新建指标」和「新建策略」按钮、一个编辑器、「在示例数据上运行」(Ctrl+Enter),以及若干模板:EMA 缎带、时段累计 delta、买方失衡、时段高/低点、ATR 百分比,还有一个突破策略。语言为 JavaScript、跑在内置解释器上的 Python,以及由 Clang 编译成 WebAssembly 的 C++17。脚本运行在一个隔离的 worker 里,预算为两秒;一个死循环只会杀掉它自己的 worker,绝不会杀掉应用。策略默认在模拟评估账户上交易;历史回测支持 JavaScript 和 Python,而 C++ 以指标身份运行,也可用于回放。实盘执行只存在于另行提供的自动驾驶面板中,需要一个兼容的 Rithmic 账户,并且要由你自己武装它。用你自己 API 密钥的助手,可以根据一段描述或一张截图来编写或修改脚本。

常见错误

  • 把一个在示例数据上没报错就跑完的脚本,当成一套已经过检验的策略。
  • 把缺失的价位读成零,还拿它去算失衡。
  • 以为选哪种语言无所谓;回测和回放的通路是随语言而不同的。
  • 指望脚本自己下单;脚本返回的是决策,接下来会发生什么由平台和它的权限决定。

其他语言版本

常见问题

写交易脚本该用哪种语言?
按你需要做的操作来选。在 Senzoukria 里,JavaScript 和 Python 策略有历史回测通路;C++ 通过它的 WebAssembly 运行时以指标身份运行、也可用于回放,但没有历史回测。要写第一个指标,你已经读得最顺手的那种语言就是对的。
脚本能把订单发给我的经纪商吗?
不能直接发。策略脚本返回的是决策;默认情况下,这些决策驱动的是模拟账户、回放或回测。要抵达经纪商,需要平台另行提供的自动化通路、一个已连接且具备自动化权限的兼容账户,以及交易者本人的显式武装。
我的指标为什么什么都没返回?
通常是因为脚本期待了一个在示例数据或该行情里并不存在的字段、返回的形状不对,或者超出了执行预算。请先在示例数据上运行它,把语法错误和缺失字段暴露出来,然后再去检查图表实际持有的数据,最后才怀疑公式本身。

继续阅读