Custom Series

[[custom_series]] transforme une formule évaluée à chaque bougie en une série numérique identifiée par son id. La formule peut combiner les séries de marché standard, les sorties d’indicateurs déjà définis, leur historique et les fonctions d’expression. La série obtenue se réutilise ensuite dans des conditions ou comme source d’autres indicateurs.

La formule est calculée dans le timeframe du bloc et ne voit que les données disponibles pendant le calcul des indicateurs. Les états qui n’existent qu’au cours de l’exécution du backtest, comme le portefeuille, les ordres ou les trades, ne sont pas accessibles. Les séries provenant d’autres timeframes sont alignées sur celui du custom_series avant l’évaluation.

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]"

[[ma]]
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.

[[ma]]
id           = "fast"
type         = ["sma", "ema"]
length.start = 10
length.stop  = 30

[[ma]]
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).