How I Built a Working Online Poker Bot, Part 3
Tuesday, June 10, 2008   

Introduction

I'm a big fan of pet projects. You know the ones I mean: the projects we love to start and hate to finish. The two-week remodeling gig that takes two years. The '69 Mustang sitting on cinderblocks in the back yard while seasons rotate. The unfinished novel lurking on the nether regions of your hard drive. And for programmers and poker players around the world, a million unfinished tools and libraries ranging from the ingenious to the depressingly obscure.

Today, I'd like to talk to you about a pet project which is actually worth your time.

When I say worth your time, I mean a project which is financially, professionally, and personally rewarding in a way that pet software projects almost never are. Everybody likes money, of course; and this project, properly executed, is worth a small fortune. In fact, building and successfully running even a flawed and break-even version of the bot for several years is worth a decade of paychecks (for most people). But the money is (or should be) an afterthought, a nice-to-have.

The real reason I can suggest this project is as follows:

Building an online poker bot will give you a deep knowledge of two lucrative domains, programming and poker, and enough day-to-day working familiarity with those domains to position you, given some effort on your part, for the work of a professional software developer and/or poker player.

How does building a poker bot make you a better poker player? Because it forces you to confront, understand, and codify advanced poker strategy in a way that few of your opponents will have done. How does building a poker bot make you a better programmer? Because a bot involves a balanced coordination of techniques that span the breadth and depth of software development, from operating system nuts and bolts to abstract A.I., from user interfaces to multi-threading.

So to a certain degree, I'm the little devil on your left shoulder telling you to take the path less travelled by.

If I get my way, not only will you be building an online poker bot, you'll be playing poker seriously, for meaningful stakes - if you're not doing so already. You'll be programming seriously - if you're not doing so already. You'll leverage your programming skills to make you a better poker player. You'll leverage your poker-playing skills to make you a better programmer. And you'll leverage your natural (and healthy) desire for money to keep you interested in the process even when the going gets rough - and it will.

Looking at the source code for the bot, I'm reminded of another benefit: the creation of a generic code base which can be used to solve a great many poker problems other than online poker botting. If you structure this code base precisely, you don't have to put all your eggs in one basket. You can cautiously develop in the direction of an online poker bot, while giving yourself the option of branching off into other poker-related projects, many of which have significant commercial appeal (as the author of Poker Tracker could tell you).

Now, the last thing this series is, is a get-rich-quick scheme. But let's pull that copy of Theory of Poker off the shelf, blow the dust off the cover, and turn to the chapter on Implied Odds.

Implied odds are based on the possibility of winning money in later betting rounds over and above what is in the pot already. More precisely, your implied odds are the ratio of your total expected win when your cards hit to the present cost of calling a bet.

Implied odds dominate big-bet forms of poker such as No Limit and Pot Limit, and even affect play in Fixed Limit games, to a degree. But implied odds also apply to real-world scenarios of risk and reward. For example: let's say you're considering whether or not it's worth your time and effort to start building an online poker bot.

You can't simply calculate the likelihood of your being able to produce a winning poker bot, factor in the number of hours played, and so forth. You have to look at the hard-to-quantify value of the knowledge itself, and its effect on your career and life. You have to factor in the value of serendipity. In other words, you have to consider what you might call the implied odds of the situation.

  • Will the bot make money? By winning money from other players? Via promotions? As a product?
  • Will the skills I learn qualify me for a job I never could've gotten otherwise?
  • Will I get addicted to poker and end up playing for a living, in Vegas, California, London?
  • Will I meet a person or persons who will introduce me to other opportunities?
  • Will I end up taking the bot's source code and selling it, or developing a full-fledged commercial application?
  • Will I enter my bot in one of these "botting competitions" I've heard about?

Taking those factors into account, I think you'll come to the same conclusion I did: there's considerably more at stake here than making a few bucks running your bot on Poker Stars. The implied odds of building an online poker bot are huge, even if your bot never turns a profit.

If that hadn't been the case, I never would've sat down to write that first line of code...

Underground Poker Meets Best-Practices Software Development

This whole thing started, appropriately enough, in Dallas, Texas, where a booming IT corridor intersects a thriving underground poker scene - or what used to be a thriving underground poker scene.

Dallas, Texas

All-night poker clubs in back-alley office lots and basements. Places with names like 6th Street, MMO's, Executive Game, DTD, DPO, Third Pair. Full-service underground casinos with professional dealers. ATMs. Widescreen TVs. Dollar-a-minute table massages. $60,000 bad beat jackpots. On-site kitchens stocked with every fried food known to man. And the #1 draw of most Dallas poker games: free beer.

Times have changed in Dallas and many of these clubs have closed their doors. For a few reasons:

  • The uncapped 10% rake structure of many low-limit Dallas games, combined with a way-above-average dealer toke, plus the ubiquitous bad beat jackpot, sucking an additional $1 from every pot.
  • The opening of multiple major (legal) cardrooms an hour north, across the Oklahoma state line.
  • The recent return of robberies at gunpoint, unheard of in Dallas since the days of the road gamblers.
  • Increased scrutiny of the Dallas underground poker scene in the local news.
  • The reversal of local law enforcement's long-standing policy of turning a blind eye towards local poker games.

But once upon a time, you could play no-limit Hold'em from dusk 'til dawn, seven days a week, at fifty different clubs around town, for buy-ins ranging from $40 to $5000 or more. It reminds me of a movie every poker player either loves, or loves to hate

Rounders

Playing poker in Dallas a few years ago, you felt like you were living a scene from Rounders, except that the situation in Dallas went way beyond anything Rounders ever portrayed. The sudden mass influx of new money into the game - thanks in part to Rounders, thanks in part to online poker, thanks in part to Moneymaker, Raymer, Varkonyi - meant that anyone with a spare $30,000 lying around could start up a club and recoup their investment in a matter of a few months. People were literally renting out warehouses and throwing weekly freeroll tournaments to lure new players into the cash games (which of course, are where the house makes all its money). These freerolls drew hundreds of players - not a big deal in Vegas, perhaps, but this is a state where running a raked poker game was and is a class A misdemeanor.

 § 47.04.  KEEPING A GAMBLING PLACE.  (a)  A person
commits an offense if he knowingly uses or permits another to use as
a gambling place any real estate, building, room, tent, vehicle,
boat, or other property whatsoever owned by him or under his
control, or rents or lets any such property with a view or
expectation that it be so used.
    (b)  It is an affirmative defense to prosecution under this
section that:   
    (1)  the gambling occurred in a private place;                                
    (2)  no person received any economic benefit other than
personal winnings;  and
    (3)  except for the advantage of skill or luck, the
risks of losing and the chances of winning were the same for all
participants.
    (c)  An offense under this section is a Class A misdemeanor.

That's just shy of a felony, and trust me when I say: the people running these games weren't exactly hardened criminals. They were guys with landscaping businesses, law practices, and programming jobs.

