Burning Bridges and Getting Banned From Full Tilt Poker

This is post #20 in an ongoing series of articles about my work as a poker bot developer.

In a previous post, I described how I was banned from PokerStars. Basically I think I was playing the bot too much, PokerStars security got suspicious, reviewed my account, and figured out it was a bot.

I actually built the bot to run on both PokerStars and FullTiltPoker (FTP), but due to problems interfacing with FTP’s software, I abandoned it and focused on PokerStars.

October 2, 2008 was the day the bot was banned on PokerStars. In June 2009, I started writing about it on this blog. On July 14, 2009, less than a month after I started writing about it here, I got the bright idea that I should double check with FTP that I was still able to play on their site so I emailed them. Keep in mind I was not banned from FTP at the time I sent this email…

Support,

I have a bit of an odd question.

I have an account with FullTiltPoker under the name “…” that I used for a few weeks in early 2008 to test a poker bot I was developing.

The bot played about 300 low stakes Heads Up SNG’s but mostly due to the difficulty of building a bot for the FTP software, I turned my efforts to PokerStars and continued my work there. My account at PokerStars (“kaon”) lasted until early October 2008 when it was promptly suspended for operating the bot. I have not attempted to run the bot since that time on PokerStars, FullTilt, or any other network for that matter.

In the interest of full disclosure, I have written about my work on my programming blog (see: http://www.mattmazur.com/category/poker-bot/).

I may be intersted in playing poker again at some point in the future and I’d like to do it on FullTiltPoker if possible. For what it’s worth, I have no intention of ever running the bot again–indeed, I wish I had never tried to make it in the first place. Why tell you all this? I’m afraid I might build up a significant bankroll and then somehow your security team will learn of my former bot transgressions and suspend my account.

If I never violate Full Tilt’s Terms of Service again, can I play on your service without fear of having my account suspended?

I’d be happy to answer any questions you have.

Regardless of your decision, thank you for the excellent support.

Matt Mazur

Surprise surprise, they did not take kindly to this otherwise friendly email. Three days later they responded:

Hello Matt,

Thank you for your mail and for your candor.

Unfortunately, we have taken the decision to exclude you from the site. We have taken this decision as a precautionary measure to protect the integrity of our site. Whilst we understand that this decision will be frustrating we are exercising our authority to close any account as outlined under Term 3 of our End User License Agreement:

Full Tilt Poker retains authority over the issuing, maintenance, and closing of players’ accounts at Full Tilt Poker. The decision of Full Tilt Poker management, as regards any aspect of a player’s account, use of the Software, or dispute resolution is final.

Which can be seen here:

http://www.fulltiltpoker.com/end_user_license_agreement

You are not permitted to set up any more accounts with Full Tilt Poker. Should you do so, any further accounts will be closed and their balances may be forfeited.

Regards,

Martin
Security
Full Tilt Poker

I kind of smacked myself in the head after this. Why, oh why, did I email them in the first place? I had no intention of playing poker at that time and there was no indication that they were investigating me (though they could have looked up my account by my name), so what value did emailing them have?

After a bit of introspection, I realized the answer: I wanted to burn the bridge. Having an active FTP account was good because it enabled me to turn back to poker should I ever need extra money. But getting banned from FTP, the largest poker site next to PokerStars, was great because it forced me to abandon poker as a possibility. Sure, I could probably grind it away on some of the less popular sites, but PokerStars and FTP are where all the money is. With poker not a viable option, I had to focus on my startup pursuits because I had no fallback plan.

Was it a good decision? Check back in five years and I’ll let you know. :)

What’s your backup plan? Would eliminating it give you a better chance at succeeding at your current endeavor?

Poker Bot Preflop Strategy Explained

This is post #19 in an ongoing series of articles about my work as a poker bot developer.

