On the wire · 14:57:03 UTC Live 119 · Prematch 8,510 · Markets 34,182 Vol. I · No. 1 · Monday 9 November 2026 wss://pinnfeed.io/v1/stream
PinnFeed
Guía · Steam · Caídas de cuotas

Detecta caídas de cuotas y movimientos steam en Pinnacle en tiempo real

Actualizado el · PinnFeed · 4 min de lectura

Un movimiento steam es una bajada de precio rápida y fuerte en una casa que marca el mercado, como Pinnacle, normalmente porque ha entrado dinero sharp en un lado. Las casas blandas suelen ir segundos o minutos por detrás, y por eso las alertas de steam están entre las señales más útiles que puedes sacar de un feed en vivo. En esta guía construyes un detector sobre el WebSocket de PinnFeed. Es una herramienta estadística, no un sistema de pronósticos.

Paso 1 — Define qué es un steam#

Una definición práctica que puedes ajustar:

  • la cuota decimal de un resultado baja al menos un 5% desde su máximo de los últimos 2 minutos;
  • la apuesta máxima del mercado es de al menos 500, porque Pinnacle sube los límites a medida que confía más en un precio, así que los movimientos en mercados finos tienen más ruido;
  • avisas una vez por resultado y ventana, no en cada tick.

Paso 2 — Recibe el libro en streaming#

Usa el cliente Python de la guía de Python y Node. Guárdalo como pinnfeed_stream.py junto al script de abajo; llama a on_market(old, new, event) cada vez que cambia un mercado.

Paso 3 — Sigue el máximo móvil de cada resultado#

Guarda una deque corta de (timestamp, price) por mercado y resultado, descarta lo que sea más antiguo que la ventana y compara el precio actual con el máximo de la ventana:

# steam.py: detecta movimientos steam de Pinnacle (caídas de precio rápidas y fuertes) en el WebSocket en vivo.
# Usa pinnfeed_stream.py de la guía de Python/Node. pip install websockets
import asyncio, collections, os, time
from pinnfeed_stream import stream, SIDES

WINDOW_S = int(os.environ.get("WINDOW_S", 120))        # ventana hacia atrás
MIN_DROP = float(os.environ.get("MIN_DROP", 0.05))  # alerta cuando la cuota baja un 5% o más dentro de la ventana
MIN_STAKE = float(os.environ.get("MIN_STAKE", 500))  # ignora mercados con poca liquidez: la apuesta máxima de Pinnacle es una señal de confianza

history = collections.defaultdict(collections.deque)  # (id de mercado, resultado) -> deque[(ts, decimal)]
alerted = {}


def on_market(old, new, event):
    if not event or (new.get("maxStake") or 0) < MIN_STAKE:
        return
    now = time.time()
    for o in new["outcomes"]:
        if o["name"] not in SIDES:
            continue
        h = history[(new["id"], o["name"])]
        h.append((now, o["decimal"]))
        while h and now - h[0][0] > WINDOW_S:
            h.popleft()
        high = max(p for _, p in h)
        drop = 1 - o["decimal"] / high
        key = (new["id"], o["name"])
        if drop >= MIN_DROP and now - alerted.get(key, 0) > WINDOW_S:
            alerted[key] = now
            pts = o.get("points")
            line = "" if pts is None else f" {pts:g}" if new["type"] == "total" else f" {pts:+g}"
            print(f'STEAM {event["sport"]} | {event["home"]} v {event["away"]} | {new["type"]}{line} {o["name"]}: '
                  f'{high:.3f} -> {o["decimal"]:.3f} (-{drop:.1%} in {WINDOW_S}s) fair {o["fair"]:.3f} max stake {new["maxStake"]}')


asyncio.run(stream({"sports": ["soccer", "tennis", "basketball"], "markets": ["moneyline", "spread", "total"],
                    "main": True, "specials": False}, on_market))

Ejecútalo con python steam.py. Los umbrales son variables de entorno; por ejemplo, MIN_DROP=0.03 WINDOW_S=300 python steam.py para un 3% en cinco minutos. Una línea típica:

STEAM tennis | Sebastian Baez v Daniil Glinka | moneyline away: 2.260 -> 2.050 (-9.3% in 120s) fair 2.143 max stake 975

Paso 4 — O pregunta al endpoint REST#

Si solo necesitas una lista periódica, GET /v1/drops devuelve las mayores caídas en una ventana móvil, calculadas en el servidor:

curl -H "x-api-key: $PINNFEED_KEY" "https://pinnfeed.io/v1/drops?sport=soccer&live=true&minutes=10&min_pct=5"

Cada fila trae el evento, el mercado, la línea, el resultado, from, to, dropPct y movedAt. Funciona en todos los planes, también en Free con sus 30 segundos de retraso.

Paso 5 — De alertas a picks#

  • Compara con casas blandas. Un steam solo sirve donde el precio blando aún no se ha movido. La guía de value betting muestra cómo cuantificar esa ventaja con las cuotas justas de Pinnacle.
  • Prefiere el prepartido para el retraso de las casas blandas; en vivo, los movimientos suelen deberse al marcador más que a dinero sharp.
  • Mídete con el valor de la línea de cierre: si tus picks de steam baten el cierre de media, la señal es real.
  • Publícalos: el bot de picks para Telegram envía estas alertas a un canal.

Preguntas frecuentes#

¿Qué diferencia hay entre caída de cuotas y steam?#

Una caída de cuotas es cualquier bajada de precio. El steam es una caída rápida y significativa en una casa sharp, normalmente provocada por dinero informado, que después tiende a contagiarse a otras casas.

¿Por qué usar Pinnacle para detectar steam?#

Pinnacle acepta límites altos y mueve sus precios con la acción sharp, así que sus movimientos son la mejor señal del mercado. Las casas blandas los copian o van por detrás.

¿Puedo hacerlo sin el WebSocket?#

Sí, haciendo polling a /v1/drops, que funciona en todos los planes. El WebSocket ve cada movimiento cuando ocurre; el polling solo lo ve en tu siguiente petición.

El plan WebSocket: Builder, 99 €/mes.

Cuotas de Pinnacle en tiempo real por un único WebSocket: los 13 deportes, todos los mercados, cuotas justas sin margen y cuotas de cierre. 3 días gratis y cancelas con un clic.

Form K-1 · Free API key

Get your free API key.

No password. We email you a link; click it and your key is on screen.

One free key per email. Link valid for 20 minutes.