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

Declaraciones que el anfitrión añade antes de tu código (no las redeclares)
SímboloSignificadoNotas
struct OfBarbucket_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 nSe 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 comprarSolo se lee la intención de la última barra; qty, stopTicks y targetTicks salen de los parámetros del script
OF_CAPACITY256Las 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 editorEl primer «script.cpp:N:M: error» fija la línea resaltada

Estados del motor y controles

Estados de la banda de la cadena C++ y los botones que se muestran en cada uno
EstadoMostrado comoAcción disponible
ausenteNo instalada + nota de tamañoInstalar la cadena C++
descargandoDescargando el motor… {percent} %Cancelar la descarga
arrancandoArrancando el motor…ninguna (tiempo máximo de arranque 120 s)
listaMotor disponible, versión y tiempo de arranque, límitesQuitar el motor (purga los módulos del worker y la caché de IndexedDB)
errorMotor inaccesible + mensajeReintentar

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.

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.