Exchanges, symboles, sources et timeframes

Un indicateur ne se résume pas à une formule. Quand vous définissez un bloc, vous choisissez aussi le marché qu’il lit, le timeframe sur lequel il calcule sa série et la source qu’il prend en entrée. Ces trois dimensions correspondent à symbol, timeframe et source.

Le bloc [backtest] fixe le symbole principal et le timeframe principal de la stratégie. Si un bloc indicateur n’indique pas son propre symbol ou son propre timeframe, il utilise ces valeurs par défaut.

[backtest]
symbol    = "BINANCE:BTCUSDT"
timeframe = "240"

Avec cette configuration, un bloc qui ne précise pas symbol ou timeframe travaille par défaut sur BINANCE:BTCUSDT en 240 (4h).

Exchanges, symboles et timeframes

Whale‑E télécharge les données de marché via des endpoints publics. Les marchés disponibles dépendent de l’exchange. Les types de marchés qui exigent une authentification ne sont pas pris en charge.

ExchangePréfixeMarchés disponibles
BinanceBINANCESpot, Futures USD‑M, Futures COIN‑M
KuCoinKUCOINSpot, Futures perpétuels USDT‑M, Futures perpétuels COIN‑M
BitgetBITGETSpot, Futures perpétuels USDT‑M/USDC‑M, Futures perpétuels COIN‑M
BybitBYBITSpot, Futures perpétuels Linear (USDT‑M), Futures perpétuels Inverse (COIN‑M)
OKXOKXSpot, Swaps perpétuels Linear/Inverse

La clé symbol accepte une chaîne unique ou un tableau de chaînes, dans [backtest] comme dans les blocs qui l’acceptent. Chaque valeur doit être écrite au format EXCHANGE:SYMBOLE.

symbol = "BINANCE:BTCUSDT"
symbol = ["KUCOIN:ETHUSDT", "BINANCE:BTCUSDT"]

La clé timeframe accepte elle aussi une chaîne unique ou un tableau de chaînes. Vous pouvez utiliser un nombre de minutes de 1 à 1440, un nombre de jours suivi de D comme 1D ou 7D, ou un nombre de semaines suivi de W comme 1W ou 4W. D et W sont acceptés comme alias de 1D et 1W. Les timeframes mensuels, par exemple 1M, ne sont pas pris en charge.

timeframe = "60"
timeframe = ["15", "D", "W"]

Cette syntaxe décrit les timeframes que Whale‑E accepte dans une stratégie. Elle ne signifie pas que chaque exchange expose chaque timeframe directement. Quand le timeframe demandé n’est pas fourni nativement par l’exchange, Whale‑E le reconstruit à partir d’un timeframe inférieur pris en charge par ce marché.

La clé source

La clé source définit la série d’entrée qu’un bloc lit avant son propre calcul. Quand un bloc l’accepte, elle peut être une chaîne unique ou un tableau de chaînes, et chaque valeur prend l’une de deux formes :

  • une source standard de bougie : open, close, high, low, hl2, hlc3, ohlc4, hlcc4, volume
  • l’id d’un autre indicateur
source = "close"
source = ["close", "hlc3"]
source = "rsi_fast"

Ces deux formes ne lisent pas leurs données au même endroit, et c’est ce qui décide du rôle de symbol :

  • pour une source standard, le bloc lit les données de marché, et symbol choisit sur quel marché les lire ;
  • pour l’id d’un indicateur, le bloc réutilise la série déjà calculée en amont, et symbol est ignoré.

Certains blocs n’exposent pas de clé source parce qu’ils utilisent toujours les mêmes entrées, par exemple high, low et close. Dans ces blocs, symbol définit le marché et timeframe l’axe temporel sur lesquels ces entrées fixes sont lues.

Le timeframe est celui du bloc qui consomme la série

Un bloc calcule toujours sur son propre timeframe. S’il ne le précise pas, il retombe sur le timeframe principal de [backtest]. Quand sa source est un autre indicateur, il reprend la série déjà calculée mais ne récupère jamais le timeframe du producteur : il la projette sur son propre axe. Une série est toujours interprétée selon le timeframe du bloc ou de l’expression qui la consomme, pas selon celui du bloc qui l’a produite.

