API de indicadores cripto
Diecinueve indicadores técnicos calculados a demanda y calibrados con TradingView: RSI, MACD, medias móviles y más. Envías tus parámetros y BytNode devuelve los valores: sin historial de velas que descargar ni nada que recalcular por tu lado.
Diecinueve tipos de indicadores clásicos, calculados bajo demanda sobre las velas OHLCV, cuyo volumen es el del mercado spot, sumado en todas las plataformas. Hasta cincuenta instancias por llamada, cada una con sus propios parámetros. La precisión está calibrada con TradingView con un margen del 0,1 % en los indicadores de precio, salvo tres diferencias de convención deliberadas; los indicadores de volumen (OBV, MFI, A/D, Chaikin) usan ese volumen agregado, por lo que su nivel difiere del de un gráfico de una sola plataforma. Se calculan sobre las velas más recientes cuyo volumen ya es definitivo (la última puede estar aún esperándolo) y devuelven 422 cuando ese historial de volumen es demasiado corto.
#Indicadores técnicos para agentes de IA: tool calling
«¿Está BTC sobrecomprado en el RSI de 4 horas?», «¿Ha cruzado el MACD de ETH su línea de señal?», «Compara el ADX de SOL y AVAX»: el agente de IA describe el cálculo y la herramienta MCP get_market_indicators lo ejecuta, en hasta diez pares. Es el tool calling en su forma más 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 }
]
}
}- Para el LLM: los valores llegan del más reciente al más antiguo y se calculan solo con velas cerradas: la vela en curso nunca mueve un indicador.
- Para desarrolladores:
POST /v1/indicatorsrecibe la misma descripción como cuerpo JSON, lo que la convierte en una herramienta lista para tu propio agente de IA; los diecinueve tipos y sus parámetros figuran más abajo. - Dónde funciona: Claude, ChatGPT, Cursor y cualquier cliente MCP, incluidos los frameworks de agentes compatibles con MCP, como LangChain o n8n.
Conecta tu agente de IA con la guía del servidor MCP, o enséñale BytNode con los Agent Skills de código abierto.
#La llamada
Los 1 campos de esta ruta (según el contrato)
indicators | One result per indicator of the request, keyed by the `id` you gave it. |
El único endpoint que recibe un cuerpo JSON: describe un cálculo, no una lectura. Los valores no se almacenan ni se guardan en caché. Se producen en cada llamada a partir de las velas cerradas.
| Parámetro | Tipo | Por defecto | Descripción |
|---|---|---|---|
symbol | string | obligatorio | Uno de los símbolos de GET /v1/symbols (en las dos stablecoins: 200 con unavailable: not_applicable). 32 caracteres como máximo. |
timeframe | string | obligatorio | 1m, 5m, 15m, 30m, 1h, 4h, 1d, 1w. La semana empieza el lunes a las 00:00 UTC, como en /v1/klines. |
limit | integer | 1 | Número de filas devueltas por indicador, de 1 a 1000, de la más reciente a la más antigua. 1 da el valor de la última vela cerrada. |
indicators | array | obligatorio | Lista no vacía de objetos: { "id", "type", y luego los parámetros PLANOS, por ejemplo "period": 14 }. Cincuenta entradas como máximo. |
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
#Los diecinueve indicadores
| Tipo | Parámetros (por defecto, mínimo) | Salida |
|---|---|---|
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 |
#Los identificadores
Cada instancia lleva un id que eliges tú: es la clave de su resultado en la respuesta. Cualquier nombre de 1 a 64 caracteres entre letras, cifras, _, - y ., único en la llamada: rsi_7, rsi_21, tendencia.ema_200.
Un tipo puede aparecer tantas veces como haga falta, dentro del límite de cincuenta indicadores por llamada: cinco medias móviles de periodos distintos, o tres RSI, uno al lado del otro.
rsiemasmabbatrstochmacdobvadxsarcciwillrmfirocadadosckeltnerdonchianichimoku
Un identificador ausente, mal formado o duplicado devuelve 422 invalid_indicator.
#La regla del límite
Un indicador necesita un warm-up (velas anteriores al primer valor publicable). La regla es:
limit + warmup(type, parameters) <= 1000Más allá, la petición devuelve 422. En los tipos con calentamiento lineal, el mensaje indica el periodo máximo utilizable para el limit pedido.
| Tipo | 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, constante |
| ichimoku | max(tenkan, kijun, senkou) + kijun |
| obv, ad | ninguno |
#La respuesta
{
"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
}
]
}
}
}
}- Las claves de
data.indicatorsson tus identificadores. - Cada entrada repite su
typey sus parámetros efectivos, con los valores por defecto completados: siempre sabes lo que se calculó. valueses una lista de filas fechadas, de la más reciente a la más antigua como toda lista de BytNode: cada fila es{time, value}, otimey las salidas con nombre de un indicador de varias salidas (macd,signal,histogram;upper,middle,lower…).timees el inicio de la vela de esa fila.- Un valor indefinido sale como
null, nunca comoNaN. - Las salidas con varias claves siguen el orden declarado por el tipo, no el del motor de cálculo.
#Diferencias de convención
Estas diferencias provienen de mediciones, no de preferencias. Conocerlas evita buscar un fallo donde no lo hay.
OBV y AD son totales acumulados sin origen
Ambos acumulan desde la primera vela de la ventana cargada. Su nivel absoluto no es reproducible de una petición a otra: dos ventanas distintas dan dos niveles distintos, y ninguno coincide con el nivel de un gráfico de terceros. Solo son aprovechables la pendiente, las variaciones y las divergencias con el precio. adosc no tiene este defecto: es insensible al origen.
Ichimoku: una barra de diferencia con TradingView
Los dos senkou se proyectan kijun barras hacia delante (26 por defecto). TradingView desplaza 25. Se espera por tanto una barra de diferencia.
El chikou_span no se expone: su definición mira al futuro, sería null en las últimas velas y, por tanto, siempre null con limit: 1.
Keltner: una sola longitud
Es la variante moderna, media móvil exponencial más ATR, con una sola longitud para ambas. TradingView expone una EMA(20) y un ATR(10) por separado. Una diferencia deliberada.
Donchian incluye la vela actual
La ventana es inclusiva, en línea con las funciones highest y lowest de los lenguajes de script de gráficos.
El MFI no es un RSI del volumen
Está implementado como una simple suma móvil, sin el suavizado que usa el RSI: su warm-up es igual a su periodo, no a cinco veces su periodo.
#Errores
El orden de validación es fijo: temporalidad, después limit, después símbolo, después análisis de los indicadores, después la regla del límite y después la lectura de las velas. Gana el primer fallo.
| Caso | Código |
|---|---|
| Clave ausente o no válida | 401 |
| Temporalidad no válida, limit fuera de 1 a 1000, símbolo desconocido | 422 |
| Lista indicators vacía, entrada que no es un objeto | 422 |
| Falta la clave id o type, id no válido, tipo no admitido, campo del cuerpo desconocido | 422 |
| Parámetro desconocido para el tipo, tipo equivocado, por debajo del mínimo | 422 |
| macd o adosc con fast ≥ slow, sar con acceleration '>' maximum | 422 |
| Identificador duplicado | 422 |
| Cuerpo mal formado, más de 50 indicadores, campo demasiado largo | 422 |
| limit + warm-up supera 1000 | 422 |
| Datos insuficientes para esta temporalidad, o historial de volumen demasiado corto para un indicador de volumen | 422 |
| Velocidad superada | 429 |