C++ 脚本:WebAssembly Clang 工具链与 ABI v1
Senzoukria 可以在沙箱内用真正的 Clang 把 C++17 脚本编译成 WebAssembly,然后在图表的 K 线上运行。工具链按需下载一次,通过大小和 SHA-256 校验,并暴露一个很小的 ABI:of_compute 为每根 K 线绘制一个值,of_strategy 为模拟账户返回买卖意图。
Senzoukria · 文档 · 更新于 2026 年 9 月
位置
- 位置
- 脚本页面 → 语言选择器 → C++(代码编辑器上方会出现「C++ 工具链」状态条)
- 工具链
- 编译为 WebAssembly 的 Clang 8.0.1 + LLD + libc++,固定在 Binji wasm-clang 提交 648c4a89;约 60.4 MB(显示为「60.4 Mo」),只下载一次
- 容量
- 每次调用最近 256 根 K 线;源码最多 64 KiB;每次运行 2 秒;编译超时 45 秒
- 策略范围
- 仅限模拟账户;应用绝不会把 C++ 意图变成经纪商订单
它做什么
C++ 引擎是继 JavaScript 和 Python 之后的第三种脚本语言。在脚本页面的语言选择器中选择 C++ 会显示「C++ 工具链」状态条。它的第一个状态是「未安装」,配有按钮「安装 C++ 工具链」和说明「约需下载 60.4 Mo,只需一次(Clang 8.0.1 + LLD + libc++,Apache-2.0)。」五个文件(clang、lld、memfs、sysroot.tar、shared.js)从固定的 GitHub 提交获取,只要字节数或 SHA-256 与应用内写定的值不符就会被拒绝,通过后存入 IndexedDB,因此下载只发生一次。
启动引擎需要编译约 50 MB 的 WebAssembly,所以「正在启动引擎…」是一个与脚本运行相区分的可见状态。就绪后,状态条会显示「版本 wasm-clang-648c4a89,启动耗时 {ms} 毫秒」,后面跟着限制说明行。每个脚本只编译一次,以组合源码(宿主头部 + 你的代码)的 SHA-256 作为键;按图表节奏重复运行同一个脚本绝不会重新编译。宿主最多保留 8 个已编译模块,worker 同样保留 8 个。
你的脚本看到的 ABI
| 符号 | 含义 | 说明 |
|---|---|---|
| struct OfBar | bucket_ts_ns(int64)、open、high、low、close、volume、delta(double)、trades(uint32) | 64 字节,最旧的 K 线在前,n ≤ 256 |
| int of_compute(const OfBar* bars, uint32_t n, double* out, uint32_t out_len) | 为每根 K 线向 out[i] 写入一个值;NaN 表示无值;返回 n | 在图表上绘制为一条绿色线(#7ed321,宽度 1) |
| int of_strategy(const OfBar* bars, uint32_t n, int32_t* out, uint32_t out_len) | 为每根 K 线写入一个意图:−1 卖出,0 不动作,+1 买入 | 只读取最后一根 K 线的意图;qty、stopTicks 和 targetTicks 来自脚本参数 |
| OF_CAPACITY | 256 | 超出容量的更早 K 线不会传入;会有一行警告说明跳过了多少根 |
| #line 1 "script.cpp" | 诊断信息中的行号与你的编辑器一致 | 第一条「script.cpp:N:M: error」决定高亮的那一行 |
引擎状态与控件
| 状态 | 显示为 | 可用操作 |
|---|---|---|
| absent | 未安装 + 大小说明 | 安装 C++ 工具链 |
| downloading | 正在下载引擎… {percent}% | 取消下载 |
| starting | 正在启动引擎… | 无(启动超时 120 秒) |
| ready | 引擎就绪、版本与启动时间、限制说明 | 移除引擎(清除 worker 模块和 IndexedDB 缓存) |
| error | 引擎不可用 + 错误信息 | 重试 |
怎么用
新建一个脚本,选择 C++,从默认模板开始:用累加和写成的 20 周期简单移动平均线,预热期返回 NaN,最后返回 n。用与 JavaScript 脚本相同的「运行」按钮执行它。编译器的警告和错误以日志行的形式出现在控制台;超出 2 秒预算的运行会像任何其他脚本一样失败。目前只有一个 C++ 模板,就是这条移动平均线;没有现成的 C++ 策略。你自己写一个 of_strategy 就够了:它的意图走的是与 JavaScript 策略相同的决策路径,终点只有模拟评估账户。
如果图表上超过 256 根 K 线,控制台会打印「C++ ABI v1 计算最近 256 根 K 线:另有 N 根更早的 K 线没有取值。」更早的 K 线只是画成没有取值,而不是用猜测去填补。
限制与陷阱
- 支持 C++17;C++20 明确不作承诺。libc++ 提供 <cmath>、<vector> 和 <numeric> 等头文件。
- 源码上限为 64 KiB(含宿主头部);编译出的模块最多可使用 64 MiB 内存。
- 引擎只从 raw.githubusercontent.com 下载;重定向会被拒绝,大小或哈希不符的文件在进入沙箱之前就被拒收。
- 如果编译过程中沙箱重启或工具链被移除,运行会报告「编译期间沙箱重启或工具链被移除——请重新运行」。
- 在工具链安装之前运行 C++ 脚本会返回「C++ 工具链未启动——请在脚本页面安装」;引擎就绪后运行会自动成功。
相关页面
其他语言版本
常见问题
- C++ 工具链每次都需要联网吗?
- 不需要。五个文件只下载一次,经过校验后保存在 IndexedDB 中。之后启动会读取缓存并完全离线运行;「移除引擎」会清空该缓存。
- C++ 策略能向我的经纪商发送订单吗?
- 不能。of_strategy 产生的是 −1/0/+1 意图,这些意图会被转换成模拟账户的决策,路径与 JavaScript 策略相同。Senzoukria 中没有任何脚本会下经纪商订单。
- 为什么我的指标在 256 根 K 线之后就停了?
- ABI v1 每次调用只传入最近 256 根 K 线。更早的 K 线没有取值,控制台会说明跳过了多少根。