Del Cero al Leaderboard de Open Poker en 7 Dias: Un Plan Diario
Puedes llevar un bot de poker de "no existe" a "ranqueado en el leaderboard de Open Poker" en 7 dias. No 7 semanas. La plataforma esta construida para que un desarrollador pueda registrarse, conectarse y jugar el dia 1, y despues agregar una mejora de estrategia por dia hasta ser competitivo. Aqui esta el plan que recomendamos, con las mejoras exactas que marcan la diferencia y las que no.
Por que funciona el plan de 7 dias?
Porque cada dia agrega una unica mejora aislada sobre un bot funcional. No estas construyendo un sistema de principio a fin antes de la primera mano. Estas poniendo un calling station a correr el dia 1 y mejorando incrementalmente. Para el dia 7, cada mejora fue validada contra oponentes reales, no contra un simulador de self-play que te miente.
Esto es lo opuesto a como fracasan la mayoria de los proyectos de bots. La mayoria de los desarrolladores pasan dos semanas disenando una arquitectura "completa", y recien se dan cuenta el dia 14 de que su evaluador de manos no coincide con el formato de cartas del protocolo, o que su enviador de acciones se olvido del turn token, o que su calculador de pot odds usa el campo equivocado. El plan de 7 dias aplaza todo eso hasta que el bot ya esta corriendo.
La otra razon por la que funciona: el leaderboard de Open Poker premia el volumen mas que la habilidad pico. Un bot mediocre que corre 7 dias puntua mas que un bot brillante que corre 1 dia. Para el dia 7, tienes 4-5 dias de historial de manos acumulado, lo cual es suficiente reduccion de varianza para subir por encima del fondo del ranking aunque tu estrategia siga siendo tosca.
Dia 1: Pon un calling station a correr
Tu unico objetivo el dia 1 es un bot conectado que juega manos legales. No te preocupes por la estrategia. No te preocupes por las ganancias. No te preocupes por nada excepto: bot se conecta, bot se une a una mesa, bot responde a your_turn con una accion valida, bot no crashea por 30 minutos.
Usa la guia de como crear un bot de poker en Python como punto de partida. El bot completo tiene menos de 50 lineas. Copialo, pega tu API key, ejecutalo. Vas a ver "Connected as NombreDeTuBot" en 30 segundos y tu primera mano en uno o dos minutos despues de unirte al lobby.
La estrategia calling station (check si puedes, si no call, si no fold) pierde fichas pero produce event loops completos. Cada tipo de mensaje se maneja. Cada accion se envia con un turn token valido. Al final del dia 1, tu bot jugo 50-100 manos y tienes un baseline de win rate para mejorar.
Meta del final del dia: bot jugo al menos 20 manos, sin crashes, sin timeouts.
Dia 2: Agrega seleccion de manos pre-flop
La mayor mejora que puedes hacer sobre el calling station. La mayoria de las manos iniciales en Hold'em son perdedoras; hacer fold en el 60% peor pre-flop reduce drasticamente las fichas que sangras en el flop y despues.
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 FalseGuarda las hole cards cuando llegue hole_cards. En your_turn, si es pre-flop y should_play_preflop() retorna False, fold. Si no, vuelve a la logica del calling station.
Este unico cambio tipicamente lleva un calling station de -2.5 bb/100 a alrededor de -0.8 bb/100. Sigues perdiendo fichas, pero las pierdes a una tasa que no dispara rebuys frecuentes. Meta del final del dia: 200+ manos jugadas, win rate por encima del 12%.
Dia 3: Agrega raise pre-flop
El bot del dia 2 foldea las manos malas pero nunca raisea las buenas. Los oponentes ven flops gratis contra tus manos premium, lo que significa que logran hacer manos que te ganan. Solucion: raise con tu 15% mas fuerte de manos en vez de solo hacer 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 FalseCuando esto retorne True y raise este en valid_actions, envia un min-raise en vez de solo hacer call. El campo amount es el total del raise-to, no un incremento. Usa el valor min de la entrada de raise como tu amount.
Meta del final del dia: 400+ manos jugadas, win rate por encima del 16%, bb/100 acercandose al break-even.
Dia 4: Agrega pot odds para calls post-flop
Post-flop es donde los bots pierden mas fichas. Hacer call en apuestas aleatorias sin hacer la cuenta es lo que hace que un calling station sea calling station. Corrigelo con pot odds.
La cuenta: divide el monto del call por el pot despues de tu call. Si tu probabilidad estimada de ganar excede esa proporcion, call. Si no, fold. El tutorial de matematicas de poker para bots cubre la formula en detalle.
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_oddsPara el dia 4, usa una estimacion fija de 30% de win rate. Esta mal en la mayoria de spots especificos, pero en promedio es un default mucho mejor que "siempre call". Vas a foldear rivers donde no tienes nada y continuar con manos que tienen equity realista.
Meta del final del dia: 600+ manos jugadas, bb/100 en break-even o levemente positivo.
Dia 5: Rastrea VPIP de los oponentes
El dia 5 es cuando dejas de jugar cada mano igual y empiezas a adaptarte a la mesa. Construye un tracker simple que registra con que frecuencia cada jugador mete fichas pre-flop. La guia de modelado de oponentes tiene la implementacion completa, pero una version minima viable:
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"]Usa VPIP para ajustar tu rango de raise. Contra un oponente con VPIP por debajo de 15% en posicion tardia, expande tu rango de steal. Contra un oponente con VPIP por encima de 50%, solo apuesta por valor (no blufees: hacen call demasiado).
Meta del final del dia: 800+ manos, bot identificando al menos 5 oponentes distintos.
Dia 6: Agrega variacion de bet sizing
El bet sizing estatico es la siguiente fuga. La mayoria de los bots principiantes siempre hacen min-raise o siempre apuestan el tamano del pot. Ambos estan mal. Mezcla tres tamanos segun la situacion:
| Situacion | Tamano | Razonamiento |
|---|---|---|
| Open pre-flop desde posicion tardia | 2.5x BB | Open estandar, balancea frecuencia de steal con valor |
| Continuation bet en board seco | 33% del pot | Barato, hace que manos debiles foldeen |
| Value bet en board mojado | 75% del pot | Cobra a los draws, construye el pot por valor |
Calcula tu monto de raise segun la situacion, limita al min/max de valid_actions y envia. Mezclar tamanos te hace notablemente menos explotable. Los oponentes que rastrean patrones ya no pueden adivinar la fuerza de tu mano solo por el tamano de la apuesta. El tutorial de estrategia de apuestas tiene el desglose completo.
Meta del final del dia: 1,000+ manos, bb/100 mediblemente positivo, top 50% del leaderboard.
Dia 7: Corre, monitorea, itera
El dia 7 no es sobre funcionalidades nuevas. Es sobre correr tu bot por 12+ horas seguidas, observar el leaderboard y parchear lo que se rompa. La guia de debug cubre los modos de falla mas comunes (problemas de auth, timeouts, race conditions).
Tres cosas para verificar:
1. Log de crashes. Envuelve tu loop principal en un try/except que loguee cada excepcion con timestamp. Corre por 4 horas, despues lee el log. Corrige el error mas frecuente primero.
2. Decisiones lentas. Agrega logging de latencia de la guia de timeout. Cualquier cosa por encima de 1 segundo merece investigacion.
3. Win rate por hora. Agrupa tu historial de manos por hora del dia y verifica si tu win rate varia. Algunos bots ganan en horarios pico (mas oponentes = mas jugadores debiles para explotar) pero pierden fuera de pico. Usa esto para decidir cuando mantener tu bot corriendo.
Meta del final del dia: Bot jugo 1,500+ manos en los 7 dias, esta en el top 25% del leaderboard de la season actual y corre sin supervision por 12+ horas sin intervencion.
Como se ve realmente la progresion de 7 dias?
Aqui esta la trayectoria aproximada de win rate que hemos visto en varios desarrolladores que siguieron este plan:
| Dia | Estrategia agregada | Mediana bb/100 | Manos al final del dia |
|---|---|---|---|
| 1 | Calling station | -2.5 | 50 |
| 2 | Rango de fold pre-flop | -0.8 | 200 |
| 3 | Rango de raise pre-flop | -0.3 | 400 |
| 4 | Pot odds post-flop | +0.4 | 600 |
| 5 | Lectura de oponentes via VPIP | +1.1 | 800 |
| 6 | Variacion de bet sizing | +1.7 | 1,000 |
| 7 | Estabilidad y uptime | +1.7 | 1,500+ |
Los saltos mas grandes son en los dias 2 y 5: seleccion de manos pre-flop y modelado de oponentes. Estas son las mejoras mas baratas por linea de codigo. Los dias 4 y 6 son ganancias menores pero se acumulan bien. El dia 7 no agrega ventaja, pero convierte la ventaja que ya tienes en una posicion en el leaderboard acumulando manos.
Esto no es un estudio riguroso. La varianza en 6-max es alta y los resultados individuales varian segun el pool de jugadores de la season, pero direccionalmente el patron es consistente: mejoras simples apiladas se convierten en un bot competitivo en menos de una semana de trabajo parcial.
Que NO deberias hacer en la primera semana?
Tres trampas para evitar.
No escribas un evaluador de manos desde cero. Es tentador porque se siente como el trabajo "real" de poker. Es un proyecto de varios dias que no agrega ninguna ventaja medible sobre una heuristica simple de probabilidad de victoria. Si absolutamente necesitas fuerza de mano, usa PokerKit o Treys (bibliotecas Python con evaluadores probados en batalla) en vez de escribir el tuyo. Nosotros usamos PokerKit en el servidor por la misma razon.
No intentes implementar CFR o resolucion GTO. Counterfactual Regret Minimization es la tecnica detras de Pluribus y Libratus. Tambien es un proyecto de investigacion de varios meses que requiere decenas de millones de manos de entrenamiento. Para un primer bot, vas a obtener mejores resultados gastando el mismo tiempo en heuristicas basicas. Agrega CFR despues si quieres pasar del top 20%.
No hagas deploy el dia 1 sin manejo de errores. Envuelve tu event loop en un try/except, loguea cada excepcion y sigue. Los bots que crashean con un solo mensaje malo pierden todo el tiempo de mesa que habrian acumulado durante la noche. La solucion es un bloque try/except.
Que viene despues del dia 7?
Una vez que tienes un bot competitivo funcionando, la siguiente ronda de mejoras son incrementales y de alto impacto:
- Rangos basados en posicion: mas tight under the gun, mas loose en el cutoff y button
- Planificacion multi-street: piensa en lo que vas a hacer en el turn antes de apostar en el flop
- Seleccion de bluffs: elige boards donde los bluffs son creibles (cartas altas, menos draws)
- Gestion de bankroll: varia tu buy-in segun los resultados de la sesion
Cada una de estas agrega otros 0.5-1.5 bb/100 si se implementa bien. El camino a terminar top 10 en el leaderboard no es un solo avance; es apilar 10 mejoras pequenas hasta que tu bot tenga una ventaja medible en cada spot comun. La documentacion completa de la plataforma cubre cada detalle del protocolo que necesitaras para la siguiente ronda.
FAQ
Cuanto tiempo realmente toma construir un bot de poker competitivo? Para un primer bot competitivo (top 25% del leaderboard), 7 dias de trabajo parcial es realista. Para el top 10% espera 2-4 semanas de iteracion y ajuste. El top 1% requiere algoritmos estilo CFR, profiling de oponentes a escala y meses de refinamiento.
Puedo seguir este plan con un lenguaje diferente a Python?
Si. El protocolo es puro WebSocket mas JSON, asi que cualquier lenguaje con soporte de WebSocket funciona. JavaScript, Go, Rust, Java, C++, incluso Bash con websocat se han usado para construir bots en Open Poker. Los ejemplos en Python se traducen directamente.
Cuantas manos necesito jugar para subir en el leaderboard? Necesitas al menos 10 manos para aparecer en el leaderboard. Para subir significativamente, planea 1,000-2,000 manos a lo largo de la season. Mas manos reduce varianza y deja que tu ventaja se muestre.
Necesito una cuenta Pro para seguir este plan? No. Todo en este plan funciona con una cuenta gratuita. El plan Pro ($5/season, con descuentos en paquetes) agrega analytics, estrategias personalizadas y cooldowns de rebuy mas cortos, pero las mejoras de estrategia en si son gratuitas. Consulta la comparacion de funcionalidades Pro para la lista completa.
Que pasa si mi bot quiebra antes de terminar el plan?
Auto-rebuy lo maneja. Envia {"type": "set_auto_rebuy", "enabled": true} una vez despues de conectarte y el servidor automaticamente hara rebuy (con un cooldown de 5 minutos en el plan gratuito) cuando tu bot quiebre. Tu event loop sigue corriendo y la siguiente mano empieza apenas expire el cooldown.
Siete dias de trabajo enfocado son suficientes para llevar un bot de poker del cero a competidor en el leaderboard de Open Poker. La plataforma esta disenada para esta velocidad de iteracion. Registra un bot, sigue el plan dia a dia, y vas a tener una entrada ranqueada para la proxima semana.