Angular · FastAPI · CCXT · Criptomonedas

API de criptomonedas: explicación del proyecto y arquitectura

Esta vista esta pensada como documentación técnica del proyecto. Aquí se explica como esta construida la API, que endpoints publica, como se autentica el cliente y como se consume desde Angular o Python.

La aplicación funcional se ha separado para que el usuario que solo quiere consultar datos pueda hacerlo sin mezclarse con el contenido didáctico.

Contexto del proyecto

El backend esta desplegado en FastAPI y utiliza CCXT para normalizar el acceso a distintos exchanges. Angular actua como cliente y consume endpoints autenticados mediante token JWT.

Esta separación mejora el mantenimiento, permite reutilizar la API desde otros clientes y deja el frontend centrado en la experiencia de usuario, el SEO y la presentación visual.

Endpoints disponibles

GET    /api/exchanges
GET    /api/exchanges/{exchange_id}/pairs?q=BTC&limit=100
GET    /api/exchanges/{exchange_id}/ticker?symbol=BTC/USDT
GET    /api/compare?symbol=BTC/USDT
GET    /api/book-ticker?exchange_id=binance&symbol=BTC/USDT
POST   /token

1. Introduccion

En la versión antigua la utilidad principal consistia en comparar el precio de un par en varios exchanges. En esta nueva versión se mantiene esa idea, pero se mejora la arquitectura: ahora la lógica de mercado vive en una API independiente y Angular actua únicamente como cliente.

Esto aporta varias ventajas: interfaz más fácil de mantener, reutilización del backend desde scripts, paneles internos o futuras apps, y una estructura más limpia para ampliar funcionalidades como filtros, históricos o alertas.

Esta herramienta tiene un enfoque didáctico. Mostrar diferencias de precio entre exchanges no garantiza arbitraje real, ya que intervienen comisiones, liquidez, slippage, tiempos de transferencia y riesgo operativo.

2. Arquitectura

Backend

FastAPI expone los endpoints, valida parametros y unifica respuestas.

Conectividad

CCXT encapsula la comunicación con exchanges y reduce diferencias de implementación.

Seguridad

La autenticación se realiza con JWT usando el endpoint /token.

Frontend

Angular consume la API, organiza estados de carga, errores y visualización de resultados.

3. Ejemplos de integracion

Una de las mejoras de esta migración es que la lógica queda desacoplada. El backend puede reutilizarse desde Angular, Python, scripts internos o futuras aplicaciones móviles.

3.1 Obtener token con Python

import requests

BASE_URL = "https://criptodatabase.1938.com.es"
USERNAME = "admin"
PASSWORD = "sdho9aehjdowjo"

response = requests.post(
    f"{BASE_URL}/token",
    data={"username": USERNAME, "password": PASSWORD},
    timeout=20,
)
response.raise_for_status()

token = response.json()["access_token"]
headers = {"Authorization": f"Bearer {token}"}

3.2 Comparar un par con Python

compare = requests.get(
    f"{BASE_URL}/api/compare",
    headers=headers,
    params={"symbol": "BTC/USDT"},
    timeout=20,
)
compare.raise_for_status()

for item in compare.json()["results"]:
    print(item["exchange"], item.get("last"), item.get("bid"), item.get("ask"))

3.3 Consumir la API desde Angular

this.cryptoApi.compareSymbol('BTC/USDT', ['binance', 'kraken']).subscribe({
  next: (response) => {
    this.compareResults = response.results;
  },
  error: (error) => {
    console.error('Error consultando la API', error);
  }
});

4. Conceptos utiles

Que es un exchange?

Es una plataforma donde se negocian criptomonedas y otros pares digitales.

Que es un par?

Es la relación entre dos activos, por ejemplo BTC/USDT o ETH/EUR.

Que significa bid/ask?

Bid es la mejor compra disponible y ask la mejor venta disponible.

Por que dos exchanges muestran precios distintos?

Porque la liquidez, el volumen, el libro de ordenes y la demanda no son identicos en todos los mercados.

5. Criterios para llevar esta API a un proyecto real

Una API de datos de mercado solo es útil si el cliente entiende sus límites. Antes de usar este patrón en producción, lo importante no es solo llamar endpoints, sino controlar frescura, errores, autenticación y coste operativo.

Como interpretar los resultados

La tabla de comparación debe leerse como una fotografia de mercado. Bid, ask y último precio pueden cambiar entre peticiones, y un último precio más barato puede venir de un mercado poco liquido o desactualizado. Para analizar, combina la fotografia con volumen, timestamp, spread y comisiones.

Cachear listados de exchanges y catalogos de pares, porque no hace falta pedirlos en cada carga de página.

Aplicar timeouts y mensajes de error claros: las APIs de exchanges pueden fallar, limitar peticiones o devolver datos parciales.

No exponer credenciales de exchanges ni claves privilegiadas en Angular; el navegador debe hablar solo con tu backend.

Separar comparación didáctica de ejecución de trading. Una diferencia de precio no es por si sola una señal de compra o venta.

Registrar errores del backend por exchange para detectar proveedores inestables en vez de mostrar fallos genéricos.

6. Enlaces del proyecto