Zum Inhalt springen
[OPEN_POKER]♠

Poker-Bot-Positionsranges: Eröffne nicht von jedem Sitz gleich

JJoão Carvalho||Aktualisiert |8 Min. Lesezeit

Lektion 6 von 13: Strategie ergänzen

Frühe und späte Position auch bei Lücken in der Sitzbelegung unterscheiden. Schließe Lektion 5 ab, verwende Python 3.11 oder neuer und installiere die Abhängigkeiten aus der beiliegenden requirements.txt.

Dein Poker-Bot sollte nicht von jedem Sitz dieselben Hände spielen. Beim 6-max-No-Limit-Hold'em agiert der Button nach dem Flop zuletzt, während die Blinds zuerst handeln. Diese eine Tatsache verändert, welche Hände Chips gewinnen und welche deinen Stack unbemerkt schrumpfen lassen.

Teil des vollständigen Leitfadens zum Bau eines KI-Poker-Bots im Jahr 2026 - der umfassende Leitfaden zu Frameworks, Entscheidungslogik, Equity, Tests und Spielmöglichkeiten.

Wichtigste Erkenntnisse

  • Positionsranges sind ein günstiger Vorteil, weil sie Preflop-Fehler beheben, bevor die Hand teuer wird.
  • Frühe Positionen brauchen enge Open-Ranges. In später Position kannst du häufiger stehlen, weil weniger Spieler übrig sind.
  • Implementiere Ranges zuerst als Sets von Handcodes. Füge Gegnermodellierung erst hinzu, wenn die Basis funktioniert.

Warum ist die Position so wichtig?

Die Position ist wichtig, weil Spieler in später Position ihre Entscheidungen mit mehr Informationen treffen. Open Pokers Strategiedokumentation nennt frühe Position, späte Position und Blinds als getrennte Entscheidungskontexte (Aktions- und Strategiedokumentation). In einem 6-max-Spiel gibt es pro Orbit sechs Sitze und bei der 10/20-Struktur insgesamt 30 erzwungene Chips in den Blinds.

Ein Bot, der KTo under the gun eröffnet, muss noch fünf Spieler hinter sich fürchten. Eröffnet derselbe Bot dieselbe Hand am Button, müssen nur noch die beiden Blinds handeln. Gleiche Karten, anderes Risiko.

Hier verlieren Anfänger-Bots unauffällig. Sie berechnen eine einzelne Zahl mit hand_strength() und verwenden sie von jedem Sitz aus. Bei offensichtlichen Händen wie Assen funktioniert das. Es scheitert bei den Händen, die über die meisten Saisons entscheiden: Suited Connectors, schwache Asse, kleine Paare und Broadway-Trash.

Welche sechs nützlichen Sitzkategorien gibt es?

Verwende sechs Kategorien: UTG, HJ, CO, BTN, SB und BB. Open Poker sendet dealer_seat in hand_start; dein Bot kennt seinen eigenen Sitz aus table_joined und kann aus diesen beiden Zahlen die relative Position berechnen (WebSocket-Dokumentation).

POSITIONS_BY_SIZE = {
    2: ["BTN/SB", "BB"],
    3: ["BTN", "SB", "BB"],
    4: ["BTN", "SB", "BB", "CO"],
    5: ["BTN", "SB", "BB", "UTG", "CO"],
    6: ["BTN", "SB", "BB", "UTG", "HJ", "CO"],
}
 
 
def position_name(hero_seat, dealer_seat, active_seats):
    ordered = sorted(set(active_seats))
    if len(ordered) not in POSITIONS_BY_SIZE:
        raise ValueError("Expected two to six dealt-in seats")
    dealer_index = ordered.index(dealer_seat)
    relative = ordered[dealer_index:] + ordered[:dealer_index]
    seat_to_position = dict(zip(relative, POSITIONS_BY_SIZE[len(ordered)]))
    return seat_to_position[hero_seat]

Übergib die Sitze, die Karten erhalten haben, einschließlich der Spieler, die später folden. Berechne die Position nicht anhand der Spieler, die noch um den Pot kämpfen. Die Zuordnung unterstützt Lücken in der Sitznummerierung und behandelt im Heads-up den Button als Small Blind. Fehlt der Dealer- oder dein eigener Sitz, stelle den Handzustand wieder her, statt zu raten.

Welche Open-Ranges sollte ein erster Bot verwenden?

Starte tighter, als du denkst. Eine praktische Grundlage für Anfänger sind 12 % von UTG, 16 % von HJ, 22 % von CO, 35 % vom BTN und eine vorsichtige Small-Blind-Range. Diese Werte sind nicht solverperfekt. Sie reichen aber aus, um die schlimmsten Leaks zu stoppen, während deine Postflop-Logik aufholt.

PositionZiel für Open-RangeBeispielhände
UTG12 %77+, AJs+, KQs, AQo+
HJ16 %66+, ATs+, KJs+, QJs, AJo+
CO22 %55+, A8s+, KTs+, QTs+, JTs, ATo+, KQo
BTN35 %22+, die meisten Suited Aces, Broadways, Suited Connectors
SB28 %Eröffne Hände, die sich im Heads-up gut spielen lassen, und folde Junk
BBNach Preis verteidigenCall abhängig von Pot Odds und Spielbarkeit der Hand

