Scripts C++ : la chaîne Clang en WebAssembly et l'ABI v1

Senzoukria compile un script C++17 en WebAssembly à l'intérieur de son bac à sable, avec un vrai Clang, puis l'exécute sur les barres du graphique. La chaîne d'outils se télécharge une fois à la demande, vérifiée par taille et par SHA-256, et expose une petite ABI : of_compute trace une valeur par barre, of_strategy renvoie des intentions d'achat et de vente pour le compte simulé.

Senzoukria · Documentation · Mis à jour en septembre 2026


Où le trouver

Page Scripting → sélecteur de langage → C++ (un bandeau « Chaîne C++ » apparaît au-dessus de l'éditeur)
Chaîne d'outils
Clang 8.0.1 + LLD + libc++ compilés en WebAssembly, figés sur le commit Binji wasm-clang 648c4a89 ; environ 60.4 Mo (affichés « 60.4 Mo ») téléchargés une fois
Capacité
256 barres les plus récentes par appel ; source jusqu'à 64 Kio ; 2 s par exécution ; compilation limitée à 45 s
Portée d'une stratégie
Compte simulé uniquement ; l'application ne transforme jamais une intention C++ en ordre broker

Ce que ça fait

Le moteur C++ est le troisième langage de scripting, à côté de JavaScript et Python. Choisir C++ dans le sélecteur de langage de la page Scripting affiche le bandeau « Chaîne C++ ». Son premier état est « Non installée », avec le bouton « Installer la chaîne C++ » et la mention « Environ 60.4 Mo à télécharger, une seule fois (Clang 8.0.1 + LLD + libc++, Apache-2.0). ». Les cinq fichiers (clang, lld, memfs, sysroot.tar, shared.js) sont récupérés depuis le commit GitHub figé, chacun rejeté si son nombre d'octets ou son SHA-256 diffère de la valeur inscrite dans l'application, puis rangés dans IndexedDB pour que le téléchargement n'ait lieu qu'une fois.

Démarrer le moteur compile environ 50 Mo de WebAssembly : c'est pourquoi « Démarrage du moteur… » est un état visible, distinct d'une exécution de script. Une fois prêt, le bandeau affiche « Version wasm-clang-648c4a89, démarrée en {ms} ms », suivi de la ligne des limites. Chaque script est compilé une fois, indexé par le SHA-256 de la source composée (en-tête de l'hôte + votre code) ; relancer le même script à la cadence du graphique ne recompile jamais. L'hôte conserve jusqu'à 8 modules compilés, le worker en garde 8 également.

L'ABI que votre script voit

Déclarations ajoutées par l'hôte avant votre code (ne les redéclarez pas)
SymboleSignificationRemarques
struct OfBarbucket_ts_ns (int64), open, high, low, close, volume, delta (double), trades (uint32)64 octets, barre la plus ancienne en premier, n ≤ 256
int of_compute(const OfBar* bars, uint32_t n, double* out, uint32_t out_len)Écrire une valeur par barre dans out[i] ; NaN signifie aucune valeur ; renvoyer nTracé en une seule ligne verte (#7ed321, épaisseur 1) sur le graphique
int of_strategy(const OfBar* bars, uint32_t n, int32_t* out, uint32_t out_len)Écrire une intention par barre : −1 vendre, 0 rien, +1 acheterSeule l'intention de la dernière barre est lue ; qty, stopTicks et targetTicks viennent des paramètres du script
OF_CAPACITY256Les barres plus anciennes que la capacité ne sont pas transmises ; une ligne d'avertissement indique combien ont été écartées
#line 1 "script.cpp"Les numéros de ligne des diagnostics correspondent à votre éditeurLa première « script.cpp:N:M: error » détermine la ligne surlignée

États du moteur et commandes

États du bandeau de la chaîne C++ et boutons affichés dans chacun
ÉtatAffiché commeAction disponible
absentNon installée + mention de la tailleInstaller la chaîne C++
téléchargementTéléchargement du moteur… {pourcentage} %Annuler le téléchargement
démarrageDémarrage du moteur…aucune (amorçage limité à 120 s)
prêtMoteur prêt, version et temps de démarrage, limitesRetirer le moteur (purge les modules du worker et le cache IndexedDB)
erreurMoteur indisponible + messageRéessayer

Comment s'en servir

Créez un script, choisissez C++ et partez du modèle par défaut : une moyenne mobile simple sur 20 périodes écrite avec une somme glissante, NaN pendant l'amorçage, qui renvoie n. Lancez-le avec le même bouton d'exécution que les scripts JavaScript. Les avertissements et les erreurs du compilateur arrivent dans la console sous forme de lignes de journal ; une exécution qui dépasse le budget de deux secondes échoue comme n'importe quel autre script. Un seul modèle C++ est livré aujourd'hui, cette moyenne mobile ; il n'existe pas de stratégie C++ toute prête. Écrire vous-même of_strategy suffit : ses intentions suivent le même chemin de décision que les stratégies JavaScript, vers le compte d'évaluation simulé et lui seul.

Si un graphique contient plus de 256 barres, la console affiche « L'ABI C++ v1 calcule les 256 barres les plus récentes : N barre(s) plus ancienne(s) n'ont pas de valeur. ». Les barres plus anciennes sont simplement tracées sans valeur, plutôt que comblées par une estimation.

Limites et pièges

  • C++17 est pris en charge ; C++20 n'est explicitement pas promis. Des en-têtes comme <cmath>, <vector> et <numeric> sont disponibles depuis libc++.
  • La source est limitée à 64 Kio, en-tête de l'hôte compris ; le module compilé peut utiliser jusqu'à 64 Mio de mémoire.
  • Le moteur ne se télécharge que depuis raw.githubusercontent.com ; une redirection est refusée, et un fichier dont la taille ou l'empreinte diffère est rejeté avant d'atteindre le bac à sable.
  • Si le bac à sable redémarre ou si la chaîne est retirée pendant une compilation, l'exécution signale « bac à sable redémarré ou chaîne retirée pendant la compilation — relancez ».
  • Lancer un script C++ avant d'avoir installé la chaîne renvoie « chaîne C++ non démarrée — installez-la depuis la page Scripting » ; l'exécution aboutit automatiquement dès que le moteur est prêt.

Cette page dans d’autres langues

Questions fréquentes

La chaîne C++ a-t-elle besoin d'une connexion internet à chaque fois ?
Non. Les cinq fichiers sont téléchargés une fois, vérifiés et conservés dans IndexedDB. Les démarrages suivants lisent le cache et tournent entièrement hors ligne ; « Retirer le moteur » vide ce cache.
Une stratégie C++ peut-elle envoyer des ordres à mon broker ?
Non. of_strategy produit des intentions −1/0/+1 converties en décisions pour le compte simulé, par le même chemin que les stratégies JavaScript. Aucun script de Senzoukria ne passe d'ordre broker.
Pourquoi mon indicateur s'arrête-t-il après 256 barres ?
L'ABI v1 transmet les 256 barres les plus récentes par appel. Les barres plus anciennes n'ont pas de valeur, et la console indique combien ont été écartées.