Dans l’exemple ci-dessous, la stratégie s’exécute en 60, tandis que rsi_4h est calculé en 240 :

[backtest]
symbol    = "BINANCE:BTCUSDT"
timeframe = "60"

[[rsi]]
id        = "rsi_4h"
source    = "close"
timeframe = "240"
length    = 14

[[ma]]
id     = "ma_rsi"
source = "rsi_4h"
type   = "sma"
length = 10

ma_rsi n’indique pas de timeframe, il utilise donc le timeframe principal 60. Quand il lit rsi_4h, la série RSI calculée en 4 heures est projetée sur l’axe 60 : tant qu’une nouvelle bougie 4 heures n’est pas clôturée, les bougies 1 heure réutilisent la dernière valeur RSI 4 heures clôturée.

Cette règle vaut aussi pour l’historique. Ici, serie[1] désigne la valeur visible une bougie de 60 plus tôt sur l’axe du bloc qui lit la série, et non la bougie 240 précédente du bloc qui l’a calculée. La même logique s’applique dans les blocs conditionnels, dans les indicateurs qui relisent un autre indicateur et dans les formules [[custom_series]].

Lire un prix sur un autre marché

Puisque symbol choisit le marché d’une source standard, un bloc peut lire un prix sur un marché différent du symbole principal. Ici, rsi_eth_daily est calculé sur la clôture journalière de BINANCE:ETHUSDT, alors que la stratégie tourne sur BINANCE:BTCUSDT :

[backtest]
symbol    = "BINANCE:BTCUSDT"
timeframe = "240"

[[rsi]]
id        = "rsi_eth_daily"
source    = "close"
symbol    = "BINANCE:ETHUSDT"
timeframe = "D"
length    = 14

Si vous utilisez ensuite cette série dans la stratégie qui s’exécute en 240, Whale‑E la rend visible sur l’axe 4 heures. Entre deux clôtures journalières, le moteur réutilise la dernière valeur journalière connue.

Mélanger prix et indicateurs dans un même bloc

Un même bloc peut combiner des sources standard comme close et des ids d’indicateurs. symbol ne s’applique alors qu’aux sources standard ; pour un id, le bloc réutilise la série déjà produite. Si source ne contient que des ids, la clé symbol du bloc est entièrement ignorée.

[backtest]
symbol    = "BINANCE:BTCUSDT"
timeframe = "240"

[[price]]
id        = "eth_daily"
symbol    = "BINANCE:ETHUSDT"
timeframe = "D"

[[ma]]
id     = "ma_mix"
source = ["close", "eth_daily"]
symbol = ["BINANCE:BTCUSDT", "BINANCE:SOLUSDT"]
type   = "sma"
length = 10

Ici, ma_mix produit trois grilles :

  • une moyenne mobile construite à partir de close sur BINANCE:BTCUSDT
  • une moyenne mobile construite à partir de close sur BINANCE:SOLUSDT
  • une moyenne mobile construite à partir de la série eth_daily

Les deux symboles ne s’appliquent qu’à close : eth_daily conserve celui défini dans son propre bloc.

Combinaisons de sources, symboles et timeframes

Les valeurs qualitatives comme source, symbol et timeframe créent des grilles distinctes. Dès qu’un bloc accepte un tableau pour l’une de ces clés, une combinaison est générée pour chaque choix possible.

[backtest]
symbol    = ["BINANCE:BTCUSDT", "BINANCE:ETHUSDT"]
timeframe = "240"

[[ma]]
id        = "ma_fast"
source    = ["close", "hlc3"]
timeframe = ["240", "D"]
type      = "sma"
length    = 20

Dans cet exemple, le bloc de moyenne mobile propose :

  • 2 symboles principaux dans [backtest]
  • 2 sources (close et hlc3)
  • 2 timeframes de bloc (240 et D)

Il y a donc 2 × 2 × 2 = 8 grilles différentes. Le paramètre numérique length, lui, ne crée pas de nouvelles grilles : il est exploré à l’intérieur de chaque grille.