When I first attempted to build a poker bot, I tried long and hard to come up with a single algorithm that given your two hole cards and the situation would spit out call, raise, or fold for every situation that the bot could face. Turns out its not a trivial task. There are a lot of factors that should affect your decision: your hole cards, your image, your opponent’s style, your position, the stack sizes relative to the blinds, the recent hand history, the stack to pot ratio once the flop hits and, and the history so far in the hand (in the case of three and four bets). To quantify all of this information – let alone weigh it in an intelligent way – is difficult, to say the least. After several weeks of fruitless attempts, I abandoned it in favor of a simpler, albeit less elegant solution.

At its core, my solution boils down to conditional statements using a simplified version of the current situation. Consider this:

“If your effective stack sizes is 55 big blinds and you’re the small blind and you’re first to act and your opponent is loose aggressive and you have 8h 6h then you should raise three times the big blind.”

It would be impossible to enumerate every possible combination this way, but if you take some shortcuts, you reduce it to a manageable number of factors.

Stack Size

In order to work with stack sizes, I grouped them together based on the effective stack size (effective stack size uses the smaller of your and your opponent’s stack size because the rest is not in play):

0 – 10bb: Shortstacked

10 – 15bb: Danger Zone

15 – 22bb: Red

22 – 35bb: Orange

35 – 50bb: Yellow

50 – 75bb: Green

(The maximum effective stack size you can have on PokerStars’ Heads Up SNGs is 1500/20 = 75 bb.)

These groups were based on my observations watching the bot and on the postflop stack to pot ratios.

Previous Actions

Like stack sizes, it would be impossible to list out every possible combination of actions leading up to current situation, so I used a shorthand:

1 = You’re small blind

2 = You’re big blind

All previous actions are reduced to C (call) or R (raise) and the size of the raises are ignored completely.

Examples:

– You’re small blind and just dealt: 1

– You’re big blind and your opponent raises: 2R

– You’re small blind, you limp and your opponent raises: 1CR

– You’re big blind, your opponent raises, you three bet, and he four bets: 2RRR

Every preflop decision can be represented this way.

Hole Cards

It’s generally not a good idea to group holecards beyond the standard 9s 9h = 99, 9s 8h = 98o, etc. There are times when 88, 99, and TT should be treated the same and other times when TT should be treated differently, so it won’t do you much good to create a “Mid Pocket Pair” group and treat everything in it the same way.

That being said, specifying an action for all 169 simplified hole card combinations for every situation would would be a tedious task to do by hand. In an effort to manage it, I created a seperate program specifically for creating ranges and assigning actions to the holecards. I called it Range Maker:

(If you’ve seen ALL IN Expert, the poker calculator that I developed after the poker bot, Range Maker is where the idea came from.)

There are two versions of Range Maker shown in the screenshot above. Below the grid on the left is the older version; on the left is newer version. The grid serves both.

The older version lets me assign a fold, call, raise, or push action to every hole card combination in the selected range.

In the example below, orange represents call, maroon a 3x raise, cyan push, and gray/pink fold:

As time went on I expanded it to include additional options:

The numbers on the right represent the distribution of raise/call/fold for that color. The randomness was necessary to fool observant opponents and PokerStars security, in case that was something they looked at. The decision to push or raise 3x was later delegated to software, which figured out what the stack to pot ratio would be postflop if the opponent called and pushed if it was too high.

Here’s an example of what the range looks like for the small blind opening range vs an aggressive opponent when the stack size was in the red zone (15 – 22 bb):

And here’s the same spot vs a call station:

It took a long time to get these ranges down. I would sit there and watch the bot play for hours, making pages of notes on what I wanted to adjust when the session was over.

For those of you looking for a bit more, here are the range files I used with each version:

These include virtually every range I ever worked with, so if you want to use these you’ll have to spend some time analyzing them to pick out the gems.

Putting it All Together

Here’s roughly how it went in an actual game:

1. Analyze the current situation: hole cards, stack size, previous action, and opponent style and group them.

2. Look up the range based on these factors

3. Act

Example: PokerStars 25/50 blinds, you are small blind with 2100 chips, call station opponent is big blind with 900 and you’re dealt Ks 5h.

