Detecte quedas de odds e movimentos de steam na Pinnacle em tempo real
Um movimento de steam é uma queda de preço rápida e forte numa casa que forma o mercado, como a Pinnacle, normalmente porque entrou dinheiro sharp de um lado. As casas soft costumam ficar segundos ou minutos atrás, e é por isso que alertas de steam estão entre os sinais mais úteis que você pode tirar de um feed ao vivo. Neste guia você monta um detector sobre o WebSocket da PinnFeed. É uma ferramenta estatística, não um sistema de palpites.
Passo 1 — Defina o que é steam#
Uma definição prática que você pode ajustar:
- a odd decimal de um resultado cai pelo menos 5% em relação ao máximo dos últimos 2 minutos;
- o limite máximo do mercado é de pelo menos 500, porque a Pinnacle aumenta os limites conforme ganha confiança num preço, então movimentos em mercados com pouca liquidez têm mais ruído;
- você alerta uma vez por resultado e janela, não a cada tick.
Passo 2 — Receba o book em streaming#
Use o cliente Python do guia de Python e Node. Salve como pinnfeed_stream.py ao lado do script abaixo; ele chama on_market(old, new, event) toda vez que um mercado muda.
Passo 3 — Acompanhe o máximo móvel de cada resultado#
Guarde uma deque curta de (timestamp, price) por mercado e resultado, descarte o que for mais antigo que a janela e compare o preço atual com o máximo da janela:
# steam.py: sinaliza movimentos de steam na Pinnacle (quedas de odds rápidas e fortes) a partir do WebSocket ao vivo.
# Usa o pinnfeed_stream.py do guia 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)) # janela de observação
MIN_DROP = float(os.environ.get("MIN_DROP", 0.05)) # alerta quando a odd cai 5% ou mais dentro da janela
MIN_STAKE = float(os.environ.get("MIN_STAKE", 500)) # ignora mercados com pouca liquidez: o limite máximo da Pinnacle é um sinal de confiança
history = collections.defaultdict(collections.deque) # (id do 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))
Rode com python steam.py. Os limites são variáveis de ambiente; por exemplo, MIN_DROP=0.03 WINDOW_S=300 python steam.py para 3% em cinco minutos. Uma linha 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
Passo 4 — Ou pergunte ao endpoint REST#
Se você só precisa de uma lista periódica, GET /v1/drops devolve as maiores quedas numa janela móvel, calculadas no servidor:
curl -H "x-api-key: $PINNFEED_KEY" "https://pinnfeed.io/v1/drops?sport=soccer&live=true&minutes=10&min_pct=5"
Cada linha traz o evento, o mercado, a linha, o resultado, from, to, dropPct e movedAt. Funciona em todos os planos, inclusive no Free com seus 30 segundos de atraso.
Passo 5 — De alertas a palpites#
- Compare com casas soft. Um steam só é útil onde o preço da casa soft ainda não acompanhou. O guia de value bet mostra como medir essa vantagem com as odds justas da Pinnacle.
- Prefira o pré-jogo para o atraso das casas soft; ao vivo, os movimentos costumam vir do placar e não de dinheiro sharp.
- Meça seus resultados com o closing line value: se seus palpites de steam batem o fechamento em média, o sinal é real.
- Publique: o bot de palpites no Telegram manda esses alertas para um canal.
Perguntas frequentes#
Qual a diferença entre queda de odds e steam?#
Queda de odds é qualquer redução de preço. Steam é uma queda rápida e significativa numa casa sharp, normalmente causada por dinheiro informado, que depois tende a se espalhar para outras casas.
Por que usar a Pinnacle para detectar steam?#
A Pinnacle aceita limites altos e move seus preços com a ação sharp, então os movimentos dela são o melhor sinal do mercado. As casas soft copiam ou ficam para trás.
Dá para fazer isso sem o WebSocket?#
Sim, fazendo polling em /v1/drops, que funciona em todos os planos. O WebSocket vê cada movimento quando acontece; o polling só vê na próxima requisição.