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 = 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.
[[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è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).