Die genauen Prozentsätze sind weniger wichtig als die Form: früh tight, am Button weit, in den Blinds speziell. Diese Form behebt bei Anfänger-Bots mehr Fehler als eine weitere Postflop-Heuristik.

Für die Stacktiefe kombinierst du diese Ranges mit Poker-Bot-Stack-Management. Ein Bot mit 50 BB und einer mit 250 BB sollten kleine Paare nicht gleich behandeln.

Wie kodierst du Ranges in Python?

Kodiere Hände als kurze Zeichenfolgen: AA, AKs, AQo. Paare haben zwei Buchstaben. Suited-Hände enden auf s, Offsuit-Hände auf o. Das ist kompakt genug für handgeschriebene Ranges und lässt sich in Logs leicht debuggen.

RANK_ORDER = "23456789TJQKA"
 
 
def hand_code(cards):
    r1, s1 = cards[0][0], cards[0][1]
    r2, s2 = cards[1][0], cards[1][1]
 
    if r1 == r2:
        return r1 + r2
 
    high, low = sorted([r1, r2], key=RANK_ORDER.index, reverse=True)
    suited = "s" if s1 == s2 else "o"
    return high + low + suited
 
 
OPEN_RANGES = {
    "UTG": {"77", "88", "99", "TT", "JJ", "QQ", "KK", "AA", "AJs", "AQs", "AKs", "KQs", "AQo", "AKo"},
    "HJ": {"66", "77", "88", "99", "TT", "JJ", "QQ", "KK", "AA", "ATs", "AJs", "AQs", "AKs", "KJs", "KQs", "QJs", "AJo", "AQo", "AKo"},
    "CO": {"55", "66", "77", "88", "99", "TT", "JJ", "QQ", "KK", "AA", "A8s", "A9s", "ATs", "AJs", "AQs", "AKs", "KTs", "KJs", "KQs", "QTs", "QJs", "JTs", "ATo", "AJo", "AQo", "AKo", "KQo"},
    "BTN": {"22", "33", "44", "55", "66", "77", "88", "99", "TT", "JJ", "QQ", "KK", "AA", "A2s", "A3s", "A4s", "A5s", "A6s", "A7s", "A8s", "A9s", "ATs", "AJs", "AQs", "AKs", "K9s", "KTs", "KJs", "KQs", "Q9s", "QTs", "QJs", "J9s", "JTs", "T9s", "98s", "87s", "A9o", "ATo", "AJo", "AQo", "AKo", "KTo", "KJo", "KQo", "QJo"},
}
 
 
def should_open(position, cards):
    return hand_code(cards) in OPEN_RANGES.get(position, set())

Das wirkt grob, und genau das ist der Vorteil. Wenn dein Bot einen Stack verschleudert, kannst du position=CO hand=KTo open=False ausgeben und die Entscheidung sofort nachvollziehen.

Wie verwendest du Ranges zusammen mit gültigen Aktionen?

Eröffne nur, wenn kein Einsatz offen ist und ein Raise erlaubt ist. Open Poker teilt dir genau mit, welche Aktionen gültig sind, einschließlich raise mit Mindest- und Höchstbetrag. Der Betrag für raise ist der Zielbetrag, nicht der Erhöhungsbetrag - ein häufiger Bot-Fehler (Aktionsdokumentation).

def preflop_decision(msg, hole_cards, position):
    actions = {a["action"]: a for a in msg["valid_actions"]}
 
    # Free option in the big blind.
    if "check" in actions:
        return "check", None
 
    if "raise" in actions and should_open(position, hole_cards):
        return "raise", actions["raise"]["min"]
 
    # Facing a raise: use a tighter continue range for now.
    if "call" in actions and hand_code(hole_cards) in {"TT", "JJ", "QQ", "KK", "AA", "AQs", "AKs", "AKo"}:
        return "call", None
 
    return "fold", None

Diese Calling-Range ist absichtlich eng. Zu weit zu callen, ist einer der schnellsten Wege, aus einem ordentlichen Preflop-Bot einen verlierenden Postflop-Bot zu machen. Sobald du Monte-Carlo-Equity hast, kannst du Calls abhängig von Preis und Gegnertendenzen erweitern.

Wann sollten sich Ranges ändern?

Ranges sollten sich ändern, wenn sich Stacktiefe, Tischgröße oder Gegner ändern. Die Buy-ins bei Open Poker können zwischen 1.000 und 5.000 Chips liegen, während jede Saison mit 5.000 Chips und festen 10/20-Blinds beginnt (Saisondokumentation). Derselbe Bot kann also Poker mit 50 BB, 100 BB oder 250 BB spielen.

Nutze drei Anpassungen:

KontextAnpassung
Shortstack unter 60 BBSpekulative Suited Connectors und kleine Paare entfernen
Deep Stack über 150 BBSuited Connectors und Paare in später Position hinzufügen
Loose BlindsSteals tighter spielen, stärker for Value betten
Tighte BlindsButton- und Cutoff-Opens erweitern

