API d’indicateurs crypto
Dix-neuf indicateurs techniques calculés à la demande et calibrés sur TradingView : RSI, MACD, moyennes mobiles et d’autres. Vous envoyez vos paramètres, BytNode renvoie les valeurs : pas d’historique de bougies à télécharger, rien à recalculer de votre côté.
Dix-neuf types d'indicateurs classiques, calculés à la demande sur les bougies OHLCV, dont le volume est celui du marché spot, toutes plateformes additionnées. Jusqu'à cinquante instances par appel, chacune avec ses propres paramètres. La précision est calibrée sur TradingView à 0,1 % près sur les indicateurs de prix, hors trois différences de convention assumées ; les indicateurs de volume (OBV, MFI, A/D, Chaikin) utilisent ce volume agrégé, leur niveau diffère donc d'un graphique mono-plateforme. Ils sont calculés sur les bougies les plus récentes dont le volume est déjà définitif (la dernière peut encore l'attendre), et renvoient 422 quand cet historique de volume est trop court.
#Indicateurs techniques pour agents IA : le tool calling
« BTC est-il suracheté sur le RSI 4 heures ? », « Le MACD d’ETH a-t-il croisé sa ligne de signal ? », « Compare l’ADX de SOL et d’AVAX » : l’agent IA décrit le calcul et l’outil MCP get_market_indicators l’exécute, sur dix paires au plus. C’est le tool calling dans sa forme la plus simple.
{
"name": "get_market_indicators",
"arguments": {
"symbol": "BTCUSDT",
"timeframe": "4h",
"limit": 1,
"indicators": [
{ "id": "rsi_14", "type": "rsi", "period": 14 },
{ "id": "macd", "type": "macd", "fast": 12, "slow": 26, "signal": 9 }
]
}
}- Pour le LLM : les valeurs arrivent de la plus récente à la plus ancienne et sont calculées sur les seules bougies closes : la bougie en cours ne fait jamais bouger un indicateur.
- Pour les développeurs :
POST /v1/indicatorsprend la même description en corps JSON, ce qui en fait un outil tout prêt pour votre propre agent IA ; les dix-neuf types et leurs paramètres sont listés plus bas. - Où ça tourne : Claude, ChatGPT, Cursor et tout client MCP, y compris les frameworks d’agents qui parlent MCP, comme LangChain ou n8n.
Branchez votre agent IA avec le guide du serveur MCP, ou apprenez-lui BytNode avec les Agent Skills open source.
#L’appel
Les 1 champs de cette route (d’après le contrat)
indicators | One result per indicator of the request, keyed by the `id` you gave it. |
Le seul endpoint à prendre un corps JSON : il décrit un calcul, pas une lecture. Les valeurs ne sont ni stockées ni mises en cache. Elles sont produites à chaque appel à partir des bougies closes.
| Paramètre | Type | Défaut | Description |
|---|---|---|---|
symbol | string | obligatoire | L’un des symboles de GET /v1/symbols (sur les deux stablecoins : 200 avec unavailable: not_applicable). 32 caractères au plus. |
timeframe | string | obligatoire | 1m, 5m, 15m, 30m, 1h, 4h, 1d, 1w. La semaine commence le lundi à 00:00 UTC, comme sur /v1/klines. |
limit | integer | 1 | Nombre de lignes rendues par indicateur, de 1 à 1000, de la plus récente à la plus ancienne. 1 donne la valeur de la dernière bougie close. |
indicators | array | obligatoire | Liste non vide d’objets : { "id", "type", puis les paramètres À PLAT, par exemple "period": 14 }. Cinquante entrées au plus. |
curl -X POST "https://api.bytnode.com/v1/indicators" \
-H "X-API-KEY: $BYTNODE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"symbol": "BTCUSDT",
"timeframe": "1h",
"limit": 3,
"indicators": [
{ "id": "rsi_14", "type": "rsi", "period": 14 },
{ "id": "macd", "type": "macd", "fast": 12, "slow": 26, "signal": 9 },
{ "id": "bb_20", "type": "bb", "period": 20 }
]
}'1m5m15m30m1h4h1d1w
#Les dix-neuf indicateurs
| Type | Paramètres (défaut, minimum) | Sortie |
|---|---|---|
rsi | period (14, ≥ 2) | value |
ema | period (20, ≥ 2) | value |
sma | period (20, ≥ 2) | value |
bb | period (20, ≥ 2), std (2.0, ≥ 0.5) | upper, middle, lower |
atr | period (14, ≥ 2) | value |
stoch | k (14, ≥ 2), d (3, ≥ 2), smooth (3, ≥ 2) | k, d |
macd | fast (12, ≥ 2), slow (26, ≥ 5), signal (9, ≥ 2); fast < slow | macd, signal, histogram |
obv | none | value |
adx | period (14, ≥ 2) | value |
sar | acceleration (0.02, ≥ 0.01), maximum (0.2, ≥ 0.05); acceleration ≤ maximum | value |
cci | period (20, ≥ 2) | value |
willr | period (14, ≥ 2) | value |
mfi | period (14, ≥ 2) | value |
roc | period (10, ≥ 2) | value |
ad | none | value |
adosc | fast (3, ≥ 2), slow (10, ≥ 5); fast < slow | value |
keltner | period (20, ≥ 2), multiplier (2.0, ≥ 0.5) | upper, middle, lower |
donchian | period (20, ≥ 2) | upper, middle, lower |
ichimoku | tenkan (9, ≥ 2), kijun (26, ≥ 5), senkou (52, ≥ 10) | tenkan_sen, kijun_sen, senkou_a, senkou_b |
#Les identifiants
Chaque instance porte un id que vous choisissez : c’est la clé de son résultat dans la réponse. N’importe quel nom de 1 à 64 caractères parmi lettres, chiffres, _, - et ., unique dans l’appel : rsi_7, rsi_21, tendance.ema_200.
Un type peut apparaître autant de fois que nécessaire, dans la limite de cinquante indicateurs par appel : cinq moyennes mobiles de périodes différentes, ou trois RSI, côte à côte.
rsiemasmabbatrstochmacdobvadxsarcciwillrmfirocadadosckeltnerdonchianichimoku
Un identifiant absent, mal formé ou en double renvoie 422 invalid_indicator.
#La règle de plafond
Un indicateur a besoin d’un warm-up (des bougies antérieures à la première valeur publiable). La règle est :
limit + warmup(type, parameters) <= 1000Au-delà, la requête rend 422. Sur les types à échauffement linéaire, le message donne la période maximale utilisable pour la limit demandée.
| Type | Warm-up |
|---|---|
| rsi, atr, keltner | 5 × period |
| ema | 3 × period |
| sma, bb, cci, willr, roc, donchian, mfi | period |
| stoch | k + d + smooth |
| macd | 3 × slow + signal |
| adosc | 6 × slow |
| adx | 14 × period |
| sar | 200, constant |
| ichimoku | max(tenkan, kijun, senkou) + kijun |
| obv, ad | aucun |
#La réponse
{
"status": "ok",
"server_time": "2026-11-08T12:52:44.953Z",
"data_type": "indicators",
"symbol": "BTCUSDT",
"timeframe": "1h",
"data": {
"indicators": {
"rsi_14": {
"type": "rsi",
"period": 14,
"values": [
{
"time": "2026-11-08T11:00:00.000Z",
"value": 54.072013544
},
{
"time": "2026-11-08T10:00:00.000Z",
"value": 49.3688670483
},
{
"time": "2026-11-08T09:00:00.000Z",
"value": 51.577078526
}
]
},
"macd": {
"type": "macd",
"fast": 12,
"slow": 26,
"signal": 9,
"values": [
{
"time": "2026-11-08T11:00:00.000Z",
"macd": -14.2249104846,
"signal": -45.998361242,
"histogram": 31.7734507574
},
{
"time": "2026-11-08T10:00:00.000Z",
"macd": -24.0339550779,
"signal": -53.9417239313,
"histogram": 29.9077688534
},
{
"time": "2026-11-08T09:00:00.000Z",
"macd": -27.3827508304,
"signal": -61.4186661447,
"histogram": 34.0359153142
}
]
},
"bb_20": {
"type": "bb",
"period": 20,
"std": 2,
"values": [
{
"time": "2026-11-08T11:00:00.000Z",
"upper": 75998.1649923,
"middle": 75839.8095,
"lower": 75681.4540077
},
{
"time": "2026-11-08T10:00:00.000Z",
"upper": 75976.7264653,
"middle": 75828.6555,
"lower": 75680.5845347
},
{
"time": "2026-11-08T09:00:00.000Z",
"upper": 75985.9705718,
"middle": 75831.36,
"lower": 75676.7494282
}
]
}
}
}
}- Les clés de
data.indicatorssont vos identifiants. - Chaque entrée rappelle son
typeet ses paramètres effectifs, valeurs par défaut remplies : vous savez toujours ce qui a été calculé. valuesest une liste de lignes datées, de la plus récente à la plus ancienne comme toute liste de BytNode : chaque ligne est{time, value}, outimeet les sorties nommées d’un indicateur à plusieurs sorties (macd,signal,histogram;upper,middle,lower…).timeest le début de la bougie de cette ligne.- Une valeur non définie sort en
null, jamais enNaN. - Les sorties à plusieurs clés suivent l’ordre déclaré par le type, pas celui du moteur de calcul.
#Différences de convention
Ces différences viennent de mesures, pas de préférences. Les connaître évite de chercher un bug là où il n’y en a pas.
OBV et AD sont des totaux cumulés sans origine
Les deux cumulent à partir de la première bougie de la fenêtre chargée. Leur niveau absolu n’est pas reproductible d’une requête à l’autre : deux fenêtres différentes donnent deux niveaux différents, et aucun ne correspond au niveau d’un graphique tiers. Seuls la pente, les variations et les divergences avec le prix sont exploitables. adosc n’a pas ce défaut : il est insensible à l’origine.
Ichimoku : une barre d’écart avec TradingView
Les deux senkou sont projetés de kijun barres en avant (26 par défaut). TradingView décale de 25. Une barre d’écart est donc attendue.
Le chikou_span n’est pas exposé : sa définition regarde dans le futur, il vaudrait null sur les dernières bougies, donc toujours null avec limit: 1.
Keltner : une seule longueur
C’est la variante moderne, moyenne mobile exponentielle plus ATR, avec une seule longueur pour les deux. TradingView expose une EMA(20) et un ATR(10) séparés. Une différence assumée.
Donchian inclut la bougie courante
La fenêtre est inclusive, conformément aux fonctions highest et lowest des langages de script de graphiques.
Le MFI n’est pas un RSI du volume
Il est implémenté comme une simple somme glissante, sans le lissage qu’utilise le RSI : son warm-up vaut sa période, pas cinq fois sa période.
#Erreurs
L’ordre de validation est fixe : unité de temps, puis limit, puis symbole, puis analyse des indicateurs, puis règle de plafond, puis lecture des bougies. Le premier échec l’emporte.
| Cas | Code |
|---|---|
| Clé manquante ou invalide | 401 |
| Unité de temps invalide, limit hors de 1 à 1000, symbole inconnu | 422 |
| Liste indicators vide, entrée qui n’est pas un objet | 422 |
| Clé id ou type manquante, id invalide, type non pris en charge, champ du corps inconnu | 422 |
| Paramètre inconnu pour le type, mauvais type, sous le minimum | 422 |
| macd ou adosc avec fast ≥ slow, sar avec acceleration '>' maximum | 422 |
| Identifiant en double | 422 |
| Corps mal formé, plus de 50 indicateurs, champ trop long | 422 |
| limit + warm-up dépasse 1000 | 422 |
| Données insuffisantes pour cette unité de temps, ou historique de volume trop court pour un indicateur de volume | 422 |
| Débit dépassé | 429 |