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 = 20

Variables 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ètreDescription
id
 Texte
 Obligatoire
Nom unique de la série produite. Cette série sera exposée sous cet identifiant dans les expressions.
formula
 Expression
 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.
timeframe
 Texte
 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.
symbol
 Texte
 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 :

VariableDescription
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.symbol
Texte
Symbole de marché effectivement utilisé pour l’évaluation du bloc.
candle_body.timeframe
Texte
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 couranteCorrection
Invalid formulaFormule 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 idAuto-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 blocksPrésence de symbol dans [[custom_series]].Retirer symbol du bloc et gérer le multi-marché via les indicateurs sources.
Unknown source idUn 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 dependencyDépendance circulaire entre indicateurs.Réorganiser les blocs pour supprimer la boucle de dépendances.