Do Zero ao Leaderboard do Open Poker em 7 Dias: Um Plano Diario
Voce pode levar um bot de poker de "nao existe" a "ranqueado no leaderboard do Open Poker" em 7 dias. Nao 7 semanas. A plataforma foi construida pra que um desenvolvedor possa se registrar, conectar e jogar no dia 1, e depois adicionar uma melhoria de estrategia por dia ate ficar competitivo. Aqui esta o plano que recomendamos, com as melhorias exatas que fazem diferenca e as que nao fazem.
Por que o plano de 7 dias funciona?
Porque cada dia adiciona uma unica melhoria isolada em cima de um bot funcional. Voce nao esta construindo um sistema de ponta a ponta antes da primeira mao. Voce esta colocando um calling station pra rodar no dia 1 e melhorando incrementalmente. Ate o dia 7, cada melhoria foi validada contra oponentes reais, nao contra um simulador de self-play que mente pra voce.
Isso e o oposto de como a maioria dos projetos de bot fracassam. A maioria dos desenvolvedores passa duas semanas projetando uma arquitetura "completa", e so percebe no dia 14 que o avaliador de maos nao bate com o formato de cartas do protocolo, ou que o enviador de acoes esqueceu o turn token, ou que o calculador de pot odds usa o campo errado. O plano de 7 dias adia tudo isso ate o bot ja estar rodando.
A outra razao pela qual funciona: o leaderboard do Open Poker recompensa volume mais do que habilidade de pico. Um bot mediocre que roda 7 dias pontua mais que um bot brilhante que roda 1 dia. Ate o dia 7, voce tem 4-5 dias de historico de maos acumulado, o que e reducao de variancia suficiente pra subir acima do fundo do ranking mesmo que sua estrategia ainda esteja crua.
Dia 1: Coloque um calling station pra rodar
Seu unico objetivo no dia 1 e um bot conectado que joga maos legais. Nao se preocupe com estrategia. Nao se preocupe com lucros. Nao se preocupe com nada exceto: bot conecta, bot entra na mesa, bot responde a your_turn com uma acao valida, bot nao crasha por 30 minutos.
Use o guia de como criar um bot de poker em Python como ponto de partida. O bot completo tem menos de 50 linhas. Copie, cole sua API key, rode. Voce vai ver "Connected as NomeDoSeuBot" em 30 segundos e sua primeira mao em um ou dois minutos depois de entrar no lobby.
A estrategia calling station (check se puder, senao call, senao fold) perde fichas, mas produz event loops completos. Todo tipo de mensagem e tratado. Toda acao e enviada com um turn token valido. Ate o final do dia 1, seu bot jogou 50-100 maos e voce tem um baseline de win rate pra melhorar.
Meta do final do dia: bot jogou pelo menos 20 maos, sem crashes, sem timeouts.
Dia 2: Adicione selecao de maos pre-flop
A maior melhoria que voce pode fazer em cima do calling station. A maioria das maos iniciais no Hold'em sao perdedoras; dar fold nos 60% piores pre-flop reduz drasticamente as fichas que voce sangra no flop e adiante.
def should_play_preflop(cards):
"""Top ~40% of starting hands."""
ranks = "23456789TJQKA"
r1 = ranks.index(cards[0][0])
r2 = ranks.index(cards[1][0])
high, low = max(r1, r2), min(r1, r2)
pair = r1 == r2
suited = cards[0][1] == cards[1][1]
if pair: return True
if high >= 10: return True
if high >= 8 and suited: return True
if high == 12 and low >= 7: return True
return FalseGuarde as hole cards quando hole_cards chegar. No your_turn, se for pre-flop e should_play_preflop() retornar False, fold. Senao volte pra logica do calling station.
Essa unica mudanca tipicamente leva um calling station de -2,5 bb/100 pra cerca de -0,8 bb/100. Voce ainda ta perdendo fichas, mas ta perdendo a uma taxa que nao dispara rebuys frequentes. Meta do final do dia: 200+ maos jogadas, win rate acima de 12%.
Dia 3: Adicione raise pre-flop
O bot do dia 2 da fold nas maos ruins mas nunca da raise nas boas. Oponentes veem flops gratis contra suas maos premium, o que significa que eles conseguem fazer maos que te vencem. Correcao: raise nos seus top 15% de maos em vez de so dar call.
def should_raise_preflop(cards):
ranks = "23456789TJQKA"
r1, r2 = ranks.index(cards[0][0]), ranks.index(cards[1][0])
pair = r1 == r2
high, low = max(r1, r2), min(r1, r2)
suited = cards[0][1] == cards[1][1]
# Premium pairs
if pair and r1 >= 8: return True # 99+
# Big aces
if high == 12 and low >= 9: return True # AT+
# Suited broadway
if suited and high >= 10 and low >= 9: return True
return FalseQuando isso retornar True e raise estiver em valid_actions, mande um min-raise em vez de so dar call. O campo amount e o total do raise-to, nao um incremento. Use o valor min da entrada de raise como seu amount.
Meta do final do dia: 400+ maos jogadas, win rate acima de 16%, bb/100 se aproximando do break-even.
Dia 4: Adicione pot odds pra calls pos-flop
Pos-flop e onde bots perdem mais fichas. Dar call em apostas aleatorias sem fazer a conta e o que faz um calling station ser calling station. Corrija com pot odds.
A conta: divida o valor do call pelo pot depois do seu call. Se sua probabilidade estimada de vitoria excede essa proporcao, call. Senao, fold. O tutorial matematica de poker pra bots cobre a formula em detalhe.
def call_is_profitable(your_turn_msg, win_pct=0.30):
actions = {a["action"]: a for a in your_turn_msg["valid_actions"]}
if "call" not in actions:
return False
pot = your_turn_msg["pot"]
call_amt = actions["call"]["amount"]
if call_amt == 0:
return True
pot_odds = call_amt / (pot + call_amt)
return win_pct > pot_oddsPro dia 4, use uma estimativa fixa de 30% de win rate. Esta errado na maioria dos spots especificos, mas na media e um default muito melhor que "sempre call". Voce vai dar fold em rivers onde nao tem nada e continuar com maos que tem equity realista.
Meta do final do dia: 600+ maos jogadas, bb/100 no break-even ou levemente positivo.
Dia 5: Rastreie VPIP dos oponentes
O dia 5 e quando voce para de jogar toda mao igual e comeca a se adaptar a mesa. Construa um tracker simples que registra com que frequencia cada jogador coloca fichas pre-flop. O guia de modelagem de oponentes tem a implementacao completa, mas uma versao minima viavel:
from collections import defaultdict
vpip_data = defaultdict(lambda: {"hands": 0, "voluntary": 0})
acted_this_hand = set()
def on_hand_start():
acted_this_hand.clear()
def on_player_action(msg):
name = msg.get("name", f"seat{msg['seat']}")
if msg["action"] in ("call", "raise", "all_in"):
if name not in acted_this_hand:
vpip_data[name]["hands"] += 1
vpip_data[name]["voluntary"] += 1
acted_this_hand.add(name)
def get_vpip(name, default=0.25):
data = vpip_data[name]
if data["hands"] < 20:
return default
return data["voluntary"] / data["hands"]Use VPIP pra ajustar seu range de raise. Contra um oponente com VPIP abaixo de 15% em posicao final, expanda seu range de steal. Contra um oponente com VPIP acima de 50%, so aposte por valor (nao blufe: eles dao call demais).
Meta do final do dia: 800+ maos, bot identificando pelo menos 5 oponentes distintos.
Dia 6: Adicione variacao de bet sizing
Bet sizing estatico e o proximo vazamento. A maioria dos bots iniciantes sempre faz min-raise ou sempre aposta o tamanho do pot. Ambos estao errados. Misture tres tamanhos baseados na situacao:
| Situacao | Tamanho | Raciocinio |
|---|---|---|
| Open pre-flop de posicao final | 2,5x BB | Open padrao, equilibra frequencia de steal com valor |
| Continuation bet em board seco | 33% do pot | Barato, faz maos fracas foldarem |
| Value bet em board molhado | 75% do pot | Cobra dos draws, constroi o pot por valor |
Calcule o valor do raise baseado na situacao, limite ao min/max de valid_actions e envie. Misturar tamanhos te torna visivelmente menos exploravel. Oponentes que rastreiam padroes nao conseguem mais adivinhar a forca da sua mao so pelo tamanho da aposta. O tutorial de estrategia de aposta tem o detalhamento completo.
Meta do final do dia: 1.000+ maos, bb/100 positivo mensuravel, top 50% do leaderboard.
Dia 7: Rode, monitore, itere
O dia 7 nao e sobre novas funcionalidades. E sobre rodar seu bot por 12+ horas seguidas, observar o leaderboard e corrigir o que quebrar. O guia de debug cobre os modos de falha mais comuns (problemas de auth, timeouts, race conditions).
Tres coisas pra verificar:
1. Log de crashes. Envolva seu loop principal num try/except que loga toda excecao com timestamp. Rode por 4 horas, depois leia o log. Corrija o erro mais frequente primeiro.
2. Decisoes lentas. Adicione logging de latencia do guia de timeout. Qualquer coisa acima de 1 segundo merece investigacao.
3. Win rate por hora. Agrupe seu historico de maos por hora do dia e verifique se seu win rate varia. Alguns bots ganham em horarios de pico (mais oponentes = mais jogadores fracos pra explorar) mas perdem fora do pico. Use isso pra decidir quando manter seu bot rodando.
Meta do final do dia: Bot jogou 1.500+ maos nos 7 dias, esta no top 25% do leaderboard da season atual e roda sem supervisao por 12+ horas sem intervencao.
Como a progressao de 7 dias realmente se parece?
Aqui esta a trajetoria aproximada de win rate que vimos em varios desenvolvedores que seguiram esse plano:
| Dia | Estrategia adicionada | Mediana bb/100 | Maos ate o final do dia |
|---|---|---|---|
| 1 | Calling station | -2,5 | 50 |
| 2 | Range de fold pre-flop | -0,8 | 200 |
| 3 | Range de raise pre-flop | -0,3 | 400 |
| 4 | Pot odds pos-flop | +0,4 | 600 |
| 5 | Leitura de oponentes via VPIP | +1,1 | 800 |
| 6 | Variacao de bet sizing | +1,7 | 1.000 |
| 7 | Estabilidade e uptime | +1,7 | 1.500+ |
Os maiores saltos sao nos dias 2 e 5: selecao de maos pre-flop e modelagem de oponentes. Essas sao as melhorias mais baratas por linha de codigo. Os dias 4 e 6 sao ganhos menores mas acumulam bem. O dia 7 nao adiciona vantagem, mas converte a vantagem que voce ja tem numa posicao no leaderboard acumulando maos.
Isso nao e um estudo rigoroso. A variancia em 6-max e alta e resultados individuais variam pelo pool de jogadores da season, mas direcionalmente o padrao e consistente: melhorias simples empilhadas viram um bot competitivo em menos de uma semana de trabalho parcial.
O que voce NAO deve fazer na primeira semana?
Tres armadilhas pra evitar.
Nao escreva um avaliador de maos do zero. E tentador porque parece o trabalho "real" de poker. E um projeto de varios dias que nao adiciona nenhuma vantagem mensuravel sobre uma heuristica simples de probabilidade de vitoria. Se voce absolutamente precisa de forca de mao, use PokerKit ou Treys (bibliotecas Python com avaliadores testados em batalha) em vez de escrever o seu. A gente usa PokerKit no servidor pelo mesmo motivo.
Nao tente implementar CFR ou resolucao GTO. Counterfactual Regret Minimization e a tecnica por tras do Pluribus e Libratus. Tambem e um projeto de pesquisa de varios meses que requer dezenas de milhoes de maos de treinamento. Pra um primeiro bot, voce vai ter resultados melhores gastando o mesmo tempo em heuristicas basicas. Adicione CFR depois se quiser passar do top 20%.
Nao faca deploy no dia 1 sem tratamento de erros. Envolva seu event loop num try/except, logue toda excecao e continue. Bots que crasham com uma unica mensagem ruim perdem todo o tempo de mesa que teriam acumulado durante a noite. A correcao e um bloco try/except.
O que vem depois do dia 7?
Quando voce tem um bot competitivo funcionando, a proxima rodada de melhorias sao incrementais e de alto impacto:
- Ranges baseados em posicao: mais tight under the gun, mais loose no cutoff e button
- Planejamento multi-street: pense no que voce vai fazer no turn antes de apostar no flop
- Selecao de bluffs: escolha boards onde bluffs sao criveis (cartas altas, menos draws)
- Gerenciamento de bankroll: varie seu buy-in baseado nos resultados da sessao
Cada uma dessas adiciona mais 0,5-1,5 bb/100 se implementada bem. O caminho pro top 10 do leaderboard nao e um unico avanco; e empilhar 10 pequenas melhorias ate seu bot ter uma vantagem mensuravel em todo spot comum. A documentacao completa da plataforma cobre cada detalhe do protocolo que voce vai precisar pra proxima rodada.
FAQ
Quanto tempo realmente leva pra criar um bot de poker competitivo? Pra um primeiro bot competitivo (top 25% do leaderboard), 7 dias de trabalho parcial e realista. Pro top 10% espere 2-4 semanas de iteracao e ajuste. Top 1% requer algoritmos estilo CFR, profiling de oponentes em escala e meses de refinamento.
Posso seguir esse plano com outra linguagem alem de Python?
Sim. O protocolo e puro WebSocket mais JSON, entao qualquer linguagem com suporte a WebSocket funciona. JavaScript, Go, Rust, Java, C++, ate Bash com websocat ja foram usados pra construir bots no Open Poker. Os exemplos em Python se traduzem diretamente.
Quantas maos preciso jogar pra subir no leaderboard? Voce precisa de pelo menos 10 maos pra aparecer no leaderboard. Pra subir significativamente, planeje 1.000-2.000 maos ao longo da season. Mais maos reduz variancia e deixa sua vantagem aparecer.
Preciso de uma conta Pro pra seguir esse plano? Nao. Tudo nesse plano funciona com conta gratuita. O plano Pro ($5/season, com descontos em pacotes) adiciona analytics, estrategias customizadas e cooldowns de rebuy menores, mas as melhorias de estrategia em si sao gratuitas. Veja a comparacao de funcionalidades Pro pra lista completa.
E se meu bot quebrar antes de eu terminar o plano?
Auto-rebuy cuida disso. Mande {"type": "set_auto_rebuy", "enabled": true} uma vez depois de conectar e o servidor vai automaticamente fazer rebuy (com cooldown de 5 minutos no plano gratuito) quando seu bot quebrar. Seu event loop continua rodando e a proxima mao comeca assim que o cooldown expirar.
Sete dias de trabalho focado sao suficientes pra levar um bot de poker do zero a competidor no leaderboard do Open Poker. A plataforma foi projetada pra essa velocidade de iteracao. Registre um bot, siga o plano dia a dia, e voce vai ter uma entrada ranqueada ate semana que vem.