Anyway, there was so much new money (also known as dead money) on the tables, you didn't have to play particularly well, in order to win. All you had to do was be patient. The strategy went something like this:

  • Wait for a monster hand.
  • Get all your money in against players who don't notice or don't care that you haven't played a hand in four hours.
  • Rinse and repeat.

It's the (exploitable) style of play known in poker circles as weak-tight and that, folks, is all it took to grind out a decent living in those underground Dallas poker games of yesteryear. This style, absent tilt, is still good enough to win in today's low-limit online games, though as we'll see, the tight-aggressive and loose-aggressive styles are really where it's at.

I mention all this because very early on it occurred to me: there's got to be a way to extract this ABC style of poker into a piece of software and then hook that software up to an online poker site. And if you're a programmer who plays online poker seriously, don't pretend you haven't thought the same thing.

After all, why else do we learn to program, if not to be able to solve real-world problems?

An Introduction to Advanced Poker A.I

Many of you have commented that the Input (getting information from the poker client) and Output (clicking buttons and otherwise manipulating the poker client) stages are low-hanging fruit: tedious, but not rocket science. The Processing stage, on the other hand - the cognitive element of the bot - is another story.

Morpheus: This is your last chance. After this, there is no turning back. You take the blue pill - the story ends, you wake up in your bed and believe whatever you want to believe. You take the red pill - you stay in Wonderland and I show you how deep the rabbit-hole goes.

Artificial intelligence is a huge and fascinating subject, even when applied to the (relatively) narrow domain of poker. A sample of recent papers from the University of Alberta's Computer Poker Research Group (CPRG) should give you a taste:

