Script C++: la toolchain Clang in WebAssembly e l'ABI v1

Senzoukria può compilare uno script C++17 in WebAssembly dentro la propria sandbox con un vero Clang, poi eseguirlo sulle barre del grafico. La toolchain si scarica una volta sola su richiesta, verificata per dimensione e SHA-256, ed espone un ABI ridotto: of_compute traccia un valore per barra, of_strategy restituisce intenzioni di acquisto o vendita per il conto simulato.

Senzoukria · Documentazione · Aggiornato a settembre 2026


Dove trovarlo

Dove
Pagina Scripting → selettore del linguaggio → C++ (sopra l'editor compare una fascia «Toolchain C++»)
Toolchain
Clang 8.0.1 + LLD + libc++ compilati in WebAssembly, fissati al commit Binji wasm-clang 648c4a89; circa 60,4 MB (mostrati come «60.4 Mo») scaricati una volta sola
Capacità
256 barre più recenti per chiamata; sorgente fino a 64 KiB; 2 s per esecuzione; timeout di compilazione 45 s
Perimetro della strategia
Solo conto simulato; l'app non trasforma mai un'intenzione C++ in un ordine al broker

Che cosa fa

Il motore C++ è il terzo linguaggio di scripting accanto a JavaScript e Python. Scegliendo C++ nel selettore del linguaggio della pagina Scripting compare la fascia «Toolchain C++». Il suo primo stato è «Non installata» con il pulsante «Installa la toolchain C++» e la nota «Circa 60.4 Mo da scaricare, una volta sola (Clang 8.0.1 + LLD + libc++, Apache-2.0).». I cinque file (clang, lld, memfs, sysroot.tar, shared.js) vengono scaricati dal commit GitHub fissato, ognuno rifiutato se il numero di byte o lo SHA-256 differisce dal valore scritto nell'app, e conservati in IndexedDB perché il download avvenga una volta sola.

Avviare il motore compila circa 50 MB di WebAssembly: per questo «Avvio del motore…» è uno stato visibile e distinto dall'esecuzione di uno script. Una volta pronta, la fascia stampa «Versione wasm-clang-648c4a89, avviato in {ms} ms» seguita dalla riga dei limiti. Ogni script viene compilato una volta sola, con chiave lo SHA-256 del sorgente composto (intestazione dell'host + il tuo codice); rieseguire lo stesso script alla cadenza del grafico non ricompila mai. L'host conserva fino a 8 moduli compilati, e altrettanti il worker.

L'ABI che il tuo script vede

Dichiarazioni aggiunte dall'host prima del tuo codice (non ridichiararle)
SimboloSignificatoNote
struct OfBarbucket_ts_ns (int64), open, high, low, close, volume, delta (double), trades (uint32)64 byte, la barra più vecchia per prima, n ≤ 256
int of_compute(const OfBar* bars, uint32_t n, double* out, uint32_t out_len)Scrivi un valore per barra in out[i]; NaN significa nessun valore; restituisci nTracciato come una singola linea verde (#7ed321, spessore 1) sul grafico
int of_strategy(const OfBar* bars, uint32_t n, int32_t* out, uint32_t out_len)Scrivi un'intenzione per barra: −1 vendere, 0 niente, +1 comprareViene letta solo l'intenzione dell'ultima barra; qty, stopTicks e targetTicks arrivano dai parametri dello script
OF_CAPACITY256Le barre più vecchie della capacità non vengono trasmesse; una riga di avviso dice quante sono state saltate
#line 1 "script.cpp"I numeri di riga nelle diagnostiche corrispondono al tuo editorIl primo «script.cpp:N:M: error» fissa la riga evidenziata

Stati del motore e comandi

Stati della fascia Toolchain C++ e pulsanti mostrati in ciascuno
StatoMostrato comeAzione disponibile
assenteNon installata + nota sulla dimensioneInstalla la toolchain C++
downloadDownload del motore… {percent}%Annulla il download
avvioAvvio del motore…nessuna (timeout di avvio 120 s)
prontoMotore pronto, versione e tempo di avvio, limitiRimuovi il motore (svuota i moduli del worker e la cache IndexedDB)
erroreMotore non disponibile + messaggioRiprova

Come usarlo

Crea un nuovo script, scegli C++ e parti dal modello predefinito: una media mobile semplice a 20 periodi scritta con una somma scorrevole, NaN durante il riscaldamento, che restituisce n. Eseguilo con lo stesso pulsante degli script JavaScript. Gli avvisi e gli errori del compilatore arrivano nella console come righe di log; un'esecuzione che supera il budget di 2 secondi fallisce come qualsiasi altro script. Oggi esiste un solo modello C++, quella media mobile; non c'è una strategia C++ già pronta. Basta scrivere tu of_strategy: le sue intenzioni seguono lo stesso percorso decisionale delle strategie JavaScript, solo verso il conto di valutazione simulato.

Se un grafico contiene più di 256 barre, la console stampa «L'ABI C++ v1 calcola le 256 barre più recenti: N barra/e più vecchia/e non hanno valore.». Le barre più vecchie vengono semplicemente disegnate senza valore invece di essere riempite con una stima.

Limiti e trappole

  • C++17 è supportato; il C++20 non è esplicitamente promesso. Header come <cmath>, <vector> e <numeric> sono disponibili da libc++.
  • Il sorgente è limitato a 64 KiB compresa l'intestazione dell'host; il modulo compilato può usare fino a 64 MiB di memoria.
  • Il motore scarica solo da raw.githubusercontent.com; un redirect viene rifiutato e un file la cui dimensione o hash differisce viene scartato prima di raggiungere la sandbox.
  • Se la sandbox si riavvia o la toolchain viene rimossa durante una compilazione, l'esecuzione riporta «sandbox riavviata o toolchain rimossa durante la compilazione — esegui di nuovo».
  • Eseguire uno script C++ prima di aver installato la toolchain restituisce «toolchain C++ non avviata — installala dalla pagina Scripting»; l'esecuzione riesce automaticamente appena il motore è pronto.

Questa pagina in altre lingue

Domande frequenti

La toolchain C++ ha bisogno di una connessione a internet ogni volta?
No. I cinque file si scaricano una volta sola, vengono verificati e conservati in IndexedDB. Gli avvii successivi leggono la cache e girano interamente offline; «Rimuovi il motore» svuota quella cache.
Una strategia C++ può inviare ordini al mio broker?
No. of_strategy produce intenzioni −1/0/+1 che vengono convertite in decisioni per il conto simulato, per lo stesso percorso delle strategie JavaScript. Nessuno script in Senzoukria invia un ordine al broker.
Perché il mio indicatore si ferma dopo 256 barre?
L'ABI v1 trasmette le 256 barre più recenti per chiamata. Le barre più vecchie non hanno valore e la console dice quante sono state saltate.