Your effective size is 900/50 = 18 big blinds, putting you in the red zone and since you’re small blind and first to act, the previous action is simply “1”. Now with three layers of conditional statements (stack size, previous action, and opponent style) you can look up the range (see the screenshot above) and determine that K5o is 80% raise, 20% call, and 0% fold. Roll a die (in this case the random number generator) and pick an action based on that distribution.

Here’s the corresponding code for step 2:


'------------------------------------------------------------
'  Name    : PreflopActionFromFile
'  Purpose : Given a specific situation, this'll look up my range in
'            the Hero Ranges.txt file and see what I want to do with this hand
'------------------------------------------------------------
'
Public Function PreflopActionFromFile(sHoleCards As String, sRangeName As String) As String

 Dim sRangeFile_Old As String                ' old range file
 Dim sRangeFile_New As String                ' advanced ranging (mixed ranges)
 Dim sNewINIData As String                   ' data from the advanced file
 Dim iDataPos As Integer                     ' start of the distribution
 Dim sDistribution As String                 ' data from that file
 Dim sDistributionSplit() As String          ' split it up

 Dim sSimpleHand As String                   ' AA, AQs...
 Dim dRndNum As Double                       ' a random #
 Dim dRaisePerc As Double
 Dim dCallPerc As Double
 Dim sINIVal As String

 sSimpleHand = SimpleHand(sHoleCards)

 sRangeFile_Old = App.Path & "ResourcesHero Ranges.ini"
 sRangeFile_New = App.Path & "ResourcesHero Advanced.txt"
 sNewINIData = GetFromINI("Range Data", sRangeName, sRangeFile_New)

 If sNewINIData <> vbNullString Then
 ' There is an entry in the advanced range file

 iDataPos = InStr(sNewINIData, sSimpleHand)
 sDistribution = Mid(sNewINIData, iDataPos + Len(sSimpleHand) + Len(" ("), InStr(iDataPos, sNewINIData, ")") - iDataPos - Len(sSimpleHand) - Len(" ("))
 sDistributionSplit = Split(sDistribution, "/")

 ' Make an update
 Update "Mixed Distribution: " & sSimpleHand & " (" & sDistribution & ")", 2, eDecision

 dRndNum = Rnd
 dRaisePerc = Val(sDistributionSplit(0)) / 100
 dCallPerc = Val(sDistributionSplit(1)) / 100

 ' Make a decision...
 If dRndNum <= dRaisePerc Then
 PreflopActionFromFile = "R"
 ElseIf dRndNum <= (dRaisePerc + dCallPerc) Then
 PreflopActionFromFile = "C"
 Else
 PreflopActionFromFile = "F"
 End If

 Update "Action Chosen: " & PreflopActionFromFile, 3, eDecision

 Else

 Update "Hero Range: " & sRangeName, 1

 sINIVal = GetFromINI("Ranges", sRangeName & " (R)", sRangeFile_Old)
 If InStr(sINIVal, SimpleHand(sHoleCards)) > 0 Then
 PreflopActionFromFile = "R"
 Exit Function
 End If

 sINIVal = GetFromINI("Ranges", sRangeName & " (C)", sRangeFile_Old)
 If InStr(sINIVal, SimpleHand(sHoleCards)) > 0 Then
 PreflopActionFromFile = "C"
 Exit Function
 End If

 sINIVal = GetFromINI("Ranges", sRangeName & " (P)", sRangeFile_Old)
 If InStr(sINIVal, SimpleHand(sHoleCards)) > 0 Then
 PreflopActionFromFile = "P"
 Exit Function
 End If

 PreflopActionFromFile = "F"
 End If

End Function

Final Thoughts

This approach covered about 90% of all the preflop situations the bot faced in the course of a game, but about 10% had to be handled with special cases. Consider, for example, an opponent who pushes every time with 75bb. You can’t just treat this as a 2R situation and call with the standard range. There are also a lot of situations where you should shove simply based on its expected value, which you have to figure out in spots that warrant it (which require you to estimate your opponent’s raising and calling range).

