Custom Series
[[custom_series]] permet de créer une série numérique personnalisée à partir d’une formule.
Dans ce bloc, la formule est limitée aux symboles disponibles au niveau indicateur. Les variables runtime du backtest, du portefeuille, des ordres et des trades ne sont pas disponibles.
Ce bloc permet d’isoler un calcul intermédiaire et de le réutiliser dans plusieurs conditions ou comme entrée d’autres indicateurs.
Comment la formule interprète les séries
Dans un custom_series, une série n’est pas interprétée selon le timeframe natif du bloc qui la produit, mais selon le timeframe du bloc qui la lit.
Autrement dit, la formule s’évalue toujours dans le repère du custom_series lui-même. Si elle utilise une série venant d’un autre timeframe, cette série est d’abord réalignée sur l’axe du bloc avant d’être utilisée. La valeur courante et son historique se lisent donc dans ce même repère.
Prenons un cas simple. Si votre stratégie principale s’exécute en 240, qu’un indicateur daily_signal est calculé en D, et qu’un custom_series sans timeframe explicite lit cette série, alors la formule travaille sur l’axe 240. Dans ce contexte, daily_signal[1] signifie la valeur observée une bougie 240 plus tôt sur la série projetée. Cela ne signifie pas la bougie journalière précédente.
Cette règle est importante dès que vous combinez plusieurs timeframes dans une même formule. Elle garantit qu’une série et son historique restent cohérents du point de vue du bloc qui les consomme.
Déclaration du bloc
Une stratégie peut contenir plusieurs blocs [[custom_series]]. Chaque bloc produit une série numérique identifiée par son id.
La syntaxe de formula suit les règles générales des expressions (opérateurs, fonctions, constantes réservées, indexation historique). Voir Expressions et fonctions.
Dans [[custom_series]], la formule peut utiliser les séries prix standard, les sorties d’indicateurs déjà définis dans la stratégie et les variables qu’ils exposent.
Exemples
Configuration minimale
Ce bloc reproduit l’Accumulation/Distribution variable de Williams. La formule mesure l’écart entre la clôture et l’ouverture, le normalise par l’amplitude de la bougie, puis le pondère par le volume.
[[custom_series]]
id = "wvad"
formula = "high != low ? (close - open) / (high - low) * volume : 0"True Range
Ce bloc calcule la True Range d’une bougie. La formule prend le maximum entre l’amplitude courante (high - low) et les écarts absolus entre les extrêmes de la bougie courante et la clôture précédente.
[[custom_series]]
id = "true_range"
formula = "max(high - low, abs(high - close[1]), abs(low - close[1]))"Timeframe dédié
Ce bloc force le calcul de la série sur un timeframe journalier.
Si timeframe est omis, le calcul se fait sur le timeframe principal défini dans [backtest].
[[custom_series]]
id = "daily_body"
formula = "close - open"
timeframe = "D"Voir la page Exchanges, Symboles et Timeframes pour les règles d’alignement entre ce timeframe et le timeframe principal.
Utiliser custom_series comme source d’un autre indicateur
La série personnalisée peut ensuite servir de source à d’autres blocs indicateurs.
[[custom_series]]
id = "price_delta"
formula = "close - close[1]"
[[moving_average]]
id = "delta_ma"
type = "ema"
source = "price_delta"
length = 20Variables exposées par les indicateurs
Une formule custom_series peut aussi utiliser les variables exposées par les indicateurs déjà définis dans la stratégie, par exemple fast.length, fast.type, fast.symbol ou fast.timeframe.
Cet exemple adapte la formule selon le type des moyennes mobiles en cours d’évaluation pendant le grid search.
[[moving_average]]
id = "fast"
type = ["sma", "ema"]
length.start = 10
length.stop = 30
[[moving_average]]
id = "slow"
type = ["sma", "ema"]
length = 50
[[custom_series]]
id = "ma_signal"
formula = "fast.type == 'ema' and slow.type == 'ema' ? fast / slow : (fast - slow) / slow * 100"Paramètres
| Paramètre | Description |
|---|---|
idTexte Obligatoire | Nom unique de la série produite. Cette série sera exposée sous cet identifiant dans les expressions. |
formulaExpression Obligatoire | Expression qui définit la série calculée. Entrées possibles : prix standards, identifiants d’indicateurs déjà définis, variables exposées par ces indicateurs ( fast.length, fast.type, fast.symbol, fast.timeframe, etc.), constantes numériques, fonctions d’expression.Types TOML acceptés : chaîne, entier, décimal. Les variables runtime du backtest, du portefeuille, des ordres et des trades ne sont pas disponibles dans ce bloc. Les constantes réservées pi, euler, phi, rphi ne doivent pas être utilisées comme identifiants métier. |
timeframeTexte ou Tableau Optionnel | Timeframe de calcul de la série. Si timeframe est omis, le calcul se fait sur le timeframe principal de la grille défini dans [backtest].Pour les formats acceptés et les règles d’alignement entre timeframes, voir Exchanges, Symboles et Timeframes. |
symbolTexte ou Tableau Interdit | La clé symbol n’est pas autorisée sur [[custom_series]].Pour le multi-marché, définissez d’abord des indicateurs sources avec leurs propres symboles, puis combinez ces indicateurs dans formula. |
Variables disponibles
Le bloc custom_series expose une série numérique et ses métadonnées de contexte (symbol, timeframe).
Ces variables sont exposées une fois la série calculée et peuvent être utilisées en aval. Elles ne sont pas disponibles dans la formula du bloc lui-même.
Supposons le bloc configuré ainsi :
[[custom_series]]
id = "candle_body"
formula = "close - open"Alors :
| Variable | Description |
|---|---|
candle_body ou candle_body[0]Décimal | Valeur courante de la série calculée. |
candle_body[n]Décimal | Valeur de la série il y a n bougies. |
candle_body.symbolTexte | Symbole de marché effectivement utilisé pour l’évaluation du bloc. |
candle_body.timeframeTexte | Timeframe effectivement utilisé pour l’évaluation du bloc. |
Notes
- Les variables numériques se combinent librement (arithmétique, comparaisons, opérateurs logiques).
- Les variables textuelles sont destinées aux comparaisons d’égalité/inégalité uniquement.
- Une formule ne peut pas référencer son propre
id(auto-référence interdite).
Erreurs fréquentes
| Message (résumé) | Cause courante | Correction |
|---|---|---|
Invalid formula | Formule invalide (syntaxe, parenthèses, variable inconnue dans l’expression). | Simplifier la formule, vérifier les noms, puis reconstruire progressivement. |
The expression cannot reference its own id | Auto-référence (id = "x" et formula = "x + 1"). | Utiliser une autre série d’entrée ; ne jamais référencer l’id courant dans sa propre formule. |
Key 'symbol' is not allowed on custom_series blocks | Présence de symbol dans [[custom_series]]. | Retirer symbol du bloc et gérer le multi-marché via les indicateurs sources. |
Unknown source id | Un identifiant d’indicateur n’existe pas (typo, casse, oubli du bloc) ou la formule utilise une variable qui n’est pas exposée par un indicateur déjà défini dans la stratégie. | Vérifier l’orthographe, la présence des blocs sources et n’utiliser que des séries prix standard, des sorties d’indicateurs déjà définis ou les variables qu’ils exposent. |
Cyclic dependency | Dépendance circulaire entre indicateurs. | Réorganiser les blocs pour supprimer la boucle de dépendances. |