Unfortunately, most cutting-edge poker A.I. is beyond the reach (given the average person's schedule) of the average programmer/poker-player:

Excerpt from Advanced Strategies and Counter-Strategies: Building a Champion Level Poker Player

I have lot of respect for the scholarly work that the CPRG and others have done, and I think it's the kind of work which will end up producing the very strongest poker intelligence. But I'd recommend you stay away from the advanced, graduate-level A.I. (unless you happen to be an enthusiast or expert in the field) in favor of learning basic and advanced poker strategy cold. Ultimately that will get you more bang for your mental buck.

Botting Rule #16: None of the techniques used by the CPRG or other organizations are necessary to produce a winning online poker bot.

Now, those are some fightin' words, so let me qualify them. The CPRG approach has always been a game-theoretic approach: finding optimal and/or exploitive strategies which attempt to model the game of poker "from scratch". That means a lot of abstract math and statistical modeling, a lot of terms like Nash equilibria and Best Response, and it means relatively little domain-specific knowledge of poker as it's played for real money in today's online cardrooms:

  • How to incorporate (for example) Poker Tracker statistics into the bot's decision-making.
  • How to take advantage of player loyalty incentives and promotions.
  • How straightforward, ABC poker play wins in low-limit online games.
  • Convenient rules of thumb (if you flop a set, you're almost never making a mistake to simply get all your money in on the flop) and how they can simplify processing.
  • Table selection, table selection, table selection (the poker equivalent of location, location, location).

That's not to say that the people at the CPRG don't "know" poker, or that they couldn't build an online poker bot which would beat the pants off of any other online poker bot that had the temerity to compete against them. It's just that they have a different goal in mind: creating a generic, from-scratch poker intelligence which is capable of competing at a world-class level using pure A.I. That's miles and miles beyond what it takes to produce a profitable online poker bot. And while we're not going to rule out any work that the CPRG (or other organizations) have done, at the same time, let's be realistic. How much time can you devote to building an "optimal" online poker bot? Two years? Ten? Can you devote six solid months to learning (or re-learning) the math? No?

Then start small, by choosing one or more of the following shortcuts:

  • Don't require that your bot actually win. Instead, play the online promotion game so that it makes money even if it's a slight overall loser.
  • Force the bot to play short-stacked, and to leave the table when it's no longer short-stacked.
  • Specialize the bot for a very specific game, such as "low-limit, heads up, No Limit Hold'em tourneys".
  • Force the bot to play at a full table (or short-handed), and to leave the table when that changes.
  • Allow the bot to rely on occasional human assistance, or even to notify (through a loud buzzer) a nearby human when it needs assistance.
  • Use toy games (no-fold, half-street, static card, etc) to simplify analysis.

Getting the bot up and running on "training wheels" in this way is one of the things that makes this project feasible for the tinkerer or botting enthusiast.

Iterative, Incremental Development

We're not going to rely on the above shortcuts exclusively. We want to have our cake and eat it too: meaning, we want to produce a bot which is capable of taking these shortcuts, but which has enough cognitive flexibility to leverage more sophisticated approaches, as we code them, or as they become available.

Botting Rule #44: In early versions of the bot, rely on inventive shortcuts to cut into the complexity of the game, and schedule these shortcuts as milestones on the path to the development of a full-fledged bot.

It's not much fun to spend two years coding away in isolation only to discover upon completion that your bot is ridiculously weak, and overly complex given how poorly it plays. Delineate the work into bite-sized chunks which you can deploy and test immediately. 

You working programmers out there already know the score on this one. Formal software development methodologies from RUP to Agile have one thing in common: iterative, incremental development. Even if you've never worked with a formal development methodology, you know that every month or so, customers, clients, managers, coworkers - somebody of importance - wants to see what you've been up to. When it comes to building a poker bot, likely as not that person will be you. And that means it's more important, not less important, to set bite-sized, verifiable development goals. Otherwise it's easy to get lost in the labyrinth of Windows application development, poker domain modeling, and generic A.I. which comprise a bot. In fact, it's impossible not to get lost if we don't break the problem down into manageable pieces.

And one of the big tools we'll use to allow that (when it comes to the bot's A.I.) is an extremely simple form of what's called a multi-agent system, or MAS.

Pluggable Intelligence and the Multi-Agent System

This is a subject (A.I.) that we'll be returning to again and again; but for now, I want to lay out some basic architecture. This isn't the only approach, and I make zero representations as to whether it's the best, or even a particularly good, approach. But it is a working approach which has undergone the trial-by-fire of competitive, real-money play.

What we're looking for is a generic mechanism which allows any poker processing logic or intelligence whatsoever - from the simplest of "hot and cold" probability analyzers to the cutting-edge artificial brain of tomorrow - whether written by us or by a third party - to participate in the decision-making process for a given game situation.

Botting Rule #4: Pluggable intelligence is a key requirement for an evolving bot.

In order to do that, we have to design the bot's cognitive component such that it's capable of incorporating and sublimating any arbitrary poker A.I. In effect, we want to build a simple multi-agent system:

A multi-agent system (MAS) is a system composed of multiple interacting intelligent agents. Multi-agent systems can be used to solve problems which are difficult or impossible for an individual agent or monolithic system to solve. Examples of problems which are appropriate to multi-agent systems research include online trading, disaster response, and modeling social structures.

Speaking in more precise terms: consider creating a programmatic interface (I called mine DecisionModule) which allows any arbitrary component or application to participate in the voting process ultimately responsible for producing a discrete output...

  • fold
  • check
  • bet
  • raise
  • call

...for a given game situation. Each "Decision Module" can be thought of as a distinct intelligent agent, operating independently of or in cooperation with all other such agents which comprise the bot. These agents might be source-level classes that you write yourself, or they might be third-party applications or DLLs for which you've written an adapter.

For example, let's say a very strong commercial poker playing application is released, and it has a programmatic interface. With a pluggable MAS, you can leverage that application's intelligence as a pluggable component inside your bot, running in parallel with whatever other components you've created or acquired. 

In practical terms, that means you can have a simple "hot and cold" probability analyzer running next to tomorrow's cutting-edge third-party "artificial brain"; from the bot's perspective, each such component is a black box. Table state is passed into a sequence of Decision Modules, each of which conforms to a uniform interface. Together, they produce the ultimate decision to call or fold, in the form of a distribution which specifies (for example):

  • Raise 80% of the time
  • Call 20% of the time

The specific modules shown above are just by way of example, and of course, you can design this out any way you please. The important thing is to promote the concept of the multi-agent system to a first-order architectural abstraction within the bot. This approach has a number of advantages, for the A.I. hobbyist in particular:

  • Support for any existing or future poker A.I., winning system, or method.
  • We avoid hard-coding our bot to a particular solution, which may prove to be naive.
  • We're able to drop in new plugins as we develop them or find them on the open market.
  • Any single plugin can contain any level of sophistication, from simple toy game analysis to the cutting-edge heuristics of tomorrow.
  • We have the ability to assign weights and other valuations to components, add and remove components, and otherwise tweak the voting process.
  • We decouple the cognitive elements of the bot from the sensory and motive elements.
  • Analysis can be run either synchronously, in the foreground, or asynchronously, in the background (worker thread semantics).

Once that's in place, we can start leveraging specific algorithms in the pursuit of a plus-EV bot, starting with simple rules-based or simulation approaches and eventually graduating to some more sophisticated abstractions. Again, an iterative, incremental development path studded with bite-sized, achievable goals is the way to the money.

Modeling the Poker Domain

In the first part of this series, we decomposed the bot into the three classic stages of information processing: Input, Processing, and Output. I noted that each stage of processing should run independently of the other stages.

  • The Input stage should know nothing about poker; it just tries to extract arbitrary data from a given application using a set of rules.
  • The Processing stage should know nothing about screen-scraping, API hooking, DLL injection, or input simulation. It's job is to take an abstract model of a poker game and analyze it.
  • The Output stage should know nothing except that it's been instructed to simulate certain mouse clicks at specific times.

That's a good architectural division which it's worth preserving. But in practice we'll find that there are other even more meaningful divisions. In particular, the division between "generic poker things" and "online poker things". 

Again and again, you'll find that online poker things want to derive from generic poker things. In the diagram above, we can see that StarsPokerTable inherits from OnlinePokerTable, which inherits from PokerTable. We can use true Liskov substitution here because a StarsPokerTable "IS A" OnlinePokerTable which "IS A" PokerTable. If a function expects a single PokerTable object as an argument, you can pass in an OnlinePokerTable or a further-derived StarsPokerTable instead without altering the correctness of the program.

That sort of polymorphism is something that will be hugely helpful, and we'll use it everywhere. The pattern is this: work with base classes to the extent possible, and let derived classes transparently implement specific functionality as needed. This same sort of relationship applies throughout the poker and online poker domains. In fact, the relationship is so strong that what you'll end up with (or at least, what I ended up with) is a domain which can be physically segregated into different physical components:

  • generic poker "things" (living in, for example, PokerDomain.dll).
  • generic online poker "things" (living in OnlinePokerDomain.dll, which depends on PokerDomain.dll).
  • specific online poker "things" (living in StarsPokerDomain.dll or FullTiltPokerDomain.dll, which depend on OnlinePokerDomain.dll).

That, in turn, offers a number of programming benefits, not least of which is decomposition of the system into layers of bite-sized components (each consisting of at most a handful of classes) with strong physical boundaries. It's also a good way to structure the source code if you intend on creating a bot that can play at multiple venues.

N-Dimensional Opponent Modeling

As we slowly but surely work our way into a candidate A.I. for the poker bot, we'll need to start picking up certain techniques and adding them to our arsenal. One of these is the idea of representing a player's particular strategy or inclination as a point or region in N-dimensional (2D, 3D, 4D, etc) space.

Often in poker we categorize and describe our opponents based on two things:

  • Selectivity. How selective an opponent is with regard to choosing hands to play. Selective opponents who play few hands are called "tight". Unselective opponents who play many hands are called "loose".
  • Aggression. How much betting and/or raising (as opposed to calling and/or checking) an opponent engages in. Opponents who frequently bet and raise are aggressive; those who rarely bet and raise are passive.

We can express selectivity and aggression on a familiar, two-dimensional Cartesian coordinate system. Here, both selectivity and aggression are expressed as numbers between -1.0 and +1.0. At (1.0, 1.0) a player is maximally selective and aggressive. At (-1.0, -1.0) an opponent is minimally selective and aggressive. 

Note that the four quadrants of this coordinate system correspond to the four "player archetypes" identified in The Psychology of Poker and other books. This works well as a rough indication of an opponent's core playing style. But I like to take the above grid and add a third axis: deception.

Deceptive opponents frequently attempt to mislead their opponents with bluffs, slowplays, and other tactics. If a deceptive opponent bets, you can't be sure whether he's got a strong hand or nothing at all. On the other hand, many opponents are "honest". A big bet indicates a big hand.

That allows us to express a player's (approximate) strategy as a single point in three-dimensional space. For example, a player at [0.75, 0.75, -0.75] would be described as tight, aggressive, and straightforward (non-deceptive). We would expect this player to bluff and slowplay less often than the player at [0.75, 0.75, 1.0].

Taking it a step further, we can add additional dimensions to our graph. For example, let's add a fourth dimension: stack size. The player at [1.0, 1.0, 1.0, -1.0] is maximally aggressive, selective, deceptive when his stack size is towards the bottom of the range. The player at [0.0, 0.0, 0.0, 0.0] plays a non-descript (neither tight nor aggressive, nor loose nor passive, but somewhere in between) game of poker when his stack is roughly average. And the player at [-1.0, -1.0, -1.0, 1.0] is passive, loose, and non-deceptive when his stack size is large.

Once we get into the multi-dimensional approach, we start to see that a given player's strategy isn't really a point, although we may choose to express it that way for convenience; it's a collection of points which together comprise a strategy region in n-dimensional space, where each dimension is a particular strategy facet. This region can be mathematically described, tested for intersection with other regions, and so forth. Use your imagination.

Of course, selectivity and aggression are just two possible axes. We'll use these because they're common throughout the poker literature, but understand that the meaning and quantity of axes is up to you. In fact, it's worth your while to set up a generic mechanism by which you can capture and plot arbitrary groupings of statistics. This in fact is one of the purposes of the PokerFact abstraction (in the diagram at the top of this page) and its many associated classes.

But that subject is a post in itself. Stick it in your toolbox and we'll return to it at a later date.

Opponent Modeling with PokerTracker

PokerTracker is a commercially available online poker hand history analysis tool - that is, a tool which parses the human-readable hand histories emitted by a particular site, analyzes them, and displays various statistics about your play and the play of your opponents:

Poker Tracker

Every serious online poker player, without exception, either owns, or knows about, Poker Tracker. In fact, Poker Tracker statistics (VPIP, PTBB/100, etc) have been adopted by the poker playing community at large, and now serve as a sort of de facto terminology for advanced poker strategy. You can hardly read a major poker forum such as 2 + 2 or Pocket Fives without understanding Poker Tracker lingo:

baja15 is winning at 17.5/13.5. chargers in o7 is winning at 13.4/11. The specific numbers are not important; what is important is that both chargers and baja are almost always raising the pots they play. Seizing the initiative is crucial to winning at tight/aggressive poker. They have the table reacting to them. When they call, which is usually about 3.5% of the pots, they have a reason for doing so. If chargers or baja went back through all the hands they called a PFR with, they would be able to tell you why they did it every time. And they would never say “well, because KQ is playable in MP” or something vague like that. It would be “because I was getting the implied odds to play 33 for a set here—villain is a 10/2 nit with 100bb who only raises UTG with premium hands; I knew I’d get at least a big part of his stack if I hit my set.”

As useful as Poker Tracker is for online poker players, it's even more useful for online poker botters. In fact, Poker Tracker is the single most useful third-party tool in the poker bot-building arsenal and here's why:

Absent Poker Tracker and similar tools, you'd be forced to parse those hand history files yourself, and to develop a statistical framework around them yourself, and to test and verify the utility of that framework yourself. Poker Tracker does all of this for you. And while the Poker Tracker statistics aren't perfect, they've got the weight of mass usage behind them, and you'll be able to find countless discussions about the ins and outs of various statistics, what they mean, how to use them to adjust strategy, and so forth.

Poker Tracker allows you to start answering questions like:

  • Is opponent X a loose or a tight player? Passive or aggressive? Winning or losing?
  • Where are the holes in my (or my bot's) game? Am I playing too loosely in the small blind?
  • Am I winning or losing? How many total hands have I played? What's my average win rate?

We'll take a look at some working source code before too long, but if you know your way around a database, leveraging Poker Tracker shouldn't be too much of an issue. Also, Poker Tracker isn't the only game in town. You can also take a look at Poker Academy Prospector and Hold'em Manager, just to name a couple.

The Advantage of Playing Short-Stacked

You'll notice that one of the Decision Modules in the above diagram is called ExpertShortStackedAnalyzer. That's my always-inventive name for a particular class which attempts to model a game of poker in which the stack sizes have been artificially shortened.

I've mentioned a couple times the advantages of creating a short-stacked bot but I don't think I've been clear enough about what those advantages are, and why they're so helpful. First of all, when I say a short-stacked bot, I really mean a short-stacked v1.0 bot. The idea should be to get something basic up and running first, before tackling deep-stacked no-limit Hold'em.

Now, let's define what a short-stacked bot is:

A short-stack bot is a bot which buys in for between 10 and 40 times the big blind, and which leaves the table when it wins much more than that.

Most online poker sites set the minimum allowed buy-in at 20 times the big blind (20xBB), or squarely in the "short-stacked sweet spot." In No Limit Hold'em: Theory and Practice, David Sklansky explains:

Playing a Short Stack

Since most of the money gets bet early in the hand, and betting all-in necessitates a showdown, short stacks should concentrate on playing premium hands and generally avoid bluffing. Play tightly preflop and try to get your money in when you likely have the edge against the hands your opponents might have.

Indeed, a totally algorithmic strategy of playing only premium preflop hands (say AA-77, AK and AQ) will beat almost any no limit game when you have a short stack of approximately twenty times the big blind. Ed suggests just such a strategy to beginners, in more detail, in his book, Getting Started in Hold'em.

That's not to say that such a strategy is optimal. For expert players, playing short routinely is a sure way to slash win rates. But it is remarkable that a robot playing a short stack can beat even relatively tough no limit games. Don't underestimate the intrinsic advantages of playing a short stack.

He goes on to give two reasons why the short-stack has an intrinsic advantage:

  • It's often correct for deep stacks to play loosely against other deep stacks, but incorrect for them to do so against short stacks. So the short stack is often up against weaker-than-average hands versus his range.
  • Once the short stack is all-in, opponents will keep betting, forcing players to fold. These folds benefit the short stack mathematically, the moreso because his additional risk is zero.

To which I'd add:

  • The average player is 100% clueless about how to play, and how to play against, a short stack - whether in a cash game or tourney situation.

Another reason the short-stacked approach is so powerful is that commitment decisions become much easier as the stack sizes dwindle. In Professional No-Limit Hold'em, Matt Flynn, Sunny Mehta, and Ed Miller write:

When the effective stack sizes are 50BB [or less], you can easily create favorable SPRs for top pair and overpair hands with straightforward raising tactics.

If you're not familiar with the terminology, an SPR (stack-to-pot ratio) is simply the ratio of your stack (or technically, the smaller stack) to the total size of the pot on the flop. It's a numeric expression of risk-vs.-reward at the nexus of the hand which, among other things, tells you when you welcome aggression and are willing or even eager to get all of your money in. The beauty of playing short-stacked is that the mix hands which are correct to play when you're short-stacked always produce favorable SPRs for getting your money all-in.

From a programming perspective, that often (not always, but more often than you'd think) reduces the flop decision to a binary one:

  • YES, I'm somehow going to get my money all-in here, probably with a straightforward bet or raise.
  • NO, I'm not willing to commit. I fold.

That's huge, in terms of cutting into that complexity I was talking about. But it doesn't end there. Playing short-stacked desaturates the game in a number of ways that simplify your job as the programmer:

  • A short-stacked bot rarely has to consider any actions beyond the flop. This has the effect of turning a 4-street game (preflop, flop, turn, river) into a 2-street game (preflop, flop).
  • Preflop play, while subtle at times, is fairly easy to abstract into a set of rules. This is somewhat true even in deep-stacked play, but it's especially true in short-stacked play.
  • Flop play, the crux of the hand, can be simplified through the application of SPRs and some basic commitment mathematics (as I explained above).
  • Any mistakes or weaknesses in the bot can only be punished in small increments.
  • As Sklansky notes, it's usually incorrect for a short stack to bluff. That means you don't have to implement game-theoretic bluffing, and you don't have to implement opportunistic bluffing. In fact, beyond an occasional continuation bet, which will put you all-in anyway, you don't have to think about bluffing at all.
  • Short stacks don't care or worry about implied odds. Estimating implied odds is one of those fuzzy areas in which humans prosper and robots perish.
  • Buying in short is appropriate when the other players at the table are better than you, which will often be the case with a home-grown bot.

So while I don't suggest that you rule out the idea of creating a bot that can play deep-stacked, I do think the first step on the road to that goal is creating a bot which is capable of playing short-stacked.

The Importance of Generic Code

If you've read this far, then you're presumably pretty interested in this subject. So a friendly word of advice.

One of the reasons many bots fail is because they're designed and developed in a vacuum. Best practices are abandoned in favor of the quick and dirty approach. Code that would never fly in a commercial production environment is created, tweaked, reinforced, cut-and-pasted. The result: a useless, hacked-together mess of spaghetti code, or what's known as a Big Ball of Mud.

In a project of this complexity, avoiding this sort of thing has to be a fundamental requirement from Day One. Even if you're not successful in building the bot, keep your options open. Maybe some of the code can be usefully applied to another project. At all costs, avoid burning a year or more of your time producing a glut of bad "poker botting" code. Keep it clean, keep it reusable.

One of the better ways to lift your code out of the trenches and increase its utility and longevity is to rely on a tried-and-true software development best practice:

Botting Rule #2: Code the domain, not the problem.

When we apply this rule to the domain of poker, what we get is a code base in which the classes and other abstractions have a strong correlation with meaningful nouns and verbs:

  • poker player
  • poker table
  • online poker table
  • poker game
  • poker hand
  • hand history
  • poker action (check, raise, bet, fold, etc)

Whether you're building a bot, a commercial poker game, or a simulation tool, you're probably going to be interested in the concept of a poker table. That's a core abstraction which establishes an ordering amongst players. Similarly, you'll want some notion of what it means to be a poker player. That's another core abstraction. And so on, until you end up with a group of reusable classes similar to those shown in the diagram presented above.

Taken together, and with the addition of a motive intelligence, these classes comprise a poker bot. But they're also useful in creating a hand history analyzer. A game simulator. A multi-tabling helper tool. An online poker heads up display (HUD). And so forth. If you take the proper care to model things this way, you'll find that your code has useful applications quite aside from botting. That, in turn, further increases the utility of the work you're performing, boosting the "reward" half of the risk/reward equation we talked about in the Introduction.

Ignoring this bit of advice cost me six months (easily) of development time in the creation of the above bot.

Conclusion

We've covered a lot of material in this post, including:

  • Why building a poker bot is an ideal pet project.
  • A light introduction to advanced poker A.I.
  • A candidate architecture for a generic "pluggable intelligence" poker bot A.I.
  • How to use an iterative, incremental approach to apportion the bot into bite-sized pieces.
  • Some working advice and best practices for modeling the poker domain.
  • N-Dimensional Opponent Modeling.
  • Poker Tracker, and its value to the player/botter.
  • Why short-stacked bots are so tough to beat.
  • Avoiding the poker bot "Ball of Mud" dilemma.

In Part Two of this series, I promised you some working code for interrogating the poker client for various game data. That code has been rolled into its own dedicated post, and in fact, this is how the series will be structured from here on out: long, rambling higher-level posts interspersed with short, targeted, source-code rich posts solving specific problems.

I'd also like to apologize for the delay in responding to some of your questions and comments. These are all excellent topics for discussion and I'd like to address them fully, in dedicated posts. But however we structure it, the poker botting series will continue in exhaustive detail. If you've enjoyed the first three parts of the series, and you haven't already done so, please subscribe in a news reader or over email. And as always, thank you for your time.

Until next time...


Posted by James Devlin   80 comment(s)

Love the "rambling" nature as you call it- not sure I would enjoy short posts as much- One thing I would really like to see is more detailed information on controlling the poker client. Excellent article though, interesting way of introducing the AI, and great diagram- is that the actual code base?

Keith on 6/10/2008 12:14 PM (608 days ago)

thanks was looking forward to it!

james on 6/10/2008 12:18 PM (608 days ago)

OKAY. YOU HAVE TO STOP TELLING PEOPLE HOW TO BUILD BOTS. WELL AND GOOD FOR PEOPLE TO SAY: I'D PLAY AGAINST A BOT ANY DAMN DAY. WELL AND GOOD FOR PEOPLE TO SAY BOTS ARE WEAK. NOT ME. I DON'T *WANT* TO PLAY AGAINST ONLINE POKER BOTS. THEY SCARE ME. PLEASE MAKE THEM STOP.

BOT THIS on 6/10/2008 12:22 PM (608 days ago)

I don't think the AI will be the most difficult problem: it's staying undetected what looks to me the biggest problem. How are you ever going to evade the continuously increasing detection mechanisms of the poker sites?

Thomas on 6/10/2008 12:41 PM (608 days ago)

Hey BOT THIS - don't you know that concealing information does not prevent the information from getting out? Information needs to be free....besides, just telling people how to do something does not in any way mean they are going to do it.

BitBotGuy on 6/10/2008 1:51 PM (608 days ago)

When you're developing a new poker strategy implementation do you set up simulated games and run fake hands to see how they compare to the existing implementations?

jonnii on 6/10/2008 1:55 PM (608 days ago)

Your series on bots is very well done and as a professional coder, I've enjoyed reading them. I would be especially interested to hear about your debugging strategies and your testing strategies. Hopefully you can do a rambling post on those subjects soon.

Jerome on 6/10/2008 1:59 PM (608 days ago)

I agree with BitBotGuy. In any case it's not like nobody ever thought of this before this article. The hardest part is being both a good programmer and a poker enthusiast, as this kind of project takes a lot of time to do. Not many of those people around I guess.

horia314 on 6/10/2008 2:09 PM (608 days ago)

Dont get caught... Its now a class B felony

The Grouch on 6/10/2008 4:40 PM (608 days ago)

Just curious, but any plans to sell your "bot" down the road?

geekster on 6/10/2008 5:31 PM (608 days ago)

Hey. Good post. I dont really program, or play any poker, except the random texas holdem pokernights with friends. But I enjoyed reading the post. Especially funny to see that a project increases two skills simultaniously. And I guess you win more when you play after building the bot. Andif the bot is good, he prolly rakes in some cash to. GL+HF.

marius on 6/10/2008 6:15 PM (608 days ago)

Good stuff, it’s an enjoyment to read, keep up the good work. I just happened to be a bot programmer myself, and just for the record, what you say about “big ball of mud” is true, I’ve been in the exact same situation ..

The biggest problem we have is staying undetected, any ideas beside hiding of process an rename the bot application to something like “paint.exe” ?

And for all of you “not programmers” but poker players reading this: surly if you are a weak player, a bot will beat you, but a human player will beat you as well, do not fear bots, if you play well you will win in the long run anyway.

Sniffer on 6/10/2008 6:19 PM (608 days ago)

Fellow developers who are more into the subject than I, scoffed at me when I mentioned these articles, declaring them as blogspam for affiliate dollars. After reading this part and it failing to progress anywhere near towards turning theory into code, I accept this could turn out to be a waste of time for all involved except the author, who may end the series prematurely when he can find no more poker history to pad with.

Anonymous on 6/10/2008 6:27 PM (608 days ago)

@Thomas - i think you're overestimating what a poker site is able to "detect". If you're not manipulating the poker program directly (which he's not - he's actually causing mouse & keyboard events to fire), the information stream between the program and the server, or getting caught by their "collaboration heuristics" (which any human players could set off just as easily), there's nothing to detect. The poker site's program runs in windows, man. It doesn't know anything about mouse/keyboard drivers to be able to detect their use. So basically the bot interacts with a computer the same way as a human would. So the problem comes down to figuring out how to avoid being detected as a cheater/collaborator -- the answer to which is always going to be "DON'T CHEAT".

Dustin on 6/10/2008 6:36 PM (608 days ago)

I've always been interested in digitally modeling player strategies (and in turn modeling how players model each others strategies), but you're 100% right about the amount of work required. In order for me to test models/agents against each other I need probably 90% of your framework coded (with none of the payoff of loyalty rewards!)... which has always seemed like way too much effort to even start on the part I'm interested in.

Are any of you aware of any open-source projects that handle the domain at this level of detail? Even if it's not in my preferred programming language it would help, I bet, to use as a reference... Damn. I think you just convinced me I need to build a poker framework as a pet project. ;)

Dustin on 6/10/2008 6:50 PM (608 days ago)

Until online poker sites allow bots with some clear indication that they are bots (like ICC or FICS computer accounts), sharing information on this topic is a horrible idea.

Also, the bot itself is not a profitable side project (it may be profitable due to learning to code or learning poker), if you make a winning bot, you'll get caught, then your roll gets seized, the end.

Anonymous on 6/10/2008 7:18 PM (608 days ago)

Dude! You can write! Good job.

Anonymous on 6/10/2008 7:20 PM (608 days ago)

I insist that opponent modeling is not necessary if you plan on staying in the lower- to mid-stakes games. You can do very well with a static strategy, without introducing the complexity of modeling other players. Opponent modeling adds 2-4 more full dimensions to your input feature space, to a problem which may already be difficult enough (teaching the bot to play decent poker). On the other hand, so many players online don't even understand basic strategy, and will just hand money over to the players that do (you).

Anonymous Pokerbotter on 6/10/2008 7:23 PM (607 days ago)

@anonymous--- blogspam? lol. single most entertaining& informative series on this topic i've ever read. maybe if the guy was trying to sell online poker signups or something but i've yet to see one online poker affiliate link. great thing about blogging nobody forces you to read.

Roger on 6/10/2008 10:25 PM (607 days ago)

Two facts which stand out for me -

1. Using C++ for an online poker bot.

2. The extreme verbiage and effort spent on this article - is it worth it?

Peace.

Timmy Jose on 6/10/2008 11:35 PM (607 days ago)

What a fascinating article! I've always wanted to code some accessory programs for online poker sites but I never really thought about it seriously until i read your series. Keep up the informative writing!

I'm curious about your statement that PStars uses a logfile that you can pull data from. I've examined this file, and it doesn't appear that it reports any cards on the screen besides your own hole cards. Can anyone clue me in on what I should be looking at?

One of my pet projects has been to code a simple program that keeps track of other people's folded cards in stud. Screen scraping is absolutely abysmal for this application unless you do nothing on your computer except play poker.

Pokerstud on 6/11/2008 12:35 AM (607 days ago)

Awesome and superior. Please keep up the good work, and thanks!

Anonymous on 6/11/2008 1:18 AM (607 days ago)

@Anon who bolds his statements for some reason. Sorry the author doesn't just give out his code. He's giving you the tools to write the code. It does no one any good if he just gives out the source and EVERYONE uses it. The poker sites would catch on and block it and then you would be bitching about an updated bot that gets past the security. Do something for yourself for a change alright buddy?

CJ on 6/11/2008 1:22 AM (607 days ago)


BOT THIS Said:
OKAY. YOU HAVE TO STOP TELLING PEOPLE HOW TO BUILD BOTS. WELL AND GOOD FOR PEOPLE TO SAY: I'D PLAY AGAINST A BOT ANY DAMN DAY. WELL AND GOOD FOR PEOPLE TO SAY BOTS ARE WEAK. NOT ME. I DON'T *WANT* TO PLAY AGAINST ONLINE POKER BOTS. THEY SCARE ME. PLEASE MAKE THEM STOP.

BOT THIS on 6/10/2008 12:22:10 PM (16 hours ago)

Salmerin on 6/11/2008 4:43 AM (607 days ago)


BOT THIS Said:
OKAY. YOU HAVE TO STOP TELLING PEOPLE HOW TO BUILD BOTS. WELL AND GOOD FOR PEOPLE TO SAY: I'D PLAY AGAINST A BOT ANY DAMN DAY. WELL AND GOOD FOR PEOPLE TO SAY BOTS ARE WEAK. NOT ME. I DON'T *WANT* TO PLAY AGAINST ONLINE POKER BOTS. THEY SCARE ME. PLEASE MAKE THEM STOP.

Here's what I say: "STOP READING THIS IF YOU DON'T LIKE IT....LET THE REST OF US ENJOY THE GOOD READING THIS MAN HAS TO OFFER!"

Salmerin on 6/11/2008 4:47 AM (607 days ago)

Hey James, just want to say thanks very much for a very interesting series of articles! Looking forward to seeing more... keep it up!

James on 6/11/2008 5:15 AM (607 days ago)

great article, thanks so much for your insights

Jazzy on 6/11/2008 5:28 AM (607 days ago)

Major gambling sites attract tens of thousands of visitors in a day. There are even thousands of sites for those unwilling or unable to play for money: Many online gambling sites operate on a game credit basis, and you can play just for the fun of it without risking anything.

Best Online Gambling on 6/11/2008 6:06 AM (607 days ago)

Extremely well written and organized articles, really enjoyed all parts.

Fact: Most experienced programmer are able to abstract the problems until this level.

Anyone start coding a poker bot based on this articles will spend a ton of money on programming books, a year of work on coding, then three tons until he will admit it is not an easy task to code better-than-abc bot.

Csaba Kétszeri on 6/11/2008 6:16 AM (607 days ago)

Great 3rd installment to the series. You're absolutely right about the poker bots having an edge when it comes to playing short stack.

[b]The bot I made uses binary all-in or fold strategy.[b]
http://www.icmbot.com

While this type of bot isn't practical for cash games, it is quite lucrative at the lower stake turbo sit & go tournaments. It uses ICM (independant chip model) calculations and Nash Equilibrium to determine its push/folds.

I've run it at the turbo tournaments on Pokerstars and Full Tilt and its been surprising me with its success. Amazing how many players at the $6.5 tables will call all-in's with AKo or 44 at the 10/20 blind levels early on. My bot pushes QQ/KK/AA and sits tight during the early phases... it's lethal during 12bb> phases of the tournament, and uses within a 0.1% equity to push heads-up.

I'm looking forward to upcoming articles!

Michael on 6/11/2008 4:37 PM (607 days ago)

This is a very interesting article. I will post this and past it along to others that need to read this.

R. C, Beckom on 6/11/2008 5:01 PM (607 days ago)

It's a shame about the dwindling poker scene in Dallas you started off talking about. In the UK, it is definately different and gambling laws seem to be loosening up rather than tightening!

As for the poker bot, you have some really interesting content, yet I couldn't fully grasp anything technical.

Poker is Rigged | Forums on 6/12/2008 7:53 AM (606 days ago)

As usual, it's worth noting that the OpenHoldem project provides you the framework (and all of the source code) to do this yourself. It is architected in Input/Process/Output much like the author advocates, but the heavy liftinf for the Input & Output is already done. You need to create the Process part yourself of course.

Oh yeah, integration of PT stats is already there in the framework.

Come give it a try, and join a very vigorous community that discusses these topics every day, while you're there.

http://code.google.com/p/openholdembot/

OpenHoldem on 6/12/2008 11:31 AM (606 days ago)

James Devlin, please do not let sites like "openholdembot" and "icmbot.com" stop you nice project, it is an enjoyment to read you view on things – and very inspiring for my own bot work .. you are a good writer!!

And as for the icmbot, you can get that for less than 50$, this is just silly, a winning bot takes years to build and is worth a lot more than 50-310$, I wonder if icmbot can even can break-even! Buy a bot for 50$, you might as well go all-in with 50$ when you look down at 72o, it like throwing money out of the window ..

NiceOne on 6/12/2008 2:09 PM (606 days ago)

@ NiceOne

I'd be happy to send you a demo of ICM-Bot so you can see for yourself how it works. Send an email to admin@icmbot.com and I'd be glad to respond with an attached demo bot. I invite anyone else who wants a working demo to send an email as well Smile

I'm more than willing to share my work. Why is the bot so cheap? This is a hobby for me! I'm financially secure and it's a fun side project!

We will have more videos up and running on the site in the next few days. There is currently one short video clip demonstrating how the demo bot functions and makes its calculations: http://www.icmbot.com/category/media/videos/

@ Anyone who has or wants the ICM-Bot demo: feel free to try it out at the play money sit & gos on Pokerstars or even *gasp* the $1.20 or $3.40 real money tournaments ;)

ICM-Bot Admin on 6/12/2008 3:50 PM (606 days ago)

Just a suggestion: Images with text on therm (block diagrams for example) are better viewed (no blur) if saved as GIF or PNG but not JPEG format.

aquarin on 6/13/2008 5:19 AM (605 days ago)

Another brilliantly presented and well informed article.

As a poker-botter myself, I find the subject totally facinating and look forward to each article.

Keep us the good work!

Paddy on 6/13/2008 8:39 AM (605 days ago)

We have made a poker robot with the same method.
It's free on our website go see , the name of the poker bot is WinPokerBot.
Enjoy!

Win500aday on 6/16/2008 7:20 AM (602 days ago)

Net, net, I'm glad you're posting this. On the one hand, don't give away secrets that took me a while to discover. But on the other hand, I will definitely learn something.
I've built a partial bot using some of the techniques you've mentioned but I didn't know about Detours and love it. Last summer, I felt my brain stagnating since I've retired so I decided to a). learn a new computer language and b). sharpen my poker skills. I built my little bot using VB.net and love it. I mainly use it to play my preflop strategy in tourneys while I read or watch tv. It solves my 'boredom' problem (playing hands I know I shouldn't but am bored) and I've done pretty well in some MTT tourneys with it. Of course, it's not a full-fledged bot. But your article is encouraging me to take the next step. I'm going to mix C++ and VB.net. You are an excellent writer and even if you keep it at this level (not much code), I'm getting a lot out of it. Also, I'm not afraid of a 'bot explosion' because it's still pretty difficult for the average joe to accomplish.
Keep up the good work.

Pro Bot on 6/16/2008 9:39 PM (601 days ago)

Did the men in white coats get him?

Anonymous on 6/24/2008 9:13 AM (594 days ago)

Great and excellent...

James I hope you will provide a full fledge sample-code-pack with detailed instructions. I m webdeveloper (many other languages) and interested in bot programming since several years (chats, http://www.alicebot.org/aiml.html etc.). My C++ knowledge is very limited, but I can compile and may make some modifications if I get a working example-pack.

If you provide it, it would be a great framework for people who are interested mainly in bot-logic and poker then c++ - professionals.

I hope it so mutch... and waiting on part 4

popo on 6/24/2008 4:55 PM (594 days ago)

I opened an additional Thread for related discussions named Poker Hooks on:
www.criticalsecurity.net/index.php?showtopic=30320

popo on 6/25/2008 10:18 AM (593 days ago)

[...] Well, yes... but there are problems.

Firstly, checking for changes to the IAT relies on the IAT being changed AFTER the application starts. Start the application suspended, step it till the target DLL is loaded, change the IAT, inject the trampoline code as a locked page, unload the injector and then resume the application. The IAT never changes from the apps perspective... and the DLL's enumerate as normal.

Then there are transparent DLLs. You can create a passthrough DLL which gets loaded in place of the real DLL or even statically link a .lib version of the cryptoAPI into a replacement DLL with the wrapped functionality... Again, if the target DLL is third party then they cannot check for tampering as their system could break everytime microsoft did an update or they hit some alternative config - it would be a nightmare. again, they see no IAT patching and the DLL's enumerate normally.

Finally there are some nasty countermeasures if they are anal...

Lets say they periodically checksum all of their loaded modules and send them back for analysis... this rules out general build variations in third party tools and the system API because these they would see from many sources... they also audit memory management and any locked pages. Let's say short of rewriting the app theres no way we can inject anything into their space withoutthem knowing about it.

Okay, let's play with this... [...]
www.criticalsecurity.net/index.php

IAT-Jockey on 6/27/2008 7:36 AM (591 days ago)

@popo, @IAT-Jockey - Fascinating thread. I might have to join up over there it has me itching to ramble.

James Devlin on 6/28/2008 7:27 AM (590 days ago)

Would it be possible to get a copy of the bot when complete for testing?

thanks!
Lucas
http://www.dealtoplay.com

Lucas on 6/28/2008 2:17 PM (590 days ago)

ok... so what i described in the 2nd installment [the dsp co-processor] should be a drop-in intelligent agent, which shouldn't be insurmountable, since i'm only
passing my hole cards and board cards each round to the dsp.
This would allow for improvements in the dsp algorithms/hardware.
And, I would, of course, want to keep estimated winning percentages[the output from the dsp to the bot process] as a generic/identical interface?

$pike420211 on 7/5/2008 2:21 PM (583 days ago)

If any of you players or bot writers need hand histories for your stats (PT, HM etc) databases you should head to HandHQ.com.

handhq on 7/9/2008 9:40 AM (579 days ago)

Nice info but really is nothing new. A bot really just requires tons of time just like any programming project. Poker sites and bot makers are basically playing the game of virus writers and virus scanners play. It will go back and forth and there will never be a real winner.

abcdefg on 8/23/2008 9:55 PM (533 days ago)

Amazing thread, your online Poker Bot sorry is amazing.We would like to write a review on it when you are ready.

Thank you

Online poker resource on 1/5/2009 7:48 PM (398 days ago)

Nice blog! More people should read it. If you want, you can register your blog Pokerweblogs.com. .It is free and and it automatically updates when you do an update, so visitors of our site can see when you updated your blog. The big advantage is that it will attract much more visitors to your blog.

Greets Peter

Peter on 1/9/2009 6:41 PM (395 days ago)

http://pokerbot.node64.com/

Nex on 1/11/2009 10:18 AM (393 days ago)

http://www.hotnastyworld.com

Anonymous on 2/2/2009 5:09 AM (371 days ago)

Nice job!

We did something similar here:
http://www.pokerbot-smart.com/

Download Poker Bot on 3/1/2009 12:02 PM (344 days ago)

Great work

pokerbot on 3/9/2009 7:12 AM (336 days ago)

Great 3rd installment to the series, I think thhttp://pokerfornia.comis a great story, and that it's great that you decided to share.

Top Online Poker Sites on 4/19/2009 3:04 PM (295 days ago)

Very insightful
thank you

Marwan on 5/18/2009 2:09 AM (266 days ago)

I know you get hundreds of comments but would appreciate any input if you had some for my inquiry. Is it possible that poker sites predetermine who they want to win? I was recently playing on absolute poker in a heads up match Now my internet connection is good and all and through these last hands there was definitely no lag. The last hand the opponent had about 40 chips left, less than the blind. Before the flop even came out, the screen had already popped up telling me I won the tourney. Do you know of any reason for that? Obviously I could see the incentive for a poker site to do this, rapid construction and destruction of players BR's could create gambling addicts and a lot larger rake for the house? But it seems quite extreme that absolute would pre decide who is going to win? even though in the past the were involved in one major scandal. Feel free to give me an email if you have any ideas.

Regards,
Brian

Brian on 6/7/2009 2:14 AM (246 days ago)

Very impressive article

Poker Bot on 6/8/2009 9:30 AM (245 days ago)

Exclusive delirium, in my opinion

acomplia on 7/1/2009 5:06 AM (222 days ago)

It seems excellent idea to me is

cialis on 7/8/2009 8:01 PM (214 days ago)

A truly exciting read and I'm not even a coder. Just as a poker fan I find your approach to and analysis of the process of building an online poker bot fascinating!

Poker News on 7/14/2009 5:44 AM (209 days ago)

Very nice article. Thank you very much

Akira on 9/29/2009 3:55 AM (132 days ago)

Wow this post is very interesting. I always knew that a lot of work went into coding bots, nothing like this though. What a great insight!

Texas Holdem Poker on 10/5/2009 6:02 PM (126 days ago)

Anonymous on 10/15/2009 5:41 PM (116 days ago)

I have 36 computers avaiable from 10pm to 7am.
If anyone wants to run their bot in my computers, we can share the profits.
tobyniefers@hotmail.com

Toby on 10/19/2009 11:53 PM (111 days ago)

Hi everyone,

I would like to congratulate James Devlin because your web site is really amazing. From the technical point of view, it is 7 stars, not 5. It is outstanding.

Right now, I would like to find someone to cooperate with me on a poker software project whose goal is to improve SNG table selection (Pokerstars). As James Devlin states, table selection is very, very important and I need to improve that area. What I am looking for is someone that is able to develop a software that retrieves the content of any listbox on Pokerstars. I have already developed all the software needed to evaluate if we should or should not register on each specific tournament taking into account some statistic criteria ....

If you are interested, please post your email on a comment and I will contact you afterward.

Poker of Aces on 11/22/2009 9:48 PM (77 days ago)

Hey Poker of Aces,
I work on another Poker project. I focus on cash games. But maybe we could exchange some knowledge and how to investigate new Poker rooms.

Feel free to write me an email: Klabautermann176@web.de

Klabautermann on 11/25/2009 7:58 PM (74 days ago)

my heard hurts after reading this but

zynga poker chips on 12/6/2009 6:21 AM (64 days ago)

its still pretty interesting Smile

zynga poker chips on 12/6/2009 6:21 AM (64 days ago)

i wish i could find a bot for facebook texas holdem poker, it sure beats scouring the net for facebook poker cheats

facebook poker chips on 12/8/2009 10:22 PM (61 days ago)

I can only assume you are reaping the rewards of your bot system, how else would you have time to put these posts together? Each page I read draws me further into the world of poker and potentially how much money there is to be made from not just playing but also from . I have to wonder if you use [url=http://www.paprikashop.co.uk/itemlist.php/clasrefr/HWB]Hot Water Bottles late at night when you are playing poker and earning all this money?

James on 12/11/2009 9:55 AM (59 days ago)

I can only assume you are reaping the rewards of your bot system, how else would you have time to put these posts together? Each page I read draws me further into the world of poker and potentially how much money there is to be made from not just playing but also from . I have to wonder if you use [url=http://www.paprikashop.co.uk/itemlist.php/clasrefr/HWBHot Water Bottles late at night when you are playing poker and earning all this money?

James on 12/11/2009 9:57 AM (59 days ago)

Really nice article i enjoyed it very much.

Unibet on 12/14/2009 1:04 AM (56 days ago)

Great it is useful information.

odds comparison script on 12/25/2009 3:54 PM (45 days ago)

I'm interested in casino bots.

casinos on 1/2/2010 6:27 PM (37 days ago)

There was a gunman ,all things about him are cold,including his gun,eyes and heart.
ugg boots online
Finally,he died of coldness.
uggs online
However,with ugg,everything will totally change,not tragedy like this any more!

ugg boots online on 1/24/2010 9:39 PM (14 days ago)

The grass is greener on <a href="http://www.uggssale.org/">uggs" rel="nofollow">http://www.uggssale.org/">uggs sale</a> the other side of the fence.God helps those who help themselves.A little knowledge is dangerous.A good <a href="http://www.uggssale.org/">uggs" rel="nofollow">http://www.uggssale.org/">uggs outlet</a> medicine tastes bitter.

uggs online sale on 2/2/2010 9:06 PM (5 days ago)

The grass is greener on the other side of the fence.God helps those who help uggs outlet themselves.A little knowledge is dangerous.A good uggs sale medicine tastes bitter.

uggs online sale on 2/2/2010 9:07 PM (5 days ago)

Poker Bots are bad for everybody

Absolute Poker on 2/2/2010 10:53 PM (5 days ago)

I have got some good points about pet project and the chalk out picture help a lot. You have mentioned about poker players around the world, so did you inform that a top rated online poker site offer 50-60% certain rakeback for all the poker player around the world.

Poker on 2/8/2010 3:52 PM (3 hours ago)

Comment on this post:

Thanks for your interest in Coding the Wheel. All fields are optional.