If you’re an aspiring botter and have questions about any of this, feel free to shoot me an email. And good luck.

Matt

Poker Blog #2 Archive

During my hey-days as an online poker I kept a blog where I wrote frequently between June and December 2006. An archive of that blog is hosted on this website, which you can read here. I stopped writing when I started working working on the poker bot because it’s not something you can write about publicly without fear of reprisal.

In July 2007, after working on the shortstacking bot for several months, I got it into my head that I’d be better off getting back into poker. Armed with a notebook full of poker formulas, I set out confidently to make a killing. And, of course, I had to start a blog to chronicle my adventures.

But it was not meant to be. After several posts, I decided I didn’t want to write about it publicly. And a little while later, I decided I’d rather work on the bot than play poker, even though playing would probably be more lucrative.

I’m doing some online house-cleaning today–getting rid of accounts I haven’t used in a while–and I stumbled across this blog. It’s not much, four posts, all from July 2007, but I’m posting it here because it’s somewhat interesting and why not.

###

Prelude to a Blog

I’m starting a blog again. It helps me to write my thoughts down, which should ultimately help me be a more profitable player. I have some thoughts as to what I want to accomplish in the future as far as poker goes, but I’m going to hold off details. I’m in the process of moving jobs, which will keep me busy for two to three weeks. Once I am settled in, I will begin a new challenge.

###

Stack Size Math

I tend to play by feel. I have a general sense of pot odds and the effects of stack sizes on my strategy, but rarely do I formally go through the numbers in my head. I’m going to start to focus on the numbers during every hand I play, because I feel it can greatly improve my game.

Honestly I don’t expect to do all of these on every hand, but a general idea is important.

General
I intend to call:
– What are my pot odds/BEP?
– How much will I have remaining if I call?
– How much will the pot be if I call?
– What percentage of my opponent’s stack has he committed total
– What percentage of my stack will I have committed if I call?
– If I’m drawing, how much must I make if I hit for this call to be profitable?

I intend to bet/raise:
– What pot odds/BEP am I offering to my opponent?
– What will be the new pot size if he calls?
– How much will my stack size be?
– How much will his stack size be?
– If he shoves, what will my pot odds/BEP be?

Math
The math for calling scenarios:

Pot Odds = (Total Pot / To Call) : 1
BEP = 1/(1 + Pot Odds)
New Pot = Total Pot + To Call
Stack Hero committed = (Total Pot – To Call) / 2
Stack Villain committed = (Total Pot – Stack Hero Committed)
% Villain committed = Stack Villain committed / (Villain Stack + Stack Villain committed)

Necessary Win = (To Call / Equity) – To Call – Total Pot