Füge nicht am ersten Tag alle vier Anpassungen hinzu. Beweise zuerst, dass die Basisrange deine alte Strategie mit einer einzelnen Punktzahl schlägt. Danach kann Gegnermodellierung die Ranges für Button und Blinds anpassen.

Wie testest du eine neue Range?

Teste Ranges mit jeweils nur einer Änderung. Preflop-Anpassungen wirken klein, verändern aber jede spätere Straße, weil dein Bot den Flop mit einer anderen Mischung von Händen erreicht. Wenn du in einem Deployment den Button weiter öffnest, die Big-Blind-Verteidigung lockerst und die Einsatzgröße änderst, weißt du nicht, welche Änderung geholfen hat.

Nutze diese Testschleife:

  1. Wähle eine Position, normalerweise BTN oder BB.
  2. Ändere 5 bis 10 Hände in dieser Range.
  3. Spiele mindestens 300 Hände.
  4. Vergleiche Chiptrend, Rebuys und große Verlusthände.
  5. Behalte die Änderung nur, wenn das Log das Ergebnis erklärt.

Das schnellste Signal ist nicht die Gewinnrate. Achte auf „Hände, die preflop eingestiegen sind und mehr als 20 BB verloren haben“. Untersuche diese Hände zuerst. Wenn die neue Button-Range fünf marginale Offsuit-Hände hinzufügt und diese weiterhin große Pots verlieren, nimm sie wieder heraus. Wenn sie Blinds stehlen und selten zum Showdown kommen, teste weiter.

Rangearbeit belohnt langweilige Disziplin. Gute Bots brauchen keine heldenhafte Preflop-Kreativität. Sie brauchen weniger dominierte Hände in früher Position und mehr kontrollierten Druck in später Position.

FAQ

Sollte ein Poker-Bot solverperfekte Ranges verwenden?

Am Anfang nicht. Solver-Ranges setzen einen bestimmten Spielbaum und eine bestimmte Reaktion der Gegner voraus. Eine einfache 6-max-Rangetabelle ist leichter zu testen und zu protokollieren und normalerweise besser als ein kopiertes Chart, das dein Bot postflop nicht spielen kann.

Wie verteidigt sich der Big Blind?

Der Big Blind sollte nach dem Preis verteidigen. Wenn du 20 in einen Pot von 90 Chips callst, brauchst du deutlich weniger Equity als bei einem Call von 200 in einen Pot von 300. Beginne mit den Pot Odds und filtere dann Hände heraus, die sich postflop schlecht spielen lassen.

Welche Range sollte ich für einen No-Code-Bot verwenden?

Starte mit der Vorlage „The Shark“. Die Bot-Builder-Dokumentation beschreibt sie als tight-aggressiv mit 0,30 Tightness und 0,75 Aggression. Für die meisten neuen Nutzer ist das eine bessere Grundlage als eine loose Vorlage.

Können Positionsranges die Handbewertung ersetzen?

Nein. Ranges entscheiden, ob du preflop in die Hand einsteigst. Handbewertung und Equity entscheiden, was du nach dem Erscheinen des Boards tust. Verwende beides.

Prüfe das Ergebnis von Lektion 6

Was sich ändert
Filtere Preflop-Hände nach Position. Berücksichtige dabei alle Plätze, die Karten erhalten haben.
Erwartete Ausgabe
position_fixture: BTN
So prüfst du dein Ergebnis
Vergleiche A7 offsuit in UTG und am Button bei gleichen Call-Kosten. Berücksichtige alle Plätze, die Karten erhalten haben, auch Spieler, die bereits gefoldet haben.

Entpacke das Archiv zur Lektion, öffne den Ordner in einem Terminal und führe diese Befehle aus:

python -m pip install -r requirements.txt
python bot.py --lesson 6 --self-test
python bot.py --lesson 6 --hands 3 --report run.json

Der Selbsttest verwendet simulierte Daten ohne Verbindung zum Server und gibt Folgendes aus: checkpoint: passed. Für das Onlinespiel brauchst du OPEN_POKER_API_KEY in deiner Umgebung sowie verfügbare Gegner. Die beiliegende README erklärt die Einrichtung und die Grenzen der Wiederherstellung.

Alle Lektionen dieses Kurses
  1. 1. Einen Poker-Bot in Python bauen
  2. 2. Grundlegende Poker-Bot-Architektur
  3. 3. WebSocket-Fehler eines Poker-Bots debuggen
  4. 4. Warum deinem Pokerbot die Zeit ausgeht
  5. 5. Poker-Mathematik für Bots
  6. 6. Positions-Ranges für Poker-Bots
  7. 7. Einsatzstrategie für Poker-Bots
  8. 8. PokerKit-Tutorial
  9. 9. Monte-Carlo-Equity-Rechner
  10. 10. Gegner-Modellierung
  11. 11. Fortgeschrittene Poker-Bot-Architektur
  12. 12. So funktioniert die Ranglistenwertung
  13. 13. Professionelle Poker-Bot-Architektur
♠

Weiterlesen