Scripts en C++: la cadena Clang en WebAssembly y la ABI v1
Senzoukria puede compilar un script C++17 a WebAssembly dentro de su entorno aislado con un Clang real y ejecutarlo luego sobre las barras del gráfico. La cadena de herramientas se descarga una vez a petición, se verifica por tamaño y SHA-256, y expone una ABI pequeña: of_compute pinta un valor por barra, of_strategy devuelve intenciones de compra/venta para la cuenta simulada.
Senzoukria · Documentación · Actualizado en septiembre de 2026
Dónde encontrarlo
- Dónde
- Página Scripting → selector de lenguaje → C++ (aparece una banda «Cadena C++» encima del editor de código)
- Cadena de herramientas
- Clang 8.0.1 + LLD + libc++ compilados a WebAssembly, fijados al commit 648c4a89 de Binji wasm-clang; unos 60,4 MB (mostrados como «60.4 Mo») descargados una sola vez
- Capacidad
- 256 barras más recientes por llamada; código de hasta 64 KiB; 2 s por ejecución; tiempo de compilación máximo 45 s
- Alcance de las estrategias
- Solo cuenta simulada; la aplicación nunca convierte una intención C++ en una orden al bróker
Qué hace
El motor C++ es el tercer lenguaje de scripting, junto a JavaScript y Python. Elegir C++ en el selector de lenguaje de la página Scripting muestra la banda «Cadena C++». Su primer estado es «No instalada», con el botón «Instalar la cadena C++» y la nota «Unos 60.4 Mo de descarga, una sola vez (Clang 8.0.1 + LLD + libc++, Apache-2.0).». Los cinco archivos (clang, lld, memfs, sysroot.tar, shared.js) se descargan del commit fijado de GitHub, cada uno se rechaza si su número de bytes o su SHA-256 difiere del valor escrito en la aplicación, y se guardan en IndexedDB para que la descarga ocurra una sola vez.
Arrancar el motor compila unos 50 MB de WebAssembly, y por eso «Arrancando el motor…» es un estado visible, distinto de la ejecución de un script. Una vez listo, la banda imprime «Versión wasm-clang-648c4a89, arrancado en {ms} ms», seguida de la línea de límites. Cada script se compila una vez, con clave en el SHA-256 del código compuesto (cabecera del anfitrión + tu código); volver a ejecutar el mismo script a la cadencia del gráfico no recompila nunca. El anfitrión conserva hasta 8 módulos compilados, y el worker otros 8.
La ABI que ve tu script
| Símbolo | Significado | Notas |
|---|---|---|
| struct OfBar | bucket_ts_ns (int64), open, high, low, close, volume, delta (double), trades (uint32) | 64 bytes, la barra más antigua primero, n ≤ 256 |
| int of_compute(const OfBar* bars, uint32_t n, double* out, uint32_t out_len) | Escribe un valor por barra en out[i]; NaN significa sin valor; devuelve n | Se pinta como una única línea verde (#7ed321, grosor 1) en el gráfico |
| int of_strategy(const OfBar* bars, uint32_t n, int32_t* out, uint32_t out_len) | Escribe una intención por barra: −1 vender, 0 nada, +1 comprar | Solo se lee la intención de la última barra; qty, stopTicks y targetTicks salen de los parámetros del script |
| OF_CAPACITY | 256 | Las barras más antiguas que la capacidad no se transmiten; una línea de aviso dice cuántas se omitieron |
| #line 1 "script.cpp" | Los números de línea de los diagnósticos coinciden con tu editor | El primer «script.cpp:N:M: error» fija la línea resaltada |
Estados del motor y controles
| Estado | Mostrado como | Acción disponible |
|---|---|---|
| ausente | No instalada + nota de tamaño | Instalar la cadena C++ |
| descargando | Descargando el motor… {percent} % | Cancelar la descarga |
| arrancando | Arrancando el motor… | ninguna (tiempo máximo de arranque 120 s) |
| lista | Motor disponible, versión y tiempo de arranque, límites | Quitar el motor (purga los módulos del worker y la caché de IndexedDB) |
| error | Motor inaccesible + mensaje | Reintentar |
Cómo usarlo
Crea un script nuevo, elige C++ y parte de la plantilla por defecto: una media móvil simple de 20 períodos escrita con una suma corriente, NaN durante el calentamiento y retorno de n. Ejecútala con el mismo botón Ejecutar que los scripts JavaScript. Los avisos y errores del compilador llegan a la consola como líneas de registro; una ejecución que supera el presupuesto de 2 segundos falla como cualquier otro script. Hoy solo se incluye una plantilla C++, esa media móvil; no hay ninguna estrategia C++ preparada. Basta con que escribas tú of_strategy: sus intenciones siguen la misma ruta de decisión que las estrategias JavaScript, hacia la cuenta de evaluación simulada y nada más.
Si un gráfico contiene más de 256 barras, la consola imprime «La ABI C++ v1 calcula las 256 barras más recientes: N barra(s) más antigua(s) no tienen valor.». Las barras más antiguas simplemente se dibujan sin valor, en vez de rellenarse con una suposición.
Límites y trampas
- C++17 está soportado; C++20 no se promete de forma explícita. Cabeceras como <cmath>, <vector> y <numeric> están disponibles desde libc++.
- El código está limitado a 64 KiB incluida la cabecera del anfitrión; el módulo compilado puede usar hasta 64 MiB de memoria.
- El motor se descarga solo desde raw.githubusercontent.com; una redirección se rechaza y un archivo cuyo tamaño o hash difiera se rechaza antes de llegar al entorno aislado.
- Si el entorno aislado se reinicia o la cadena se quita durante una compilación, la ejecución informa «el entorno aislado se reinició o la cadena se quitó durante la compilación: vuelve a ejecutar».
- Ejecutar un script C++ antes de instalar la cadena devuelve «cadena C++ no arrancada: instálala desde la página Scripting»; la ejecución tiene éxito automáticamente en cuanto el motor está listo.
Páginas relacionadas
- Editor de indicadores del usuario en el gráfico
- Salidas de script: superpuesta, panel, tabla y panel de valores
- Asistente de scripting (IA)
- Probar una estrategia de trading
Esta página en otros idiomas
Preguntas frecuentes
- ¿La cadena C++ necesita conexión a internet cada vez?
- No. Los cinco archivos se descargan una vez, se verifican y se conservan en IndexedDB. Los arranques posteriores leen la caché y funcionan por completo sin conexión; «Quitar el motor» borra esa caché.
- ¿Puede una estrategia C++ enviar órdenes a mi bróker?
- No. of_strategy produce intenciones −1/0/+1 que se convierten en decisiones para la cuenta simulada, por la misma ruta que las estrategias JavaScript. Ningún script de Senzoukria coloca una orden en el bróker.
- ¿Por qué mi indicador se detiene después de 256 barras?
- La ABI v1 transmite las 256 barras más recientes por llamada. Las más antiguas no tienen valor y la consola dice cuántas se omitieron.