If I intend to bet/raise:
Offer Pot Odds = (Bet / (Bet + Total Pot) : 1

Preflop Raise/Shove Scenarios:
Before I raise I should consider the odds I’ll get if he pushes:

Scenario1: Hero is short stacked
Ex: 25/50 blinds. Hero posts SB, leaving 975 behind. Villain posts BB, leaving 1950 behind. Hero raises to 150, Villain shoves.

My Pot Odds = (My Stack + Raise To + SB)/(My Stack – Raise To + SB) : 1

Scenario1: Villain is short stacked
Ex: 25/50 blinds. Hero posts SB, leaving 1975 behind. Villain posts BB, leaving 950 behind. Hero raises to 150, Villain shoves.

My Pot Odds = (His Stack + Raise To + BB)/(His Stack – Raise To + BB) : 1

###

HU Cash, Random Thoughts

I deposited $600 to FTP today using my Mastercard, which surprisingly worked. I played a good two hours of NL100, dropping maybe $300 in the process. I played terribly and was not used to the deep stacks. I will try it again sometime, but I don’t know if I am willing to devote the time to learn a new type of game, when SNGs are so profitable for me.

My current plan is to do a 2 year, $100k challenge. This is on top of my day job, which should occupy 8-4 on weekdays. The extra money will help me keep my options flexible and it will go a long way for many years to come.

Heads Up SNGs are… deceptive. You can make $500 one day, lose $300 the next day, make $200, lose $150. How much have you actually made? $62.50/day. My point is that just because you have big wins, doesn’t mean that thats actually what you’re making. Take this guy for example:

rockets23
Games: 7106, Avg Stake: $491
Net: $13,658
ROI: 1%, $/Game: $2

I’ve seen this guy around for a long time. He’s played 7100 games and made a whopping $13k. $2/game. That’s equivalent to someone playing $20s with a 10% ROI. What good has the high stakes gotten him? If he would have stayed at a lower stake and made $5/game, he’d have $32k now instead of $13k. The lesson is this: Stay at a stake that you can make a good $/hr. Otherwise, you’re just wasting your time…

###

Epiphany

I had a realization this evening: this blog is bad for me. Ironic, since I restarted this last night.

For a long time I thought that keeping my performance public would keep me accountable. The truth is that it is keeping me from reaching my potential as a poker player. The greatest poker player would be accountable only to himself. I like writing, but not for others. I can’t really be honest here. There is just too much ego inherent in a blog, especially one about poker. As much as I try to write without asking “What will they think if I write this?” its very difficult to do in practice. I find myself distancing myself from my mistakes when I play. Its even harder to admit to in a blog, because you want people to respect your play.

I will keep writing, but it will primarily be in a Word document on my desktop rather than a Blogspot page. I’ll update this blog as big things happen.

Italian Poker Club Article on Poker Bot Development

This is post #18 in an ongoing series of articles about my work as a poker bot developer.

Just noticed this article on an Italian poker website which provides a pretty good summary of my poker bot work.

Here’s a rough translation courtesy of Google Translate:

Recently the problem has come back into favor the use of bots, automated programs that are included in the Poker Room to play, we propose in this regard the story of a player, Matt Mazor, who between 2007 and 2008 he developed and used a of these programs to play on PokerStars.

Matt Mazur was discovered in 2008 by Pokerstars  and your account blocked because it used a SNG bot, the player said to have used for about 2 years in the low stakes of the room and then Matt Mazur has described in his blog all the details of ‘experience passing through the actual development of software.

His bot has played SNG from $ 2 to $ 11,  Matt does not provide financial details of its program, but speaks only examples of gaps and partial information, the last month of practice states that it had a profit of $ 480 Heads-Up on 500, also states that the results have been improving during the development and upgrades made to his Bot.

Mazur present its findings by analyzing what your program has done from a technical point of view / information and presents a series of graphs which illustrates the behavior of the program over time depending on the actual size of the stack, for example, we can see the chart on the first phase of the sit when the stacks are between 50 and 75 times the BB (You can view graphs of the behavior of the bot to follow link ).

Mazur has never forced the use of his bot, taking it to multi-table up to three tables at a time, for two main reasons: the first is being able to personally monitor and analyze performance data in real time and the second to intervene in the chat  when the words were mentioned and computer bots or you can write one of the first alarm bells for the bots and what not engaged in chat discussions. (Matt had developed a mechanism by which the software indicated the presence of words in chat bots, or computer).

Bot developed contrary to what one can not imagine using the SAGE system based on the balance of Nash and commonly recognized as valid in the low stakes, but an EV based system and other logic conditions developed by Mazur.

In ‘October 2008 his PokerStars account has been locked, Matt received an email from the room warned him that his account was blocked for using a poker bot, but Matt took it philosophically and unlike any other, has also gave some advice to the technical room for improving the system of defense against Bot:  Matt has shown what he believes points to work on to improve the research techniques of bots on the network (You can see the correspondence he had with the Pokerstars link below ).

Matt Mazur has continued to work on programs that could improve the performance in the game starting to deal with online tracking and odds calculators.