Home

PPL User Guide

image

Contents

1. nuansa 53 3 6 3 Defining Your Hand ERROR EU CR 54 3 0 6 Usme Sequential Order POS Ly sssini nenian uas as aaien 56 3 6 7 Coding for Pot Odds n iiti ereenn RE AEA EEE A ERREA 57 36 8 Other TIPS ersan NEM iaai aeea E aa aE a isisa huan san e a aaa quas sud 58 3 6 9 Example of a Postsrlop NL Holdem Code sssisrisersiriresrsss irais E ERE 61 3 7 D b gging for TypPOSsssse siirinsesi eiei aan e EE n Ea EAS EESE RE SEAE ESEESE HO 63 3 7 1 Finding the Typo so You Can Correct It bie etus defectu M pA Du EB Obs RU pA dS 63 3 12 Common Typos RC eee 64 ADDED ouis asua sid e Da cuu hpa de Mean eaten adt dex Meat ub 65 N meric Valed Varlabl s eoe tesr ineat up adr da pista tetro tou Dres asas KAE a EE ba ote iesus esed bns 65 Boolean Valued Variables u 69 Appendix 2 Example of an Omaha 8 profile biegen esemiutesi cutem adu n tas ie nacht seb kd ea eia 79 Copyright 2008 2013 Shanky Technologies hank E Techhologies Para Ta E P L POKER PROGRAMMING LANGUAGE 1 First Things First Let s get one thing straight You don t need to customize our poker bots We are not selling a blank platform that requires programming Our Holdem Bot is a fully functional software program that plays good poker right out of the box and has many ready made playing profiles targeting different game ty
2. This Appendix gives a working example of a PPL coded profile written for Pot Limit Omaha Hi Lo tournaments It is meant for instructional purposes but can be used as is and in fact has done very well in large field MTT s It just needs to be added to a saved profile underneath where your option setting choices display and loaded after starting the bot using the Read Profile menu item custom Preflop When opponents 1 and OpponentIsAIlIn and BetSize lt 20 StackSize call force When StackSize gt 100 and raises gt 1 and Betsize gt 12 and not hand AA or hand Asuited2 or hand Asuited34 or hand Asuited35 or hand Asuited36 or hand Asuited3KQ or hand Asuited3KJ or hand Asuited3QJ or hand Asuited3KT or hand Asuited3QT or hand A suited 3 J T or hand A suited KK or hand A23 or hand A24 fold force When raises gt 1 and BetSize gt 4 and hand AA RaisePot force When OpponentsAtTable 1 and hand A or hand KK or hand QQ or hand JJ or hand KQJT or hand KQJ9 or hand KQT9 or hand KJT9 or hand KQJT or hand KQJ9 or hand KQT9 or hand 234 or hand 235 or hand 245 or hand 246 and not hand KKK or hand QQQ or hand JJJ RaisePot force When OpponentsAtTable 2 and BotsLastAction raise and hand AA or hand A 2 or hand A suited RaisePot force When OpponentsAtTable 2 and hand A suited or hand KK or hand QQ or hand A 4 or hand A 5 or hand 234 or hand 235 or hand
3. Will cause the bot to always fold Other examples of Boolean Variables include FlushPossible which is true when there are at least 3 cards of the same suit on board so that a Flush is Possible Similarly HaveFlush is a Boolean Variable which is true if we have a made flush User defined variables are Boolean variables that start with the letters user These are explained in section 3 2 5 3 2 2 Operators A condition can be composed of other Conditions Conditions can be combined using the boolean operators And Or and Not They can also be grouped together using parenthesis For example When hand QQ and raises 0 RaisePot When hand AA or hand KK and raises gt 1 RaiseMax Not and And and Or have their standard meanings Nof has a higher precedence than And which has a higher precedence than Or Not Condition Is true only when Condition is false and vice versa Copyright 2008 2013 Shanky Technologies hanky P P L Technologies P aee 14 POKER PROGRAMMING LANGUAGE Condition And Condition Is true only when both conditions are true Condition Or Condition Is true when either condition is true 3 2 3 Actions An action tells the bot what to do when a certain condition is satisfied The bot currently supports the following actions Beep computer will beep at you but take no action on the hand if you do not respond you will time out Call check if po
4. J8 or hand J7 or hand Q7 fold force When hand K7 or hand 22 or hand 33 or hand 44 and Still ToAct gt 3 fold force When hand AA or hand KK When raises 0 and Still ToAct gt 7 call force When raises 1 RaiseMax force That s all there is to it Adjust the hands and values as you see fit and post the code under your option settings in your saved profile and you are good to go 3 5 4 Programming Fold or All in Profiles These are easiest custom profiles to create because you are only concerned with either folding or going all in before the flop This is a popular way to play SNG s The simplest type of code wouldn t even bother with position or the opponent count and simply shove or fold by hand strength and perhaps take into account if there has already been a raise or not This approach would probably be more adept for Turbo SNG s So let s start there custom preflop When hand AA or hand KK or hand QQ or hand JJ or hand TT or hand 99 or hand AK or hand AQ suited RaiseMax force Copyright 2008 2013 Shanky Technologies 9 hank Technologies Page 135 r P L POKER PROGRAMMING LANGUAGE When hand A suited or hand KQ suited or hand AQ or hand AJ or hand 88 or hand 77 or hand 66 or hand 55 and raises 0 RaiseMax force When hand AT or hand A9 or hand A8 or hand A7 or hand 44 or hand 33 or hand 22 or hand KQ and raises 0 and calls lt 1 RaiseMax force
5. J8 suited or hand J7 suited or hand T8 suited or hand T7 suited When BotsLastAction raise call force When BotsLastAction call and calls gt 5 call force When In SmallBlind and raises 0 and calls gt 1 call force When In BigBlind and raises 1 call force When raises 0 and calls 0 and opponents lt 2 raise force When raises 0 and calls gt 4 call force When others fold force When Hand Q9 or hand Q8 or hand J9 or hand T9 or hand Q7 or hand J8 or hand J7 or hand 98 When BotsLastAction raise call force Copyright 2008 2013 Shanky Technologies PPL POKER PROGRAMMING LANGUAGE hanky Technologies Page 146 When In SmallBlind and raises 0 and calls gt 1 call force When In BigBlind and OpponentsAtTable lt 3 and raises 1 and calls 0 call force When raises 0 and calls 0 and opponents lt 2 raise force When others fold force When Hand 97 suited or hand 96 suited or hand 86 suited or hand 85 suited or hand 7s5s or hand 6h4h When BotsLastAction raise call force When BotsLastAction call and calls gt 6 call force When In SmallBlind and raises 0 and calls gt 1 call force When In BigBlind and OpponentsAtTable lt 3 and raises 1 and calls 0 call force When raises 0 and calls gt 4 call force When raises 0 and calls 0 and OpponentsAtTable 1 raise force When others fold force When Hand T8 or hand T7 or hand 97 When BotsLastAction
6. Restrictions Can only be true in Omaha games TopFlopCardPairedonRiver True if the highest ranking board card on the flop paired on the River Restrictions River only TopFlopCardPairedonTurn True if the highest ranking board card on the flop paired on the Turn Restrictions Turn and River only TripsInHand True if the bot has trips in the hole Restrictions Can only be true in Omaha games TripsOnBoard True if there is a three of a kind on board This will also be true if there is a full house or quads on board Restrictions Post flop only TripsOnBoardOnTurn True if three of a kind is was on board on the Turn This will also be true if a full house or quads is was on board on the Turn Restrictions Turn and Hiver only TurnCardPaired True if the card that was dealt on the Turn was paired on the River It must be the card that was dealt on the Turn not true if any other card pairs on the River Restrictions Hiver only TurnCardisOvercardToBoard True if the card that was dealt on the Turn was higher in rank than all the other board cards Restrictions Turn and River only TwoPairlnHand True if the bot has two pair in the hole Restrictions Can only be true in Omaha games TwoPairOnBoard True if there are two pair on board This will also be true if there is a full house on board Restrictions Post flop only UncoordinatedFlop True if the flop contains contained no pair on board no possible flush three
7. Technologies Page 158 P P L POKER PROGRAMMING LANGUAGE When opponents gt 2 and RaisesOnFlop or RaisesBeforeFlop and not FlushPossible or HavePair or HaveTrips or HaveStraight or HaveFullHouse and HaveFlushDraw or HaveStraightDraw call force Finally you can use the AmountToCall vs PotSize comparison to make simple calling decisions based on pot odds Any money you have already bet in the round is included in the potsize calculation so if you are getting the correct odds for a draw the decision should fairly simple Examples Turn When haveflushdraw and not flushpossible or paironboard or havepair or havestraight and amounttocall lt 2046 potsize call force When haveflushdraw and not flushpossible or paironboard or havepair or havestraight and amounttocall gt 20 potsize fold force When havenutstraightdraw and suitsonboard lt 3 and not flushpossible or straightpossible or paironboard or havepair and amounttocall lt 1146 potsize call force When havenutstraightdraw and suitsonboard lt 3 and not flushpossible or straightpossible or paironboard or havepair and amounttocall gt 11 potsize fold force When havenutstraightdraw and suitsonboard 4 and not straightpossible or paironboard or havepair or havestraight and amounttocall lt 1446 potsize call force When havenutstraightdraw and suitsonboard 4 and not straightpossible or paironboard or havepair or havestraight and amounttocall gt 14 potsize fold f
8. This variable is reset to 0 when flop turn or river cards are dealt so that it represents the number of raises for the particular betting round only lt Comparator gt A comparator can be one of the following with the usual meaning 2 no spaces and is not valid gt no spaces and gt is not valid Value A value is just any number such as 0 4 10 73 150 1004 etc 4 Relative Potsize Stacksize Comparison Condition This is a special condition designed to allow you to compare the percentage of certain numeric valued variables to either the potsize variable or the stacksize variable also both numeric valued variables This is of the form BetSize Totallnvested or AmountToCall lt Comparator gt lt Value gt PotSize j BetSize Totallnvested AmountToCall or StartingStackSize lt Comparator gt lt Value gt StackSize u MaxCurrentOpponentStacksize lt Comparator gt lt Value gt Potsize or StackSize u Potsize lt Comparator gt lt Value gt StackSize plus a few others see section 3 5 8 For example BetSize lt 30 PotSize This condition would be true when the last Bet or Raise Size is less than 30 of the current Pot Size Please note that the opponent s last bet is included in the pot size calculation with our poker bots which makes these bet size vs pot size calculations a bit tricky more about this in the post flop coding section Similarly this can also be used to compare the Total money
9. When BotsLastAction call and calls gt 3 call force When In SmallBlind and raises 0 and calls gt 1 call force When In BigBlind and OpponentsAtTable lt 4 and raises 1 and calls 0 raise force When In BigBlind and raises 1 call force When raises 0 and calls 0 and opponents lt 3 raise force When raises 0 and calls gt 3 call force When calls gt 4 call force When others fold force When Hand K9 suited or hand K8 suited or hand K7 suited When BotsLastAction raise call force When In SmallBlind and raises 0 and calls gt 1 call force When In BigBlind and raises 1 call force When raises 0 and calls 0 and opponents lt 2 raise force When raises 0 and calls gt 4 call force When others fold force When Hand Ks6s or hand Kh h or hand Ks5s or hand Kd5d or hand Kc4c or hand Kd4d When BotsLastAction raise call force When BotsLastAction call and calls gt 4 call force When In SmallBlind and raises 0 and calls gt 1 call force When In BigBlind and OpponentsAtTable lt 4 and raises 1 and calls 0 call force When raises 0 and calls 0 and opponents lt 2 raise force When raises 0 and calls gt 4 call force When others fold force When Hand K6 suited or hand K5 suited or hand K4 suited or hand K3 suited or hand K2 suited When BotsLastAction call and calls gt 4 call force When In SmallBlind and raises 0 and calls gt 1 call force When raises 0 a
10. When calls 0 and raises 0 and StillToAct gt 3 call force This would only be of use in Limit games because there is no BetSize variable used and the bot would therefore call raises of any size in NL games which is a good formula for disaster What you should notice about this code is that it covers all possible call fold raise scenarios That is what you should do when creating custom code for hand groups so you can be assured the bot will always play the way you want it to If you let a scenario slip through the cracks the bot might fold hands you want to play or vice versa So you need to always look at your code and think about making sure you covered all the possible raise fold call counts A good way to do this is choose either the fold call or raise count and start every line in the statement with that as did above by using the call count This will make it much easier to scan and make sure there are no holes in it so to speak However you can use the when others condition to catch everything you don t want to have to code for as long as the action is the same for all of them For example in the above code the last line could be replaced with When others call force Did you also notice that the second line in the above code for suited connectors is an instruction on how to handle re raises behind it This goes first because code is read in sequential order and want to bot to call any and all subsequent re raises those times
11. highest possible flush with the current board cards For Holdem the 2 highest possible flush could consist of all cards from the board Note that 2 nut flushes could be beaten by a higher flush full houses four of a kind and straight flushes Restrictions Post flop only Have2ndNutFlushDraw True if the bot has a made 2 nut flush or a 2 nut flush draw Restrictions Post flop only Have2ndNutLow True if the bot has the 2 best possible low using the current board cards Restrictions Post flop only Can only be true in Omaha 8 games Copyright 2008 2013 Shanky Technologies A S k Techhologies Page 71 PPL Have2ndNutLowDraw True if the bot has the 2 nut low draw If a low is possible then this variable will be false This variable is also false for made lows Restrictions Post flop only Can only be true in Omaha 8 games Have2ndNutStraight True if the bot has the 2 best possible straight using the current board cards Note that this may not be the 2 best hand if a flush or full house is possible Restrictions Post flop only Have2ndOverPair True if the bot has a hole pair which is between the highest board card and the 2 highest card rank on board and therefore is not technically an overpair to the board Ace is highest Pairs on board are only counted as one rank Restrictions Post flop only Have2ndTopPair True if the bot has a hole card that is the same value as the 2 highest card on board Ace i
12. language elements to create valid code which says the same thing The important thing is to understand how to piece the elements together to make valid code If you are trying to code more complicated scenarios involving the opponent count position last bet size and such you are going to want to create the desired actions with the least amount of code 3 3 2 Use preflop flop turn or river on One Line to Start for Each Betting Round The betting round must be identified with one of these terms to start the coding for each betting round preflop flop turn river Therefore if you are including preflop custom instructions your code would start with custom preflop and when you are done with the preflop section you would enter the line flop to start coding the flop situations 3 3 3 End your code with When others when others fold if you Want to Kill All Default Programming Copyright 2008 2013 Shanky Technologies l hanky Technologies Pace 121 P r L After you have completed your code for all the conditions that you want customized for a betting round you can tell the bot to only play the situations you have customized for and ignore all the option settings and default programming if you want This is done by adding the following two lines at the end When others When others fold force You would then state the one line word to signify the start of the next betting round code if applicable Ho
13. lt 7 call force When hand QJ suited and raises 1 and BetSize gt 7 fold force The bot will never find the QJ suited line in the above code and execute the action because it will find the QJ line first and fold To make this code valid just reverse the order of the lines to When hand QJ suited and raises 1 and BetSize lt 7 call force When hand QJ suited and BetSize gt 7 fold force When hand QJ and raises 1 fold force Remember that line breaks and spaces don t matter just insert them to make the code easier to read This same concept holds true for the blinds Here is the wrong way to code blind exceptions When hand A9 and BetSize lt 6 When raises gt 1 fold force When raises 0 and calls 222 call force When raises 0 and calls 1 fold force When raises 0 and calls 0 and opponents gt 4 fold force When raises 0 and calls 0 and opponents lt 4 raise force When In SmallBlind and calls gt 1 call force When In BigBlind and raises 1 call force Copyright 2008 2013 Shanky Technologies l hanky Technologies Pace 128 P r L The bot will never make that big blind call and will not make the small blind call when calls 1 because it won t get that far The earlier when conditions with an action will tell the bot to fold first To correct this code move the lines around like this When hand A9 and BetSize lt 6 When In SmallBlind and calls gt 1 call force When In BigBlin
14. 0 and not FlushPossible BetPot force When position first When HaveFullHouse or HaveStraightFlush or HaveNutFlush call force When HaveTrips or HaveNutStraight or HaveSet or HaveTwoPair and SuitsOnBoard 3 and bets 0 call force When HaveTopPair and SuitsOnBoard 2 and bets 0 and raises 0 BetMin force When HaveOverPair When HaveNutFlushDraw or HavelnsideStraightDraw and bets gt 1 and Betsize lt 55 Potsize RaiseMax force When HaveTopPair When not HaveFlushDraw or PairOnBoard or FlushPossible or RaisesBeforeFlop or Betsize gt 50 Potsize and raises 0 RaisePot force turn When TripsOnBoard and not NutFullHouseOrFourOfAKind 2 or NutFullHouseOrFourOfAKind 1 or HaveQuads or HaveStraightFlush and BetSize gt 6 fold force When TwoPairOnBoard and not NutFullHouseOrFourOfAKind 2 or NutFullHouseOrFourOfA Kind 1 or NutFullHouseOrFourOfA Kind 3 or HaveQuads or HaveStraightFlush and Betsize gt 6 fold force When QuadsOnBoard and not HaveBestKicker fold force Copyright 2008 2013 Shanky Technologies hank Techhologies rP P L P a g e 62 POKER PROGRAMMING LANGUAGE When QuadsOnBoard and HaveBestKicker call force When OneCardFlushPossible and Betsize gt 15 StackSize and not HaveFlush fold force When PairOnBoard and not FlushPossible or StraightPossible or board A or board K or board Q and HaveTrips RaisePot force When PairOnBoard and not FlushPossible or StraightPossible and board A or bo
15. 1 give you all the preflop elements With everything you have read so far you can completely control how the bot plays before the flop in all different types of Holdem or Omaha games It is possible to create many different profiles for many different game conditions and store them all in your Bot components folder loading them as needed In fact because of the OpponentsAtTable variable there really isn t any need for the auto load profile feature on the bot any more You can simply create custom codes that play more aggressively when short handed and even more aggressively when heads up Copyright 2008 2013 Shanky Technologies P3 hank Technologies Page 133 TEL However it s a good idea to program different profiles for short handed tournament situations than cash games For example when down to the last few players in an SNG you might simply want to Fold or Go All In but short handed in cash games of course you would not do that The advantage to using the custom code over the auto load profile feature is that you can automatically tighten up when a cash game fills back up whereas with the auto load profile feature only one switch can be made durin a session Perhaps the best way to really learn the customizing code is to see working examples Therefore recommend studying the next section to see how the different code elements fit together 3 5 Preflop Custom Profile Code Examples We will start with the simpler custom codes an
16. 2 raise force When raises gt 1 fold force When raises 0 and calls gt 3 call force When others fold force When Hand A9 When BotsLastAction raise call force When In BigBlind and OpponentsAtTable lt 4 and raises 1 and calls 0 raise force When In BigBlind and raises 1 call force When In SmallBlind and raises 0 and calls gt 1 call force When raises 0 and calls 0 and opponents lt 3 raise force When others fold force When Hand A8 or hand A7 When In BigBlind and raises 1 call force When In SmallBlind and raises 0 and calls gt 1 call force When raises 0 and calls 0 and opponents lt 3 raise force When others fold force When Hand A6 or hand A5 When In BigBlind and raises 1 call force When In SmallBlind and raises 0 and calls gt 1 call force When raises 0 and calls 0 and opponents lt 2 raise force When others fold force When hand A4 or hand A3 or hand A2 When In SmallBlind and raises 0 and calls gt 1 call force When In BigBlind and OpponentsAtTable lt 4 and raises 1 and calls 0 call force When raises 0 and calls 0 and opponents lt 2 raise force When others fold force When Hand Ks9s or hand Kh9h or hand Ks8s or hand Kd8d or hand Kc7c or hand Kd7d When BotsLastAction raise call force Copyright 2008 2013 Shanky Technologies PPL POKER PROGRAMMING LANGUAGE hank Techhologies r P L P a e 44 POKER PROGRAMMING LANGUAGE
17. Copyright 2008 2013 Shanky Technologies n efi hologi PP Technologies Page 170 L POKER PROGRAMMING LANGUAGE FourCardsWith1 GapInHand True if the bot has 4 cards in sequence with 1 gap in the hole For example this variable is true if the hand is 5689 Restrictions Can only be true in Omaha games FourOf1 SuitOnTurn True if only 1 suite is was present on the board on the turn Restrictions Turn and River only FullHouseOnBoard True if there is a made full house on the board Restrictions Post flop only HadPairOnFlop True if the bot had any pair on the Flop including a pocket pair Restrictions Turn and River only HadPairOnTurn True if the bot had any pair on the Turn including a pocket pair Restrictions River only HadTopPairOnFlop True if the bot had top pair on the flop Restrictions Turn and River only HadTopPairOnTurn True if the bot had top pair on the Turn Restrictions River only HadTwoPairOnFlop True if the bot had two pair on the flop Restrictions Turn and River only HadOverpairOnFlop True if the bot had any overpair on the flop An overpair is defined as a pocket pair higher than all the board cards Restrictions Turn and River only Have10OutStraightDraw True if the bot has a straight draw which has at least 10 outs to a straight Can also be possible when the bot has a made straight already Restrictions Post flop only Can only be true in Omaha games Have12OutStraightDraw True if the
18. ND VME vases 19 3 3 1 Start with the Word custom on One Line Ll etes tuner oed nunana 20 3 3 2 Use preflop flop turn or river on One Line to Start for Each Betting Round 20 3 3 3 End your code with When others when others fold if you Want to Kill All Default Programming 20 3 3 4 Use the Word force after your Action n Ub dna usu p edna D dapes 21 3 3 5 eL 21 33 0 Stat mentS PM p IM 21 3 3 7 Start Multiple Lines in Statements with or or and u u 23 3 3 8 When Condition Without an Action n n n staat nean th st tn satt aat nitent nan 24 3 3 9 If a Statement Contains Both and s and or s Surround the or s in Parenthesis 25 2 5 10 ode 1s Bead in sequential Orderuy u uuu y u uay asiya bawa didum Pe UE ed und 2T 3 34 LL Figuring Out X Gur POSIUDEL z a e ont blica nanaq uuu ua Asa Dens subdi lcs Msc ua aqasha 28 3 3 12 Rand mizine ACDOBSO oaa ensi arianos a ls ieiuna SEEE EREA ase bd onn um rod neue 20 REMIS I T 30 Bo d Customizable Time Delays quoc eti HE Rd e rte n Ct e Ente ua na Eme dd seme feuis 31 JA Prerlop Coding suu ann ua Ec E E E RI 32 3 4 1 Preflop ACtIONS P 32 3 5 Preflop Custom Profil C
19. When hand A or hand QJ suited or hand JT suited or hand T9 suited or hand 98 suited or hand 87 suited or hand 76 suited or hand KJ suited and raises 0 and calls lt 1 and StillToAct lt 3 RaiseMax force When hand K suited or hand KJ or hand KT or hand QJ or hand QT or hand JT or hand T9 and raises 0 and calls 0 and OpponentsAtTable 1 RaiseMax force When others When others fold There you have a decent Turbo SNG template that you can do what you want with adjust the hands as you like etc Notice that there is a different grouping of hands for situations that require no raises in front of you no raises in front of you plus no more than 1 caller no raises plus no more than one caller plus no more then three opponents behind you and finally a hand group for when you are heads up and first to act This is a complete profile as it excludes every other hand by using the when others fold command at the end So it doesn t matter what your preflop option settings are because they will be ignored Of course when the bot gets a free look at the flop it will still play according to your post flop option settings for a profile such as this would have the post flop side of the Aggressive Tournament setting set to second position For non turbo SNG s you are probably going to want a more reasonable playing profile in the beginning much as you would at the beginning of an MTT or even a cash game type setting But
20. before taking the desired action Please note that these types of statements can just as easily be put all on one line like this When hand 8c 7c and In BigBlind and raises 1 and calls 0 and BetSize lt 7 RaisePot force When hand AA or hand KK or hand QQ RaisePot force Copyright 2008 2013 Shanky Technologies hank Technologies Page 124 E P L POKER PROGRAMMING LANGUAGE 3 3 8 When Condition Without an Action We have already exhibited several examples of this type of statement in prior sections of the manual Pay close attention to the next paragraph so you learn how to use this kind of a statement correctly There are two different types of statements that start with when One is a when condition without an action and the other is a when condition with an action Simple codes can consist entirely of when conditions with an action such as the beep code template given earlier A when condition without an action however will be connected to each and every when condition with an action below it This is so important to understand that am going to try and drill it through your head with a red letter rule A when condition without an action will be separately ANDed to every when condition with an action below it UNTIL another when condition without an action is found which starts the process over The previous code given for playing 77 and 88 is an example of that Here is another one When hand AT when raises 0 a
21. board cards are present in the hole for the bot A pair on board does not count as one of the pairs Ace is highest Restrictions Post flop only HaveFlush True if the bot has a made flush For Holdem a flush on board does count as a made flush Restrictions Post flop only HaveFlushDraw True if the bot has a made flush or a flush draw Restrictions Post flop only HaveFullHouse True if the bot has a made full house Any playable full house can consist of only one card in the case of two pair on board or play the board on the river if a full house in on board Restrictions Post flop only HavelnsideNutStraightDraw True if the bot has an inside nut straight draw An inside nut straight draw is defined as a hand with at least 4 outs to a nut straight Unlike NutStraightDraw outs that make a flush possible are not excluded Note that this condition is also true when HaveNutStraightDraw is true Restrictions Post flop only HavelnsideStraightDraw True if the bot has a made straight or an inside straight draw An inside straight draw is defined as a hand with at least 4 outs to a straight Note that this condition is also true when HaveStraightDraw is true Restrictions Post flop only HaveLow True if the bot has a made low using the current board cards Restrictions Post flop only Can only be true in Omaha 8 games HaveNothing True if the bot has no pair no trips no straight no straight draw no inside straight draw
22. for more than one raise as that will always be more than am willing to call Copyright 2008 2013 Shanky Technologies P hank n Techhologies Page 138 TEL 3 5 7 Using the StackSize Variable for NL Games There are several ways to incorporate stack size recognition into your preflop custom profile using the StackSize variable One is to simply assign it a numerical value for making action decisions probably calling or raising actions when your stack is getting low Here is an example of that When StackSize lt 20 When hand AA or hand KK or hand QQ or hand JJ or hand TT or hand 99 or hand 88 or hand 77 or hand AK or hand AQ or hand AJ suited or hand KQ suited RaiseMax force When StackSize lt 15 When hand 66 or hand 55 or hand 44 or hand 33 or hand 22 or hand AJ or hand AT or hand A9 suited or hand KQ RaiseMax force When StackSize lt 10 When hand A suited or hand KJ suited or hand QJ suited or hand JT suited or hand T9 suited or hand 98 suited RaiseMax force When StackSize lt 7 When hand A or hand K suited or hand 87 suited or hand 76 suited RaiseMax force Remember the numerical value for StackSize is the number of big blinds This code defines which hands to push with as your stack gets shorter and shorter and is of tremendous use in all tournament situations You should put this at the top of your entire custom preflop code as it is an exception to eve
23. get down to heads up play without having to restate those actions It s just the weaker hand groups that get added as the player count is reduced We also left off the when others when others fold command at the end allowing the bot to play a reasonable game from its default programming for other playable situations that are not covered The result is a very usable 1 table SNG code especially for the Turbo style games 3 5 6 Programming for Hand Groups Now we are getting into the building blocks for designing an entire playing profile As you have already learned using multiple when conditions in a statement is the best way to code all possible actions for a hand or group of hands You can do this just for certain hands that you want played differently than you can set them on the option menu or you can design an entire playing profile hand by hand Here is an example of creating a code for playing middle suited connectors in Limit games When hand T9 suited or hand 98 suited or hand 87 suited When BotsLastAction raise call force When calls 1 or calls 2 and raises 0 call force When calls lt 2 and raises gt 1 fold force Copyright 2008 2013 Shanky Technologies 9 hank 5 Technologies Page 137 E P L POKER PROGRAMMING LANGUAGE When calls 3 and raises lt 1 call force When calls 3 and raises gt 1 fold force When calls gt 4 call force When calls 0 and raises 0 and Still ToAct lt 3 raise force
24. max if available Will bet min if no other bet option is available Will call if bet option is not available Note that Bet is never available pre flop BetMax will bet max if button is available otherwise will bet pot if available Will bet min if no other bet option is available Will call if bet option is not available Note that Bet is never available pre flop SitOut will sit out of the game and discontinue playing Once invoked there is no way to sit back in Copyright 2008 2013 Shanky Technologies 9 hank 5 Technologies Page 115 r P L POKER PROGRAMMING LANGUAGE User Defined Variable A user defined variable explained in section 3 2 5 below is a special action that can appear wherever an action can appear If the action for a matching when condition is a user defined variable the result is simply to set the value of the user defined variable to true Unlike other actions execution continues to the next PPL statement after setting the variable to true If any other action is executed no more PPL statements are looked at The force keyword can be used after an action Using force causes the bot to ignore all user settable option settings that may otherwise cause it to behave differently For example When hand AQ Call force Will cause the bot to call when holding AQ irrespective of the number of raises even if the option to Fold for Pre Flop Raises for AQ AJs amp KQs is set If the force keyword is omitted then t
25. no flush no flush draw no backdoor flush draw and if overcards 2 is also false This variable only applies to high hands in Omaha Hi Lo and disregards made low hands or low draws so should not be used in Omaha Hi Lo Restrictions Post flop only HaveNutFlush True if the bot has the highest possible flush with the current board cards For Holdem a royal straight flush on board does count as a made nut flush Note that nut flushes could be beaten by full houses four of a kind and straight flushes Restrictions Post flop only HaveNutFlushCard True if a flush is possible based on the current board cards and one of the bot s hole cards is the card required for a nut flush The bot may not have a made flush but since it is holding the nut flush card nobody else can have the nut flush either For example if the board is Ac Qc 3c then the nut flush card is Kc Restrictions Post flop only HaveNutFlushDraw True if the bot has a made nut flush or a nut flush draw Restrictions Post flop only Copyright 2008 2013 Shanky Technologies al hank ss Techhologies Paee 174 P P L POKER PROGRAMMING LANGUAGE HaveNutLow True if the bot has the best possible low using the current board cards Restrictions Post flop only Can only be true in Omaha 8 games HaveNutLowBackdoorDraw True if the bot has the nut low backdoor draw This variable is true only if there is only 1 low card on board such that if two new low cards are dealt out without cou
26. not coding a complete profile you don t need to bother coding the subsequent raise with strong hands as the bot s default programming will do that once the bet count is above zero The above code snippet is a good example of this Notice how you defined two separate types of conditions there neither of which bother to first define a board state The first one simply identified that there were preflop raises and you were the last aggressor and the second one only concerned yourself with position and holding a very strong hand although SuitsOnBoard 3 does define a board state for one of the actions A natural progression for this type of simple customizing as needed approach would be to find situations where you want to be more cautious on the Turn and value bet the River more After a few days of watching coding watching and coding you will likely have a profile that performs exactly as you want without having to spend weeks creating 3 000 lines of code On the other hand if you are out to build your own complete profile from scratch it is probably going to be easiest to organize your post flop code by board state and then code for all your possible conditions under them by using the when condition without an action approach 3 6 1 Defining the Board State Way back in section 3 2 1 we introduced you to board specific conditions where you can specify cards on the board We used it in the above example a bit as a reminder This d
27. raise call force When In SmallBlind and raises 0 and calls gt 1 call force When In BigBlind and OpponentsAtTable lt 2 and raises 1 and calls 0 call force When raises 0 and calls 0 and OpponentsAtTable 1 raise force When others fold force When Hand 75 suited or hand 64 suited When BotsLastAction raise call force When BotsLastAction call and calls gt 6 call force When In SmallBlind and raises 0 and calls gt 1 call force When In BigBlind and OpponentsAtTable 1 and raises 1 call force When raises 0 and calls gt 5 call force When raises 0 and calls 0 and OpponentsAtTable 1 raise force When others fold force When hand J suited or hand T suited When BotsLastAction raise call force When BotsLastAction call and calls gt 6 call force When In SmallBlind and raises 0 and calls gt 1 call force When In BigBlind and OpponentsAtTable 1 and raises 1 call force When raises 0 and calls gt 6 call force When raises 0 and calls 0 and OpponentsAtTable 1 raise force When others fold force When Hand 96 or hand 86 or hand 76 or hand 65 When BotsLastAction raise call force When In SmallBlind and raises 0 and calls gt 1 call force When In BigBlind and OpponentsAtTable 1 and raises 1 call force When raises 0 and calls 0 and OpponentsAtTable 1 raise force When others fold force When hand 95 or hand 85 or hand 75 When In SmallBlind and raises 0 and ca
28. s own It uses the raise count in it s log to assess the situation So you need to get used to that concept when creating code for dealing with actions after the bot acts on the same betting round Here is another example of figuring out pre flop position This will be for hands that you want to raise with from the cutoff seat or button when folded to and then fold for a re raise When hand A suited or hand A9 or hand K9 suited or hand Q9 suited When In SmallBlind and raises 0 call force When raises 0 and calls 0 and Still ToAct lt 3 raise force When raises 1 fold force This code combines several of the elements we have just discussed By coding the small blind exception first you can make sure it only calls with these hands from that position even when folded to if you insist on playing that weak By stating calls 0 and raises 0 you know that nobody else has entered the pot yet it s either been folded to you or so many people are sitting out that you are first to act from the cutoff The Sti ToAct variable gives you the number players behind you that have not acted yet and with 3 or less you can only be in the cutoff button or small blind What if you don t want to play these hands the same way in a short handed pot such as a table with only a few players or maybe a full ring game with most players sitting out In other words you want to make sure there have been some folds in front of you That is easily done by
29. that it puts in the first raise If put that line last it wouldn t get executed because code is read in sequential order and the first match is executed know this because am only raising into 3 or less Stil ToAct opponents and will only call a raise with 3 or more callers in the pot so there couldn t be enough callers if somebody re raised me By putting this line first it handles the exception for raises behind me that want Remember to always put exceptions at the beginning of your statements Note that don t want any blind exceptions for this hand group Now let s change that piece of code for a NL game and use the when others catchall to finish it When hand T9 suited or hand 98 suited or hand 87 suited When BotsLastAction raise and BetSize lt 8 call force When calls 1 or calls 2 and raises 0 call force When calls lt 2 and raises 1 and BetSize gt 4 fold force When calls lt 2 and raises 1 and BetSize lt 4 call force When calls gt 3 and raises 1 and BetSize lt 6 call force When calls gt 3 and raises 1 and BetSize gt 6 fold force When raises gt 1 fold force When calls 0 and raises 0 and Still ToAct lt 3 raise force When others call force Here have plugged in how big of a raise am willing to call preflop also based on the number callers and it s good to go for NL PL games Note that was able to change into simply for 1 raise being that am just going to fold
30. the bot has invested into the pot for this hand as a percentage of the PotSize or StackSize For example Copyright 2008 2013 Shanky Technologies 9 hank 5 Technologies Page 112 r P L POKER PROGRAMMING LANGUAGE TotalInvested gt 100 StackSize The above condition would be true when the total money invested into the pot in this hand is more than 10096 of the bot s remaining stack That is the remaining stack size is less than the amount already invested in this pot You may want to program the bot to call all further bets in this situation Another popular use is to identify the depth of a live opponent s stack size using MaxOpponentCurrentStacksize For example MaxOpponentCurrentStacksize gt 100 StackSize The above condition would be true when every opponent still in the hand currently has at least as many chips as you do Similarly MaxOpponentCurrentStacksize lt 20 StackSize means every opponent still in the hand has a short stack compared to yours less than 2096 5 Position Conditions This is a special set of conditions designed to specify the bot s position This can be of the form In Position Where Position can be BigBlind SmallBlind or Button For example In BigBlind This condition would be true when the bot is in BigBlind Note that the above conditions can be used post flop also When used post flop they refer to the position of the bot before the flop Note that the StillToAct Variable can also b
31. this situation However if the board is KQJ then the two ways to make a straight are with an AT or with a T9 so this variable will be false in this situation Restrictions Post flop only OpponentCalledOnFlop True if at least one opponent called on the flop and no opponent bet or raised Restrictions Turn and River only OpponentCalledOnTurn True if at least one opponent called on the turn and no opponent bet or raised Restrictions River only OpponentlsAllin True if any opponent has gone all in at any point in the current hand including the current betting round Others Always True PairlnHand True if the bot has a hole pair Also true if the bot has two pair trips or quads in the hole PairOnBoard True if there is a pair on board This will also be true if there are two pair trips quads or a full house on board Restrictions Post flop only PairOnFlop True if there is was a pair on board on the flop Restrictions Post flop only Copyright 2008 2013 Shanky Technologies A hanky P P Technologies Page 77 PPL PairOnTurn True if there is was a pair on board on the turn Restrictions Turn and River only QuadsOnBoard True if there is a four of a kind on board Restrictions Post flop only QueenPresentOnFlop True if there is a queen present on board which was dealt on the flop Restrictions Post flop only RaisesBeforeFlop This is true if any opponent raised before the flop Raises by the bot ar
32. to The variable is stated as Copyright 2008 2013 Shanky Technologies hank Techhologies r P L P a g e 19 POKER PROGRAMMING LANGUAGE Opponent z It will accept values consisting of any combination of these characters Upper case letters Lower case letters Numbers Dashes Underscores _ The variable is true if there is a match for your value with any opponent screen name in the current hand who still has cards in front of them It can be used on any betting round and user defined variables can be set from long codelines identifying multiple screen names However the best use is probably on post flop betting rounds or second orbit situations preflop when you can couple it with opponents 1 Notice how the opponents variable is only one digit different so be sure not to confuse it with the opponent variable Using the opponent name variable provides a way for you to utilize stats gathered on opponents from tracking software such as Poker Tracker Holdem Manager etc You can also simply use screen names from opponents you have personally observed and want to play a certain strategy against By being able to use their screen name as a variable it doesn t matter which stat software you use or even if you acquired a list from somebody else who gathered the stats You also can run the bot without the stat gathering software running in the background which would be quite taxing on PC resources Examples when opponent eg
33. 2 3 K suited or hand 224 5 or hand 2 3 6 or hand 224 5 6 and not hand KKK or hand QQQ RaiseMin force When In BigBlind and BetSize lt 1 and StackSize gt 15 call force When In SmallBlind and StackSize gt 15 and raises 0 and calls gt 1 and hand A or hand KK or hand QQ or hand JJ or hand KQJT or hand KQJ9 or hand KQT9 or hand KJT9 or hand KQJT or hand KQJ9 or hand KQT9 or hand 234 or hand 235 or hand 245 or hand 246 or TwoPairInHand call force When TripsInHand and not hand AA fold force When StackSize gt 75 and raises gt 1 and BetSize gt 10 When not hand AA or hand A2 or hand Asuited34 or hand Asuited35 or hand Asuited36 or hand Asuited45K or hand A34K or hand A35Ksuited or hand A36Ksuited or hand AKsuited45 or hand A345 or hand A346 or hand Asuited456 or hand A34Qsuited or hand A35Qsuited or hand KKQQ or hand A KK suited fold force When not hand A suited or hand J suited and hand A289 or hand A228 or hand A229 or hand A22T or hand A28T or hand A29T or hand A222 or hand A279 or hand A27T or hand A27J or hand A28J or hand A29J fold force When StackSize lt 12 When hand AA or hand A2 or hand A suited 3 or hand A3 4 or hand A35 or hand A36 or hand A 3 K suited or hand A45 or hand A suited 4 6 or hand A suited 5 67 or hand AK suited 4 6 or hand KK QQ or hand KK JJ or hand QQ JJ or hand A suit
34. AK and face a raise from a player who open raised in late position This codeline forces the bot to wait an extra 5 seconds before calling which might lead your opponent to believe you had to think about whether or not to call and therefore do not hold as strong of a hand as you actually have Here is another example from the flop When haveset and opponents 1 and bets 1 and raises 0 and betsize lt 10 call force delay 7 Here you flopped a set and are heads up on the flop in last position against one opponent who bets into you This codeline forces the bot to wait an additional 7 seconds before calling which might result in the opponent concluding that your hand is weak and inspiring them to make another bet on the Turn Please note the added time delay is in addition to the existing random 1 3 second built in time delay In some games especially speed poker type structures waiting too long before acting could actually cause you to time out fold the hand and be seated out So don t go overboard and use this feature wisely Copyright 2008 2013 Shanky Technologies P hank a3 Technologies Page 132 E P L POKER PROGRAMMING LANGUAGE 3 4 Preflop Coding Preflop PPL code must begin with the single word preflop all by itself on a single line It is logical to start with preflop custom coding so the beginning of your custom profile code should look like this custom preflop Then you can start making statements which define con
35. AtTable lt 3 raise force Copyright 2008 2013 Shanky Technologies A hank E Techhologies P P L P a g e 30 POKER PROGRAMMING LANGUAGE So now at short handed tables with three or less opponents sitting in you will play back aggressively half the time when you are in the big blind facing a raise and holding KJ QJ or AT Random Variable There is also a random variable that can be used which is a number chosen to represent a percentage of time that you want to take a certain action This numeric valued variable is simply written as Random It returns a random number between 1 and 100 inclusive It works like this When Random lt 75 true 7596 of the time When Random gt 75 true 25 of the time When Random 2 75 true 1 of the time When Random lt 100 always true Here is an example of it s use Flop When bets 0 and raises 0 and position first and opponents lt 3 and not flushpossible or board KK or board QQ or board JJ or board TT and haveoverpair and random lt 35 call force That code will check 3596 of the time you flop an overpair in first position against 3 or less opponents when a flush is not possible and a large pair is not on board You could then code a line to check raise with this hand if Somebody bets like this When bets 1 and raises 0 and position first and betsize lt 12 stacksize and not flushpossible or board KK or board QQ or board JJ or board TT and h
36. KK and the board is AAK the above variable evaluates to 3 This is because in this case AAAA is the 1 nut hand AAAKK is the 2 nut hand and our hand AAKKK is the 3 nut hand Restrictions Post flop only Opponent opponent screen names who still have cards in front of them on the current hand This variable accepts user created custom values which can consist of any combination of upper and lower case letters numbers dashes and underscores Only the equal sign can follow the word opponent Use it to identify certain opponents whom you know or whom you have stats on and want to adjust your play for You can group together large lists of opponent names separated by the or operator inside of brackets You can also set user defined variables from those lists This variable can be defined and used on any betting round Restrictions iPoker Rooms only Opponents the number of all live opponents or everyone who has not yet folded or has gone all in on a prior betting round This includes calls and raises in front of you as well All in players on a prior betting round are not counted OpponentsAtTable only the starting number of players currently sitting in useful for late stages of tournaments OpponentsLeft same exact variable as opponents above but describes it a little better use either OpponentsOnFlop the number of live opponents still in the hand at the beginning of the flop before there was any betting action on the f
37. NutLow or have2ndnutlow and NutFullHouseOrFourOfAkind 3 or NutFullHouseOrFourOfAkind 0 fold force When QuadsOnBoard and not hand AA or hand KK fold force When HaveNutLow When opponents gt 3 RaisePot force When HaveFlush or HaveStraight or HaveSet or HaveTrips or HaveQuads or HaveFullHouse or HaveTwoPair or HaveTopPair RaisePot force When StackSize lt 8 When BotsLastAction raise or BotsLastAction bet RaisePot force When not In BigBlind or In SmallBlind RaisePot force When LowPossible and not WheelPossible and not PairOnBoard and not FlushPossible and not board 236 or board 246 or board 256 or board 346 or board 356 or board 347 or board 357 or board 367 or board 457 or board 467 and opponents 1 When HaveLow and HaveTopPair and HaveBestKicker RaisePot force When HaveLow and HaveSet RaisePot force When HaveLow and HaveT woPair RaisePot force When HaveLow and HaveStraight RaisePot force When HaveLow and not HaveNutLow and HavePair and BetSize lt 50 StackSize call force Copyright 2008 2013 Shanky Technologies hanky P P L Technologies Page 183 When opponents and not PairOnBoard When Have2ndNutFlush RaisePot force When raises gt 1 and HaveNutLow and not HaveFlush or HaveStraight or HaveSet or HaveTwoPair or havepair call force When opponents 2 and not PairOnBoard When not FlushPossible and HaveTwoPair and HaveTopPair and HaveLow and raises 0 call
38. OnFlop True if the bot called on the flop Not true if the bot only checked bet or raised on the flop However this is true even if the bot bet or raised was raised or re raised and then called on the flop Restrictions Post flop only CalledOnTurn True if the bot called on the turn Not true if the bot only checked bet or raised on the turn However this is true even if the bot bet or raised was raised or re raised and then called on the turn Restrictions River only DoubleSuited True if the bot s four hole cards in Omaha consist of exactly two cards of one suit and two cards of another suit This is not the same as suitsinhand 2 because that could be true with three of one suit and one of another Restrictions Omaha Bots only FlushOnBoard True if all the board cards on the River are the same suit Restrictions River only FlushPossible True if a flush can be made with the current board cards Restrictions Post flop only FlushPossibleOnFlop True if a flush is was possible on the flop Restrictions Post flop only FlushPossibleOnTurn True if a flush is was possible on the turn Restrictions Turn and River only FourCardStraightInHand True if the bot has 4 cards in sequence in the hole For example this variable is true if the hand is 5678 Restrictions Can only be true in Omaha games FourCardsToWheelOnBoard True if a wheel can be made by using only one hole card A wheel is A2345 Restrictions Post flop only
39. Possible or OneCardStraightPossible or board QJT or board KJT or board KQT or board AJT or board AKT or board AQT or board KQJ or board AKQ or board AQJ or board AKJ As you can see most of your opponent s likely straight and two pair holdings have been eliminated in that condition This makes it quite a bit safer to re raise big with an overpair 3 6 2 Using the not Operator We warned you earlier that there are some pitfalls to watch out for when using notto define board states The main thing you have to be careful of is combining it with the or operator in a way that will cause the stated action to take place when any of the conditions is true when in actuality what you want is for all the conditions to be true when the desired action takes place Here is an example Wrong Way When PairOnBoard and FlushPossible when not HaveFullHouse or not HaveQuads or not HaveFlush fold force Copyright 2008 2013 Shanky Technologies 5 s hanky P P Technologies Page 150 L POKER PROGRAMMING LANGUAGE The problem with that piece of code is not obvious and it has to do with the reverse logic of the not operator Whatl will happen as a result of this code is the bot will fold a full house or even four of a kind if it does not also have a flush Why Because you used the or operator in conjunction with the not operator in a way that told the bot any of those conditions can be true for it to fold So you have quads but the
40. Shanky Technologies P3 hank Techhologies Page 15 PPL This also opens up a whole new community of users who enjoy creating trading and sharing their own custom profiles even selling them if they want If this sounds like fun be sure to join our forum so you can get in on all the action Profile Format Custom profiles are created and saved as simple text files Please make sure you have downloaded the Holdem Bot and have read sections 1 through 3 of the Holdem Bot User Manual before proceeding any further in this guide You should also have at least played around with the 200 free hands a little and have practiced loading alternative profiles Section 2 of the Holdem Bot User Manual explains the use of profiles If you need a profile to practice loading try the MTT version of the Doodle profile which you can get here www bonusbots com mtt txt You will need to copy all of the above code paste it into an empty text profile and save it in accordance with the instructions in section 2 of the Holdem Bot User Manual in order to load it into the bot You can use Notepad the text editor that comes with Windows to open tweak create and paste in and save profiles If you download an existing text profile from our support forum and then double click to open it it is likely Notepad will automatically open it on your PC If not you should manually open Notepad and then use that to open any saved profile Notepad is probably located in
41. able to the public In spite of their sophistication they have always been extremely user friendly Originally our bot was only customizable with the simple option menu on the bot menu itself which contains many settings the user can adjust to have the software play in a specific way for different game environments Many large tournaments have been won completely unassisted this way many deposit bonuses have been cleared and much rakeback earned As our products developed and continually improved we eventually reached a plateau where we really couldn t improve upon their play by adding more new features and user options The only logical path forward was to move in a direction of making the bot totally user configurable without removing the already proven successful programming and user option list This was not an easy task but that has never stopped us before There are literally thousands of possible poker situations and hundreds of variable elements which create those situations What we came up with as a solution is a simple programming language that anyone can use which includes the variables that our bot uses to categorize the information it gathers from the poker table The code is easy and the list of variable elements and action commands is short The purpose of this guide is to show you how to use it Thus we believe we have kept the product user friendly while greatly expanding upon its possible playing styles Copyright 2008 2013
42. ample of setting the user variable on a later betting round The code below will identify a situation where on the Turn the board is all low cards and then a face card or ace lands on the River and the opponent bets turn when not board A or board K or board Q or board J or flushpossible or straightpossible UserLowTurn river when bets 1 and raises 0 and board A or board K or board Q or board J and UserLowTurn and not amounttocall lt 30 potsize or amounttocall lt 2 or havetoppair or haveoverpair or havetwopair or havetrips or haveset or havefullhouse or havequads or haveflush or havestraight or nobettingonturn fold force in this case we decided to fold hands below top pair in value if the bet size was not small While the user defined variable can really come in handy keep in mind that it is a bit of an advanced feature and using it is not necessary for creating good profiles Plenty of winning profiles were created before we developed it We suggest you get familiar working with the standard variables first before dabbling in user variables and incorporating them only as you see fit Most of the better profiles only use a few of these if any 3 2 6 Opponent Name Variable This is a numeric valued variable with user created custom values that can be used to identify the screen name of individual opponents you are playing against See the appendix for the current list of poker rooms this feature is restricted
43. amples to see what am talking about When In Button and raises 0 and calls 0 raise force If you are a borderline maniac who always wants to raise on the button when folded to no matter what cards you have you might want to start your code with that statement Now let s look at an example of a statement for coding by custom defined position in this case under the gun When raises 0 and calls 0 and folds 0 and Still ToAct gt 7 When hand AA or hand KK or hand QQ or hand AK RaisePot force When hand AQ suited or hand AJ suited or hand JJ or hand KQ suited call force When others fold force The above statement will tell the bot to only play the specific listed hands when under the gun in full ring games with 7 live opponents behind you Coding for position like this is something you might want to do if you have some regular settings on our bot that you like except you just want to change how it plays in certain positions For example if you just want it to tighten up when in the first two positions Coding for second position UTG 1 is slightly more complicated though because you now have to account for different possible actions by the UTG player When raises 1 and calls 0 and folds 0 and Still ToAct gt 6 When hand AA or hand KK RaisePot force When raises 1 and BetSize lt 8 and calls 0 and folds 0 and StillToAct 2 6 When hand QQ or hand or hand AKs RaisePot force When hand AQ
44. and 33 or hand 22 or hand KQ When OpponentsAtTable lt 2 and raises 0 and calls lt 1 RaiseMax force When hand A or hand QJ suited or hand JT suited or hand T9 suited or hand 98 suited or hand 87 suited or hand 76 suited or hand KJ suited When OpponentsAtTable lt 2 and raises 0 and calls 0 RaiseMax force When hand K suited or hand KJ or hand KT or hand QJ or hand QT or hand JT or hand T9 and raises 0 and calls 0 and OpponentsAtTable 1 RaiseMax force If you are still a little confused about this you should study the above code and see how it changed from the previous one Aside from combining our earlier code all the statements now have an OpponentsAtTable requirement and that requirement keeps getting smaller wanting less players as we add the weaker hand groups That way the bot starts pushing more as the game gets more and more short handed Note that the hand group which starts with hand A any ace no longer needs the Stil ToAct variable as there cannot be more than 3 opponents StillToAct when a maximum of two are sitting at the table in the first place so it has been removed It s also important to understand that because we used the lt comparator each statement includes the situations underneath it as well This is because we started coding for more opponents and worked our way into less and less opponents That way the bot still raises max with the better hands even when you
45. and KK or hand QQ or hand AK User3Raises When User3Raises fold force In the above example the user defined variable called User3Raises is set whenever the opponent raise count is more than 2 and we don t hold a premium starting hand The next statement then causes a fold to happen when that condition is found true This is a simple example just meant to explain the abbreviation nature of the user variable Here is an example that shows the importance of logical placement of the user defined variable in your code preflop When UserKK raisemax force When hand KK UserKK When UserKK raisepot force Copyright 2008 2013 Shanky Technologies F1 s hanky P P Technologies Page 117 PPL The above pre flop code will cause the bot to RaisePot the first time the bot acts when holding KK however if someone raises afterward and the action comes back it will then go all in by executing the RaiseMax action It is important to understand why the RaiseMax action above can only happen if there is a raise behind the bot after it acts the first time The UserKK variable is not set yet on the RaiseMax action line the first time around so it is not found as true The next line actually sets the variable If somebody reraises after we act the variable will be then have been set and will be found true for the RaiseMax codeline which is read first In this next example we will define absolute pre flop table position that we can use later in the ha
46. and HaveNutLowDraw RaisePot force When not LowPossible and not FlushPossible and not StraightPossible and HaveNutFlushDraw and HaveStraightDraw and BetSize lt 50 StackSize call force When TwoPairOnBoard and not HaveNutLowDraw and NutFullHouseOrFourOfAkind gt 3 or NutFullHouseOrFourOfAkind 0 fold force When TripsOnBoard and not HaveNutLowDraw and NutFullHouseOrFourOfAkind 3 or NutFullHouseOrFourOfAkind 0 fold force When QuadsOnBoard and not hand AA or hand KK fold force When HaveNutLow When opponents gt 3 RaisePot force When HaveFlush or HaveStraight or HaveSet or HaveTrips or HaveQuads or HaveFullHouse or HaveTwoPair or HaveTopPair RaisePot force When StackSize lt 8 When BotsLastAction raise or BotsLastAction bet RaisePot force When not In BigBlind or In SmallBlind RaisePot force When StackSize gt 75 and BetSize gt 15 When PairOnBoard and not HaveFullHouse or HaveNutLow fold force When not PairOnBoard and FlushPossible and not HaveNutFlush or HaveNutLow fold force When not PairOnBoard and not FlushPossible and StraightPossible and not HaveNutStraight or HaveNutLow fold force Copyright 2008 2013 Shanky Technologies hank Technologies rP P L P a 2 e 82 POKER PROGRAMMING LANGUAGE When not PairOnBoard and not FlushPossible and not StraightPossible When HaveTwoPair and HaveNutLowDraw and bets 0 BetPot force When HaveTwoPair and HaveNutLowDraw and StackSize
47. and calls gt 1 call force When In BigBlind and raises 1 call force When raises 0 and calls 0 and opponents lt 2 raise force When raises 0 and calls gt 3 call force When others fold force When Hand Q6 suited or hand Q5 suited or hand Q4 suited or hand Q3 suited or hand Q2 suited When BotsLastAction raise call force When BotsLastAction call and calls gt 5 call force When In SmallBlind and raises 0 and calls gt 1 call force When In BigBlind and raises 1 call force When raises 0 and calls 0 and opponents 1 raise force When raises 0 and calls gt 4 call force When others fold force When Hand 87 suited or hand 76 suited When BotsLastAction raise call force When BotsLastAction call and calls gt 3 call force When In SmallBlind and raises 0 and calls gt 1 call force When In BigBlind and raises 1 call force When raises 0 and calls 0 and opponents lt 2 raise force When raises 0 and calls gt 2 call force When calls gt 4 call force When others fold force When Hand 65 suited or hand 54 suited When BotsLastAction raise call force When BotsLastAction call and calls gt 3 call force When In SmallBlind and raises 0 and calls gt 1 call force When In BigBlind and raises 1 call force When raises 0 and calls gt 3 call force When raises 0 and calls 0 and OpponentsAtTable 1 raise force When calls gt 4 call force When others fold force When Hand
48. ard K or board Q and HaveTrips and HaveBestKicker and raises gt 1 call force When opponents gt 2 and position first and bets 0 When not FlushPossible or PairOnBoard and HaveNutStraight call force When not PairOnBoard and HaveNutFlush call force When not QuadsOnBoard or TripsOnBoard or TwoPairOnBoard and HaveFullHouse call force When not FlushPossible or PairOnBoard or StraightPossible and HaveSet call force When opponents gt 2 and position first and bets gt 1 When not FlushPossible or PairOnBoard and HaveNutStraight RaiseMax force When not PairOnBoard and HaveNutFlush and not StraightFlushPossibleB yOthers RaiseMax force When not QuadsOnBoard or TripsOnBoard or TwoPairOnBoard and HaveFullHouse RaiseMax force When not FlushPossible or PairOnBoard or StraightPossible and HaveSet RaiseMax force When opponents 1 and position first and bets 0 and raises 0 and NoBettingOnFlop When not OneCardFlushPossible or OneCardStraightPossible or HaveBestKickerOrBetter and hand 2 or hand 3 or hand 4 or hand 5 or hand 6 or hand 7 Bet 70 force When opponents 1 and position first and bets 1 and raises 0 and BetSize lt 7 and NoBettingOnFlop When not OneCardFlushPossible or OneCardStraightPossible or PairOnFlop and hand 8 or hand 9 RaisePot force When Betsize lt 30 potsize and HaveBestKickerOrBetter call force When opponents 1 and position last and bets 1 and raises 0 and Betsiz
49. as LastCallerPosition above except for identifying the position of a raiser if any Especially useful when there has been only one raise and you are in the blinds or are in late position and want to know which position it came from Restrictions First action preflop only LowCardsInHand The number of unique low cards in your hand An ace is counted as a low card and duplicates are not counted For example in Omaha if our hand cards are AA39 this will evaluate to 2 For us to be able to make a low in Omaha Hi Lo LowCardsInHand must be gt 2 LowCardsOnBoard The number of unique low cards on board An ace is counted as a low card and duplicates are not counted For example in Omaha 8 if the board on the turn is AA39 this will evaluate to 2 For a low to be possible in Omaha Hi Lo LowCardsOnBoard must be 3 Restrictions Post flop only MaxCurrentOpponentStackSize The number of big blinds that the live opponent who is still in the hand and not yet folded with the largest current stack has in his stack at the moment when it is the bot s turn to act Can be used on the left of the comparators to compare to your own stack size and is useful for identifying short stacked opponents or determining that all the live opponents have your stack covered Can be used preflop or post flop MaxOpponentStackSize The number of big blinds that the opponent at your table with the largest stack has in his stack at the beginning of the hand before b
50. as the game winds down if you are still there you would likely want to start getting aggressive and perhaps even start playing the above profile For example you might be perfectly content to play according to your option settings until it gets short handed and then have the above profile kick in This can easily be accomplished by removing the when others command at the bottom and inserting the OpponentsAtTable variable requirement for all your statements 3 5 5 Taking this one step farther We can combine our earlier code where we set up trapping for early positions and eliminated some of the blind stealing hands we didn t want into the whole thing and end up with this code custom preflop When hand J8 or hand J7 or hand Q7 fold force When hand K7 or hand 22 or hand 33 or hand 44 and Still ToAct gt 3 fold force When hand AA or hand KK When raises 0 and Still ToAct gt 7 call force Copyright 2008 2013 Shanky Technologies le hank T Techhologies Page 136 TEL When raises gt 1 RaiseMax force When hand AA or hand KK or hand QQ or hand JJ or hand TT or hand 99 or hand AK or hand AQ suited When OpponentsAtTable lt 4 RaiseMax force When hand A suited or hand KQ suited or hand AQ or hand AJ or hand 88 or hand 77 or hand 66 or hand 55 When OpponentsAtTable lt 3 and raises 0 RaiseMax force When hand AT or hand A9 or hand A8 or hand A7 or hand 44 or h
51. aveoverpair raisepot force By using the lt connector you can just specify what percent of the time you want to take a certain action in the given situation with the number you use This is the simplest way to code randomized actions Randomizing some of your play is critical for successful short handed play in my opinion and it s why our bot does this by default with certain hands 3 3 13 Comments Comments can be inserted into the code by using a double forward slash before the comment and the rest of the line will be ignored by the bot Comments are generally used to give an explanation of the code you are writing They can also be used to temporarily remove code from your profile Here is an example Comments are shown in green When hand 7d 2 suited start a new hand group This is a when condition without an action hence statements below are indented when calls 0 and raises 0 and folds gt 4 raise 2 force because I want to mix up my game when calls lt 2 and folds gt 4 and raises 1 RaisePot force because I want to play like a total donk and make them laugh when I show seven deuce Copyright 2008 2013 Shanky Technologies P hank Techhologies Page 131 r P L POKER PROGRAMMING LANGUAGE Here is another example When hand 7d 2 suited start a new hand group This is a when condition without an action hence statements below are indented when calls 0 and raises 0 and folds gt 4 raise 2 force be
52. bot has a straight draw which has at least 12 outs to a straight Can also be possible when the bot has a made straight already Restrictions Post flop only Can only be true in Omaha games Have16OutStraightDraw True if the bot has a straight draw which has at least 16 outs to a straight Can also be possible when the bot has a made straight already Restrictions Post flop only Can only be true in Omaha games Have2ndBestKicker True if the bot has the 2 best kicker or the best kicker with the current board cards to clarify this variable is also true when havebestkicker is true The 2 d best kicker is defined as the 2 highest valued card not currently present on the board The best kicker is defined as the highest valued card not currently present on the board Ace is highest Restrictions Post flop only Have2ndBestKickerOrBetter True if the bot has a made hand which is 2 best kicker or better given the current board cards The or better part refers to any better hand values such as a pair two pair etc and not just a better kicker Restrictions Post flop only Have2ndBestOverpairOrBetter True if the bot has a made hand which is 2 best overpair or better given the current board cards 2 best overpair is KK with no A or K on board The or better part refers to any better hand values such as a pair two pair etc and not just a better overpair Restrictions Post flop only Have2ndNutFlush True if the bot has the 2
53. bot reads that if it doesn t have a full house or if it doesn t have quads or if it doesn t have a flush it should fold and you don t have a flush so it folds To put it another way you specified three possible conditions any of which being present should make the bot fold You can t combine or conditions together when using the not operator in the same manner that you do when not using the not operator Because this is easy to get tripped up on have developed a red letter rule that if followed should keep you out of trouble When combining or conditions while using the not operator enclose the or conditions in brackets with a single not operator left outside the brackets Using the red letter rule you would rewrite the above incorrect code like this Right Way When PairOnBoard and FlushPossible When not HaveFullHouse or HaveQuads or HaveFlush fold force At first glance this may not look any different from an instructional standpoint than the previous code However the bot reads this instruction differently and will behave as intended By bracketing the conditions together after using a single not operator you are in effect making them like one condition instead of three separate ones They have been tied together so the action will not be triggered if any one of them are true whereas in the wrong way example they were three separate conditions any one of which would trigger the action if were true Don t worry if this is still conf
54. cause I want to mix up my game when calls lt 2 and folds gt 4 and raises 1 RaisePot Y no longer want to play like a total donk and so have commented out the above line I have not deleted it in case I want to play like a donk again in the future In that case I will just uncomment that line Please note that line breaks do matter when it comes to comments Any time you start a line with that entire line will be ignored and if the comment carries over to another line like in the above example the beginning of that continuation line must also start with the comment queue 3 3 14 Customizable Time Delay Shanky Technologies poker bots have a built in randomized time delay of 1 to 3 seconds before acting We feel this is appropriate for most situations looks normal and doesn t hold up the game However there may be certain situations when delaying your action further is desirable For example when you hold a very strong hand and want to appear as though you are deliberating before acting In this case you can add the word delay followed by a space and then a number at the very end of your codeline after your action is specified This will cause the bot to wait an additional amount of time specified in seconds by your number before acting Here is a preflop example When in bigblind and raises 1 and calls 0 and lastraiserposition lt 4 and hand AK call force delay 5 In this situation you are in the big blind holding
55. ce of code as it doesn t also define the action at the table your position or the number of opponents in the condition But it shows you a logical order for writing your post flop code which follows the same type of order as preflop coding by hand groups If you are creating a small code just to adjust for certain situations you only need to concern yourself with those situations as you will simply let your option settings handle the rest We really believe that this is the best way to code a custom profile for our poker bots Just watch the bot play for a few hours take notes see what you cannot adjust to your liking from the option settings and create code snippets as needed An example might be if you want to ease up just a bit on the automatic flop continuation bets when the bot was the last preflop aggressor You might write a piece of code like this to accomplish your objective flop When BotIsLastRaiser and bets 0 and raises 0 When opponents 2 and not FlushPossible or board A and not board K and StraightPossible BetPot force When opponents 1 and not FlushPossible BetPot force That code defines all the situations that you want to make the automatic continuation bet on the flop for so you can now adjust the option setting Never Bet Flop with Hand Below Middle Pairto always in fact if you don t do that this code is pointless as the bot is more aggressive with flop continuation betting by default Now let s suppose t
56. d and raises 1 call force When raises gt 1 fold force When raises 0 and calls 222 call force When raises 0 and calls 1 fold force When raises 0 and calls 0 and opponents gt 4 fold force When raises 0 and calls 0 and opponents lt 4 raise force The fourth line there about folding for any raise covers the rest of the positions After the blinds the order of those lines doesn t matter because there are not any further conflicts By the way did you pick up on the fact that this code will have the bot raise with A9 when folded to in the cutoff button or in the small blind If so good for you you are starting to get it So always code suited hands before you code their unsuited counterparts and always code positional exceptions before the general rule for the rest of the positions Similarly post flop always code made hands before coding draws because from our bot s perspective a made flush or a straight is still a flush draw or a straight draw More on that in the post flop section Note AKs means AK of spades not AK suited AK Suited is you guessed it AK suited Card rank values and card suit values can be used on any betting round not just pre flop Often using them to define a post flop condition is a good way to randomize actions For example on the river with a possible straight and possible flush out either of which would require the use of two cards facing a medium size bet with two live opponents you might
57. d calls gt 1 call force When opponents gt 2 call force There is a perfectly good piece of code for handling 88 and 77 in all positions and situations in a No Limit game See how clean it is and how little time it took to write For the rest of this user guide we will be assuming that this is the way you are coding that is defining specific blocks of hands and then specifying the actions for all the different conditions you want to define for those hand blocks 3 3 7 Start Multiple Lines in Statements with or or and As you already know a statement can be just one line However sometimes you may want to code multi line statements that use the word and or orto further define the condition on subsequent lines before stating the action Here is an example When hand 8c 7c and In BigBlind and raises 1 and calls 0 and BetSize 7 RaisePot force What you have there is a statement that must include all three lines for the condition to be defined You only want to re raise a lone opponent who raised when you are in the big blind with exactly 87 of clubs and his raise was under 7 big blinds you want no other players in the pot This type of situation is when you use the word and to join conditions all of which must be present before taking the desired action Another example is When hand AA Or hand KK Or hand QQ RaisePot force Here the bot will HaisePot whenever it has either AA KK or QQ Either condition can be satisfied
58. d or hand Js Ts or hand Tc9c or hand 9h8h When In BigBlind or In SmallBlind or In Button and raises 0 and calls gt 4 raise force When hand QJ suited or hand JT suited or hand T9 suited or hand 98 suited When BotsLastAction raise or BotsLastAction call call force When raises 0 and calls 0 and StillToAct lt 3 raise force When others call force When hand AJ or hand KQ When BotsLastAction raise call force When in BigBlind and raises lt 1 call force When raises 0 and StillToAct gt 5 call force When raises 0 and opponents lt 5 raise force When raises 1 and calls gt 2 fold force When raises 1 and calls lt 2 call force When raises gt 1 fold force When others call force When hand 99 or hand 88 or hand 77 When BotsLastAction raise call force When BotsLastAction call and calls gt 3 call force When In BigBlind and raises 1 call force When raises 0 and calls 0 and StillToAct lt 4 raise force When raises and calls gt 3 call force When raises 1 and calls 3 fold force When raises 1 fold force When others call force When hand AT or hand KJ or hand QJ When BotsLastAction raise call force When In BigBlind and raises 1 call force When raises gt 1 fold force When raises 0 and calls 0 and opponents lt 4 raise force When others call force When hand KT or hand QT or hand JT When BotsLastAction raise call force When In Bi
59. d work our way into the more detailed complete profiles making sure to use all the pre flop variables values and actions 3 5 1 Eliminating Hands Preflop By default the bot will play aggressively when folded to in late position raising from the cutoff and button with a pretty wide range including J8 J7 K7 and Q7 among others Let s say you noticed it doing that with some hands that you want to tighten up on To specify hands you simply never want to play use this line of code When hand J8 or hand J7 or hand Q7 fold force To eliminate hands just from the cutoff seat you can use this code When hand K7 or hand 22 or hand 33 or hand 44 and Still ToAct gt 3 fold force Of course with either code you would adjust for the specific hands you want to fold 3 5 2 Trapping in Early Position The bot by default doesn t slow play AA or KK Many players like to trap with them in early position To do that you can use this simple line of code When hand AA or hand KK and raises 0 and Still ToAct gt 7 call force The bot will now slow play these hands early in unraised pots If it gets raised behind you the bot will behave as you have your options set when the action comes back to you raise pot etc 3 5 3 Aggressive Play for Tournaments If you are familiar with the Holdem Bot then you know that the Aggressive Tournament Setting on the bot s option menu is a Bet Max function that is set by hand strength But y
60. decide to call if you are holding top pair and your hand contains an ace or a queen or perhaps if your hand is a certain suit That way you make different decisions for the same situation randomly perhaps making what is kind of a tough call 5096 of the time and folding 5096 of the time more about this below 3 3 11 Figuring Out Your Position You will need to use the variables to figure out your position other than when you are in one of the three positions that there is a condition defined for n BigBlind In SmallBlind In Button This is done by using a combination of the call fold raise count and the opponent count variables This does require a little thinking but the variables are there for you to code the bots position correctly Many of the code examples given so far have done this Keep in mind that the bot does not record its own action in the log This is important when you are creating instructions for dealing with raises and re raises after you act For example if you want to call one re raise only after you raise pre flop this would be a valid way to do that When hand JT suited or hand QJ suited or hand KJ suited or hand AT suited or hand AJ suited or hand KQ suited when raises 1 and BotsLastAction raise call force Copyright 2008 2013 Shanky Technologies m hanky Technologies Pace 129 P r L Note that the raise count will only be 1 in the bots log because it only records opponent s actions not it
61. different suits no possible straight and the ranks are such that no opponent could have 7 or more outs to a straight Restrictions Post flop only User a z 0 9 Set when a situation that is defined by the user is read in the code with the action being that of setting a user defined variable instead of taking a normal action see section 3 2 5 In this case the bot keeps reading code until a matching condition with a normal executable action is found bet raise check fold beep sitout etc True when the condition that the user variable defined earlier in the code is found true Only letters numbers and underscores can be used in the variable name however letters are not case sensitive Notes All user defined variables are set to false when cards are dealt for a new hand Once set to true they retain their value until cards are dealt for a new hand Therefore variables set to true during early betting rounds can be used on later streets Situations can be defined to set a user variable the same way any other situation is defined using any of the existing PPL variables both numeric and Boolean Once the user variable is set it is used like any other Boolean variable See section 3 2 5 for examples WheelPossible True if a wheel can be made with the current board cards A wheel is A2345 Restrictions Post flop only Copyright 2008 2013 Shanky Technologies hank Techhologies Page 179 PPL Appendix 2 Example of an Omaha 8 profile
62. ditions and give specific actions for specific situations 3 4 1 Preflop Actions Beep computer will beep at you but take no action on the hand if you do not respond you will time out Call check if possible else call Play same exact action as call above use either Raise Generic Raise action The size of the raise depends on available buttons for the particular poker room whether we are acting preflop or on the flop turn or river and certain option settings Will raise minimum preflop unless the Make Pot Sized Raises for option is set in which case it will honor those option settings RaiseMin will raise minimum RaiseHalfPot will raise pot or max if half pot button not available and raise min if no other button available RaisePot will raise max if pot button not available and raise min if no other button available RaiseMax will raise pot if max button not available and raise min if no other button available Fold will check if available else fold Notice how Bet is not included as a preflop action That s because this action is not an option on the first betting round in Texas Hold em That is before the flop you can only call fold or raise due to the blind structure of the game So don t make the beginner mistake of trying to use BetPot or BetMax in the preflop section of your code because that will invalidate it Use RaisePot or RaiseMax instead Those actions combined with the list of variables in Appendix
63. dling subsequent raises always remember that the bot s action is not recorded and therefore is not part of the raises or calls count So When BotsLastAction raise and raises 1 means that at least one other player raised besides your poker bot RaisesSinceLastPlay Tip Use this for Fixed Limit profiles when you want to program the bot to call one more raise but not two Note that this numerical valued variable can be used either preflop or post flop In Limit you will often want to fold for two raises cold but be getting good enough odds to always call one more raise Example Preflop When hand KQ or hand 99 When raises 0 and opponents lt 5 raise force When raises 1 call force When RaisesSinceLastPlay gt 1 fold force When RaisesSinceLastPlay 1 call force When raises gt 2 fold force Flop When opponents 2 and HaveStraightDraw and not PairOnBoard or HaveStraight or HaveFlush or HaveFlushDraw or HavePair or HaveTrips When bets 0 bet force When bets 1 and raises 0 call force When RaisesSinceLastPlay gt 1 fold force When RaisesSinceLastPlay 1 call force When raises gt 1 fold force Notice how using sequential order intelligently in that code is required to get the desired results Limit Bet Size vs Blind Size Tip In NL games you only have the small blind and big blind to deal with as far as bet sizes go and the minimum bet is always the big blind size However in Limit there is a sma
64. e lt 50 potsize and NoBettingOnFlop When not PairOnBoard or OneCardFlushPossible or OneCardStraightPossible and HaveFlushDraw RaiseMin force When PairOnFlop and not OneCardFlushPossible or OneCardStraightPossible or HaveBestKickerOrBetter and hand 2 or hand 3 or hand 4 or hand 5 or hand or hand 7 RaiseMin force When opponents 1 and position last and bets 1 and raises 0 When not OneCardFlushPossible or OneCardStraightPossible and HaveTrips and Overcards 1 RaiseMax force When not HavePair or HaveTwoPair or HaveQuads or HaveSet or HaveTrips or HaveFlush or HaveStraight or HaveFullHouse and HaveFlushDraw or HaveStraightDraw and Betsize gt 50 potsize and Overcards lt 1 fold force When opponents 1 and not PairOnBoard or HaveFlush or HaveStraight or HaveSet or HaveTwoPair When HaveUnderPair or HaveBottomPair or have3rdtoppair and bets 1 or raises 1 fold force When StraightPossible and RaisesOnFlop and not PairOnBoard or FlushPossible or OneCardStraightPossible When not HaveTopPair or HaveT woPair or HaveSet or HaveStraight fold force When HaveFlushDraw and not PairOnBoard or FlushPossible or OneCardStraightPossible When HaveTopPair and HaveBestKicker and raises gt 1 call force river When TripsOnBoard and not NutFullHouseOrFourOfAKind 1 or NutFullHouseOrFourOfAKind 2 or HaveQuads or HaveStraightFlush and Betsize gt 6 fold force Copyright 2008 2013 Shanky Technologies P han
65. e playing at a poker room or game which does not support this feature Can be used preflop or post flop MaxCurrentOpponentStackSize This is the good one The number of big blinds that the live opponent who is still in the hand and not yet folded with the largest current stack has in his stack at the moment when it is the bot s turn to act Can be used on the left of the comparators to compare to your own stack size and is useful for identifying short stacked opponents or determining that all the live opponents have your stack covered Can be used preflop or post flop MaxStillToActStackSize The number of big blinds that the opponent with the largest stack who has not acted yet had in their stack at the beginning of the hand before blinds were posted Only valid on the first orbit that is the first time the betting goes around for the betting round otherwise the value is 0 Therefore it only applies to opponents behind you on the first orbit and is really only accurate preflop Can be used to steal blinds from short stacked opponents in tournament situations Can be used on the left of the comparators MinStillToActStackSize The number of big blinds that the opponent with the lowest stack who has not acted yet had in their stack at the beginning of the hand before blinds were posted Only valid on the first orbit that is the first time the betting goes around for the betting round otherwise the value is 0 Therefore it only a
66. e bot s last action on the preflop betting round was This variable uses the special BotsLastAction values which are none beep raise bet call or check The only comparator allowed is Restrictions Post flop only Calls number of calls by opponents on this betting round The bots own calls are not counted This variable is reset to 0 when flop turn or river cards are dealt so that it represents the number of calls for the particular betting round only CallsSinceLastRaise number of calls by all opponents since the last raise by an opponent on the current betting round If there has not yet been a raise on the current betting round the value is 0 The bot s own raise cannot be counted since it could never be the last raise Copyright 2008 2013 Shanky Technologies n hank Technologies P P L P a g e 66 POKER PROGRAMMING LANGUAGE Checks number of checks by opponents in this betting round The bots own checks are not counted This variable is reset to 0 when flop turn or river cards are dealt so that it represents the number of checks for the particular betting round only FirstCallerPosition The position of the players at the table is counted from a counter clockwise position relative to the big blind position not your position Therefore the small blind 1 the button 2 the cutoff next to the button 3 etc This variable tells you the position of the first preflop caller on the first round of bett
67. e complete conditions with an action Those complete simple 1 line codes need to be placed at the beginning of the betting round code before you start using When Conditions without an Action Note If you just want to make sure that you go back to the situation where no When Condition without an Action is active you might want to insert the statement When others by itself This causes the condition others to be active for all subsequent statements This is the same as nothing being active since others is always true and ANDing with true does not do anything Also for nice clean readable code you should get in the habit of using line breaks and indentations like you see me doing Even though it doesn t matter as far as the validity of the code goes it makes it easier to read and therefore is much easier to go back through and edit 3 3 9 If a Statement Contains Both and s and or s Surround the or s in Parenthesis Parenthesis are supported in the language and the above rule must be followed This is critical If you ignore this your code will not work as intended because and has a higher priority than or That means your code might get broken up the wrong way if you mix and and or in a statement For example Copyright 2008 2013 Shanky Technologies P3 hank zs Techhologies Page 126 P P L POKER PROGRAMMING LANGUAGE Invalid When hand KQ suited or hand AJ suited and raises 1 and BetSize lt 10 call force If w
68. e flop and the first opponent bets you call the last opponent raises the original bettor now folds and it is back to you now opponents 1 and position first will be true for the action you are facing This variable is intended for post flop use or second orbit situations pre flop when there was a raise behind you and the action has come back For first orbit situations on the pre flop betting round use stilltoact instead PotSize this is always expressed by number of big blinds regardless of game type Limit NL etc Raises number of raises by opponents on this betting round The bots own raises are not counted This variable is reset to 0 when the flop turn or river cards are dealt so that it represents the number of raises for the particular betting round only RaisesSinceLastPlay The number of raises since bots last action Reset to 0 every time the bot beeps checks calls bets or raises and also when pre flop flop turn or river cards are dealt This does not include the bots own raises Random returns a random number between 1 and 100 inclusive Used to easily code randomized actions For example when random lt 50 would be true 50 of the time on average StackSize the size of the bots chip stack counted by number of big blinds If the stack size is ever unknown due to temporary obstructions or connection issues then any condition that uses this variable will evaluate to false StartingStackSize th
69. e not counted If you want to check whether the bot raised before the flop use the variable BotRaisedBeforeFlop instead Restrictions Post flop only RaisesOnFlop True if any opponent raised on the flop The bots raises are not counted Restrictions Turn and River only RaisesOnTurn True if any opponent raised on the turn The bots raises are not counted Restrictions River only RiverCardisOvercardToBoard True if the card that was dealt on the River was higher in rank than all the other board cards Restrictions River only SecondTopFlopCardPairedonRiver True if the second highest ranking board card on the flop paired on the River Restrictions River only SecondTopFlopCardPairedonTurn True if the second highest ranking board card on the flop paired on the Turn Restrictions Turn and River only StackUnknown True if the bot cannot read its own stack size and therefore returns a stack unknown message in the bot window Potentially useful for making sure the bot does not get involved with anything but strong hands when it is temporarily not reading everything properly StraightFlushPossible True if a straight flush can be made with the current board cards Restrictions Post flop only StraightFlushPossibleByOthers True if a straight flush can be made by an opponent with the current board cards given the bots hole cards The bot may or may not have a straight flush and a straight flush may be possible with the current b
70. e pot in order to call It is 0 if the bot can check Bets number of bets by opponents in this betting round The bot s own bets are not counted This variable is reset to 0 when flop turn or river cards are dealt so that it represents the number of bets for the particular betting round only The value can be either 0 or 1 since not more than 1 bet can be made in a particular betting round BetSize this is always expressed by the number of big blinds regardless of game type Limit NL etc BigBlindSize the size of the big blind expressed by betting units starting from 1 meant for tournaments BotsActionsOnThisRound the number of actions taken on the current betting round which involve putting chips in the pot calling or raising Checks are not counted as an action BotsActionsOnFlop the number of actions taken on the flop betting round which involve putting chips in the pot calling or raising Checks are not counted as an action Restrictions Turn and River only BotsActionsPreflop the number of actions taken on the preflop betting round which involve putting chips in the pot calling or raising Checks are not counted as an action Restrictions Post flop only BotsLastAction whatever action the bot took last good for handling raises after you act This variable has its own special values which are none beep raise bet call or check The only comparator allowed is BotsLastPreflopAction whatever th
71. e size of the bots chip stack counted by number of current big blinds the first time a particular bot window reads it s stack size in the current session Clicking start and stop on our bots will not reset this variable even if you move to another game so you should close the bot window and reopen when you change tables This variable should only be used in cash game profiles as it does not account for the increasing big blind size in tournaments Also note that when the bot first reads it s stack size it is usually after a blind has been posted so the number associated with this variable will likely always be one big blind short This variable is primarily meant to be used in the comparators to compare it to StackSize so you can create stop loss points if you so desire StillToAct only the live players behind you who have not acted yet does not include calls and raises in front of you Only valid on the first orbit that is the first time the betting goes around for the betting round Therefore if somebody raises behind you and the betting comes back to you stilltoact will always 0 SuitsInHand The number of unique suits in your hole cards This variable was primarily designed for our Omaha bot profiles For example if your hole cards are Ad 3d 8d Js then this evaluates to 2 as you have only two suits in your jhand diamonds and spades SuitsOnBoard The number of unique suits on board For example if the board cards are Ac 8c 7c on t
72. e used to specify position Preflop the following Condition is the same as In Button StillToAct 2 However after the flop or after the betting has come back to the bot after a raise in Button will still be true if the bot is on the button but Stil ToAct 2 will be true only if there are 2 players left to act after the bot Another way to specify position is to use conditions of the form Position Relative Position Copyright 2008 2013 Shanky Technologies 9 hank Technologies Page 113 E P L POKER PROGRAMMING LANGUAGE Where Relative Position can be First Middle or Last For example Position First This condition would be true when the bot is first to act Note that position lastis the same as StillToAct 0 if this is the first time the bot is betting in a particular round However if betting comes back to the bot after a raise then Stil ToAct will always be 0 since everybody in the game has acted at least once but position last will be true only if the bot was the last to act in the initial round 6 Boolean Variables This condition is specified simply by giving the name of the variable and is of the form Boolean Variable It is a simple true or false variable The full list of Boolean Variables is specified in Appendix 1 A few examples are given below Others is a special catch all Boolean variable which is always true irrespective of the state of the game For example the statement When Others fold
73. ecause if an A or a 2 is dealt on the turn the bot will no longer have the nut low Therefore this variable will be false in this situation However if the bots hole cards are A23T then the bot has the nut low with backup Even if an A or a 2 is dealt on the turn the bot will still have the nut low Therefore this variable will be true in this situation Restrictions Post flop only Can only be true in Omaha 8 games HaveNuts True if the bot has the best possible hand at the moment This variable does not apply to low hands in Omaha Hi Lo only the best possible high hand Restrictions Post flop only HaveNutStraight True if the bot has the best possible straight using the current board cards Note that this may not be the nut hand if a flush or a full house is possible Restrictions Post flop only HaveNutStraightDraw True if the bot has a made nut straight or has a nut straight draw A nut straight draw is defined as a hand with at least 7 outs to a nut straight If a flush is not already possible then a card that will complete a nut straight but also make a flush possible is not counted as an out to a nut straight Restrictions Post flop only HaveNutStraightFlush True if the bot has a made straight flush and it is not possible for an opponent to have a higher straight flush For Holdem a royal straight flush on board does count as a made nut straight flush Restrictions Post flop only HaveOverPair True if the bot has a ho
74. echnologies a hanky P P Technologies Page 127 L POKER PROGRAMMING LANGUAGE 3 3 10 Code is Read in Sequential Order This concept is also necessary to grasp in order to get the bot to take your desired actions for all your conditions The bot reads the code from top to bottom and executes the first matching command for the situation The reason this is important is that there are going to be some conflicting statements in the custom code sometimes most notably suited hands verses unsuited hands and positional exceptions especially for the blinds This is because unsuited hands include suited hands but suited hands do not include unsuited hands and there are hands that you might want to call a raise with only when you are in the blinds or on the button To create valid code which does what you want remember these three rules Code Suited Hands First Code Positional Exceptions First Post flop Code for Made Hands Before Draws For example if you tell the bot to fold QJ off suit for a small raise but call a small raise with QJ suited you need to put the line of code with QJ suited first Otherwise the bot will find the line to fold for QJ first and fold your QJ suited hand because that is a QJ hand If you put QJ suited first it solves the problem because after a match is found the bot quits searching the code Here is the wrong way to do it When hand QJ and raises 1 fold force When hand QJ suited and raises 1 and BetSize
75. ed K Q J or hand A suited K Q T or hand A suited K J T or hand A suited QJ T or hand A KK or hand A suited QQ and not hand KKK or hand QQQ RaisePot force Copyright 2008 2013 Shanky Technologies hank Techhologies P L P a g e 80 POKER PROGRAMMING LANGUAGE When StackSize 8 When hand A or hand KK or hand QQ or hand 2 34 or hand 2 235 orhand 2245 or hand 24 6 or hand K suited QJ T or hand K suited QJ 9 or hand K suited Q T 9 or hand K suited J T 9 or hand K Q suited J T or hand K Q suited J 9 or hand K Q suited T 9 or TwoPairInHand and not hand KKK or hand QQQ RaisePot force When StackSize lt 6 When BotsLastAction raise RaisePot force When Betsize gt 25 StackSize When hand AA RaisePot force When BetSize 12 When hand AA 2 or hand AA 3 or hand AA 4 or hand AA suited RaisePot force When BetSize gt 20 StackSize and StackSize gt 50 When not hand AA 2 or hand AA 3 or hand AA 4 or hand AA suited or hand A suited 2 or hand A suited 3 4 or hand A suited 3 5 or hand A suited 3 6 or hand A suited 34 5 or hand A23 or hand A24 orhand A25 or hand A 3 K suited 4 fold force When OpponentsAtTable lt 4 and In SmallBlind and raises 0 When calls 0 and raises 0 and hand A or hand KK or hand QQ or hand 2 23 4 or hand 2 23 5 or hand 2245 or hand 224 6 or hand K suited Q J T or hand K suited QJ 9 or hand K suited Q T9 or hand K
76. entStackSize The number of big blinds that the opponent at your table with the largest stack has in his stack at the beginning of the hand before blinds are posted If there is only one opponent at your table this value will be the same as MinOpponentStackSize The value is always 0 if you are playing at a poker room or game which does not support this feature Can be used preflop or post flop Can be used on the left of the comparators MinOpponentStackSize The number of big blinds that the opponent at your table with the smallest stack has in his stack at the beginning of the hand before blinds are posted If there is only one opponent at your table this value will be the same as MaxOpponentStackSize The value is always 0 if you are playing at a poker room or game which does not support this feature Can be used preflop or post flop Can be used on the left of the comparators OpponentsWithHigherStack the number of opponents at the table with a larger stack than the bot s at the beginning of the hand before blinds are posted Equal stack sizes are not considered higher The value is always 0 if you are playing at a poker room or game which does not support this feature Can be used preflop or post flop OpponentsWithLowerStack the number of opponents at the table with a smaller stack than the bot s at the beginning of the hand before blinds are posted Equal stack sizes are not considered lower The value is always 0 if you ar
77. esignation is handy when you want to specify whether or not an ace is on board or perhaps to randomize your play in certain situations based on certain ranks and or certain suits being on board For example When board Kc Q7 and not HavePair or RaisesBeforeFlop and bets 1 RaisePot force Copyright 2008 2013 Shanky Technologies i A hanky Technologies Page 149 P P L aS a rare randomized bluff raise lm sure there are other uses for board specific conditions as well but most likely you are going to want to start your post flop code blocks by using the Boolean variables that were created for identifying specific board states They are FullHouseOnBoard QuadsOnBoard TripsOnBoard FlushOnBoard StraightOnBoard TwoPairOnBoard PairOnBoard FlushPossible StraightFlushPossible StraightFlushPossibleByOthers OneCardFlushPossible StraightPossible OneCardStraightPossible OnlyOneStraightPossible Only1OneCaraStraightPossible Using the not operator is necessary for defining most of the more common board states For example When not PairOnBoard or FlushPossible or OneCardStraightPossible is a very common board state where you are going to want to bet and raise most of your stronger one pair hands However you will also probably want to be leery of big raises from a possible set straight or two pair hand You can eliminate likely straights by using the board specific conditions like this When not PairOnBoard or Flush
78. force When not FlushPossible and HaveSet or HaveStraight and HaveLow and raises 0 call force When HaveFlush and HaveLow and raises 0 call force When StackSize lt 20 and potsize gt 10 and PairOnTurn and NoBettingOnTurn When not FlushPossibleOnTurn and HaveNutFlush RaisePot force When not StraightPossibleOnTurn and not FlushPossible and HaveNutStraight RaisePot force Copyright 2008 2013 Shanky Technologies hank I Gaz coi Page 84 r P OY ctNW 00004 POKER PROGRAMMING LANGUAGE PP POKER PROGRAMMING LANGUAGE Copyright 2008 2013 Shanky Technologies
79. gBlind and raises 1 call force When raises gt 1 fold force When raises 0 and calls 0 and opponents lt 3 raise force When StillToAct gt 7 fold force When others call force When hand 6d6c or hand 5s5h or hand 4d4s When In BigBlind or In SmallBlind or In Button and calls gt 4 raise force When hand 66 or hand 55 or hand 44 or hand 33 or hand 22 Copyright 2008 2013 Shanky Technologies PPL POKER PROGRAMMING LANGUAGE hank Technologies Page 143 When BotsLastAction raise call force When In BigBlind and raises 1 call force When In SmallBlind and raises 0 and calls gt 1 call force When raises 0 and calls 0 and StillToAct lt 2 raise force When raises 0 and calls gt 2 call force When others fold force When hand A9 suited or hand A8 suited or hand A7 suited When BotsLastAction raise or BotsLastAction call call force When In BigBlind and raises 1 call force When raises 0 and calls 0 and StillToAct lt 4 raise force When raises gt 1 fold force When StillToAct gt 7 fold force When others call force When hand A6 suited or hand A5 suited or hand A4 suited or hand A3 suited or hand A2 suited When BotsLastAction raise call force When BotsLastAction call and calls gt 3 call force When In BigBlind and raises 1 call force When In SmallBlind and raises 0 and calls gt 1 call force When raises 0 and calls 0 and StillToAct lt
80. gh your head also From the bot s perspective a made flush or a straight is still a flush draw or a straight draw as well Therefore it is imperative that you place the blocks of code covering playing straights and flushes higher than the blocks of code for playing drawing hands to flushes and straights Likewise if you have a code block that includes actions for HaveFlush or HaveStraight and that code block also has lines for HaveFlushDraw or HaveStraightDraw place the commands for made hands higher in the block than the drawing hands If you place the codes for the drawing hands higher than the codes for their made hand counterparts then the bot will find them first and act upon them even when you already have the made hand The way you fix that is by paying attention to sequential order In fact paying attention to sequential order as a general practice just makes coding a heck of a lot easier If you do this right you can save a lot of typing Take a look at this example for handling a pocket pair in Limit Holdem when there is one over card on board When PairInHand and Overcards 1 When raises gt 1 fold force When opponents gt 1 and raises gt 1 fold force When opponents gt 3 fold force When opponents 3 and board A fold force When opponents 3 and not board A call force When opponents lt 2 and bets 0 and raises 0 bet 60 force When opponents 2 call force When opponents 1 and raises 1 and SuitsOnBoard 2 call fo
81. gt 25 and bets 1 call force When HaveTwoPair and have2ndnutlowdraw and StackSize gt 25 and raises 0 call force When StackSize gt 25 and BetSize gt 8 and not HaveSet or HaveNutLow or HaveNutFlushDraw or havel2outstraightdraw fold force When opponents lt 2 and BetSize gt 40 StackSize When PairOnBoard and HaveTrips and Overcards gt 2 RaisePot force When opponents 1 When not PairOnBoard and Have2ndNutFlush RaisePot force When PairOnBoard and HaveTrips and Overcards gt 2 RaisePot force When raises gt 1 and HaveNutLow and not HaveFlush or HaveStraight or HaveSet or HaveTwoPair or HaveFullHouse or HaveStraightDraw or HaveFlushDraw or HaveTopPair call force When LowPossible and not WheelPossible and not PairOnBoard and not FlushPossible and not board 236 or board 246 or board 256 or board 346 or board 356 or board 347 or board 357 or board 367 or board 457 or board 467 and opponents 1 When HaveLow and not HaveNutLow or have2ndnutlow or HaveStraight and HaveTwoPair or HaveSet and bets 0 and raises 0 BetPot force When HaveLow and not HaveNutLow or have2ndnutlow or HaveStraight and HaveTwoPair or HaveSet call force River When opponents and OpponentIsAllIn and BetSize lt 20 StackSize call force When TwoPairOnBoard and not HaveNutLow or have2ndnutlow and NutFullHouseOrFourOfAkind 3 or NutFullHouseOrFourOfAkind 0 fold force When TripsOnBoard and not Have
82. h 3 2 PPL Structure and Elements We will first discuss the structure and elements of PPL In later sections we will give various examples that will make the usage clearer Don t run away after reading this section The examples will show you how simple this really is PPL is structured as follows The code consists of a series of Statements Each new statement starts with the word When and is of the form When Condition Action The Condition specifies a situation in which to take the specified Action For example When Hand AA Raise The above tells the bot to raise when it is dealt pocket aces In the above Hand AA is the Condition and Raise is the Action See how simple it is There is another Statement of the form When Condition This is referred to as a When Condition without an action Such statements and their use are discussed in section 3 3 3 2 1 Conditions Conditions are used to specify a particular situation including your hand your position the number of raises made the bet or raise size etc The complete list of variables that can be used inside conditions and their meanings is given in Appendix 1 This section describes the kinds of Conditions that can be specified Copyright 2008 2013 Shanky Technologies A banky ologi PPL Technologies Page 19 ds Currently there are six kinds of Conditions More types may be added later The 6 types of Conditions are 1 Ha
83. ha with 4 cards in the hand it is important to specify the Suited keyword with the right card Hand Ac Kc Means a hand that contains an Ace of Clubs and a King of Clubs Hand A34 Copyright 2008 2013 Shanky Technologies lal hank Technologies Page 110 PPL Means a hand that contains an Ace and a 3 and a 4 This specification will cause the Holdem bot to print an error message since you can only specify up to 2 cards for Holdem However the above is a valid lt Card Specification gt for the Omaha bot Please note that you can also specify when your hand has any pocket pair or any two pair for Omaha or trips for Omaha by using the Boolean variables PairInHand TwoPairInHand TripsInHand 2 Board Specification Condition This is similar to the Hand Specification Condition above and is used to specify the cards on the board This only makes sense for post flop rules This is of the form Board Card Specification Card Specification Where Card Specification specifies a single card Up to 5 cards can be specified The card specifications are done exactly the same way as in the Hand Specification above Example Board AK Q Means a hand that contains an Ace a King and a Queen whether suited or not 3 Variable Comparison Condition This kind of condition is used to compare a variable to a value numeric valued variables only It is of the form Variable lt Comparator gt lt Value gt For exa
84. hanky Technologies gt PPL POKER PROGRAMMING LANGUAGE User Guide Edition September 15 2015 Warning BonusBots com is the only legal site for buying the Shanky Technologies Bots Copyright 2008 2015 Shanky Technologies www BonusBots com all rights reserved le hank E Techhologies Pase PP L POKER PROGRAMMING LANGUAGE Table of Contents L Prst hinas FIESUS on sana ca cee oa esc ca gels beate eut wakuna a slon aaa kaya la maaataq 4 2 NEMEC ULI NCC asua sus 4 2 1 Beep Feature Fold or Beep Bot i i iei nasaasqaaaaaqaqhasqaqauskaqhuasaqasaaasashukaasa te Leu Re cuni aaia 5 2 2 Simple Fold or Push BOt airsoii X 7 3 PPL for the Shanky Technologies Poker Bots n cup ics us Utd pa Ro MERE i E 7 3 1 What about a Custom Programming Interface n appe a e a lae p ce Eee daba ida 8 3 2 PPL Structure and Elements ED 8 321 SULA ofc dd scaly aaa E E ET a u E EREE E ET OE 8 32 2 OPeratofS pisaa e a uu a aa a aa aG aaia a aaa ai aia 13 39 2 3 Toro C 14 S24 Egit udis P 13 3 2 3 Wiser D fined Vatiables E 16 5 2 6 Opponent Name Variable TH 18 3 2 Writing a Custcim Profil e pi s End t rav bet NEN qM RUE EPI eM s M pid MENU
85. hat you see the bot continuation betting the flop just the way you want but decide that you would like to slow play big hands from early position as well So now you need to add to your little piece of flop code and might do it like this Copyright 2008 2013 Shanky Technologies le hank 5 Technologies Page 148 TEL Flop When BotIsLastRaiser and bets 0 and raises 0 When HaveFullHouse or HaveStraightFlush or HaveNutFlush or HaveTrips or HaveNutStraight or HaveSet call force When opponents 2 and not FlushPossible or board A and not board K and StraightPossible BetPot force When opponents 1 and not FlushPossible BetPot force When position first When HaveFullHouse or HaveStraightFlush or HaveNutFlush call force When HaveTrips or HaveNutStraight or HaveSet or HaveT woPair and SuitsOnBoard 3 and bets 0 call force When HaveTopPair and SuitsOnBoard 2 BetMin force Remember there is no action in PPL for check The only use of that term in the code is as a special value for the unique numerical variable BotsLastAction Therefore when you want to program a check you must use the action call This is different from preflop coding because before the flop call always means putting money in the pot whereas post flop when bets 0 and raises 0 the action call will simply check Therefore in order to program a check raise you need to code for a call when in early position and there are no bets and raises If you are
86. hat you wanted was for the bot to call with KQ suited or AJ suited only when the raise count is 1 and the raise was less than 10 big blinds in size that is not what you will get with the above code Most likely the bot will do what you want with AJs there but when holding KGs it will call all raises regardless of how many there are or what size they are You need to be more precise in telling it what to do By following the parenthesis rule you will stay out of trouble However make sure you surround the entire condition with parenthesis not just the values Here is an example of the wrong way to fix the above line of code using parenthesis Invalid When hand KQ suited or hand AJ suited and raises 1 and BetSize lt 10 call force That is invalid because the entire condition is not surrounded Here is the correct way to fix it When hand KQ suited or hand AJ suited and raises 1 and BetSize lt 10 call force Now the bot will do what you want Study that last line of code for a bit so you get it right in your mind Remember to only include the or s in parenthesis if you surround both or s and and s in them you will be right back where you started For example Invalid When hand KQ suited or hand AJ suited and raises 1 and BetSize lt 10 call force Is also incorrect Now the bot will ignore the raise count for KQs again Only surround the or s as in the previous correct example Copyright 2008 2013 Shanky T
87. he actual action will depend on the option settings Therefore it is recommended to always use the keyword force when specifying actions 3 2 4 Custom Bet Sizing The Bet and Raise actions can be combined with a number or a figure to specify a custom bet size Bet Raise by a Number if you specify a number after the action Bet or Raise the bot will bet or raise by the number specified Please note that the number is number of big blinds not a dollar amount Examples Bet 5 force bets 5 big blinds note that Bet is never available preflop Raise 5 force raises by 5 big blinds note that Raise is always raise by not raise to Bet Raise by a if you specify a number with a 96 sign after the action Bet or Haise the bot will bet or raise by the percentage of existing pot size specified Examples Bet 70 force bets 70 of the pot note that Bet is never available preflop Raise 150 force raises by 150 of the entire existing pot size note that Raise is always raise by not raise to If a bet or raise size is specified that is more than the current stack size then the amount is reduced to the current stack size If a bet raise size is specified that is more than the pot size in PL games then the amount to be bet is reduced to the pot size Our bots execute the custom bet sizing commands by typing the bet size specified into the bet amount window at the poker table and then clicking on the Bet button just as you would Note that t
88. he flop then this evaluates to 1 as there is only 1 suite clubs on board Restrictions Post flop only SuitsOnFlop The number of unique suits that were on board on the flop only For example if the flop came Ac 8c 7c on the flop then this evaluates to 1 as there was only 1 suite clubs on board Restrictions Post flop only Copyright 2008 2013 Shanky Technologies E s hank Techhologies Pace 69 P P E POKER PROGRAMMING LANGUAGE Totallnvested the total amount of chips invested so far in the hand counted by number of big blinds Boolean Valued Variables These variables evaluate to either true or false and form a condition by themselves For example When flushpossible The complete list of Boolean valued variables in alphabetical order is as follows AcePresentOnFlop True if there is an ace present on board which was dealt on the flop Restrictions Post flop only BotCalledBeforeFlop True if the bot called before the flop This can be used pre flop also and will be true if the bot has already called BotlsLastRaiser True if the bot has raised and there have been no raises after that BotRaisedBeforeFlop True if the bot raised before the flop This can be used pre flop also and will be true if the bot has already raised BotRaisedOnFlop True if the bot raised on the flop Restrictions Post flop only BotRaisedOnTurn True if the bot raised on the turn Restrictions Turn and River only Called
89. his sometimes results in odd looking bet amounts and cannot be helped If the bet size is over 10 it is rounded to the closest whole dollar amount in an effort to appear as a more natural betting amount Copyright 2008 2013 Shanky Technologies hank E Techhologies Pase 16 E P L POKER PROGRAMMING LANGUAGE 3 2 5 User Defined Variables This is a Boolean style variable that the user defines Any normal codeline that defines a situation using any of the existing PPL elements can set a user defined variable as the action instead of taking a normal action It can even include previously set user variables Simply state a user variable instead of an action at the end of the codeline Once set a user variable is used as a Boolean variable being read as either true or false in the codeline where it appears Setting a user variable is not like a normal action raise call check bet fold beep etc where the bot stops reading code and executes the action When the action is setting a user defined variable the bot keeps reading code until a matching condition with a normal action is found User defined variables start with the word user followed by one or more letters numbers or the underscore character Usergroup1 user a and UserMinRaise3 are examples of user defined variables All variables are case insensitive as usual So userabc USERABC and UserAbc are the same variable and thus are interchangeable All u
90. however you may want to program different instructions for it by using this variable Restrictions Not available at any currently supported poker rooms as of 10 15 2010 KingPresentOnFlop True if there is a king present on board which was dealt on the flop Restrictions Post flop only LowPossible True if a low can be made with the current board cards Restrictions Post flop only Can only be true in Omaha 8 games LowPossibleOnFlop True if a low is was possible on the flop Restrictions Post flop only Can only be true in Omaha 8 games LowPossibleOnTurn True if a low is was possible on the turn Restrictions Omaha only Turn and River only Can only be true in Omaha 8 games MoreThanOneStraightPossibleOnFlop True if there is was more than one way to make a straight on the flop Restrictions Post flop only Copyright 2008 2013 Shanky Technologies E NET Technologies Page 176 P P L MoreThanOneStraightPossibleOnT urn True if there is was more than one way to make a straight on the turn Restrictions Turn and River only NoBettingOnFlop True if there was no betting on the flop I e everybody checked on the flop However note that as a special case only for Omaha Hi Lo this is also true if the bot was in the last position on the flop it was checked around to the bot the bot bet and after that there were no raises Restrictions Turn and River only NoBettingOnTurn True if there was no betting on the tu
91. ht Side BetSize PotSize Totallnvested StackSize AmountT oCall StartingStackSize MaxCurrentOpponentStackSize MaxOpponentStackSize MinOpponentStackSize MaxStillToActStackSize MinStillToActStackSize In addition this special situation comparator is allowed Left Side 96 Right Side PotSize Stacksize Please note that Potsize can only go on the left when Stacksize is on the right Copyright 2008 2013 Shanky Technologies 9 hank 5 Technologies Pase 140 E P L Therefore the 19 comparisons allowed are Betsize PotSize Betsize StackSize Totallnvested 96 PotSize Totallnvested 96 StackSize AmountToCall PotSize AmountToCall StackSize StartingStackSize PotSize of questionable use StartingStackSize StackSize MaxOpponentStackSize PotSize MaxOpponentStackSize 96 StackSize MaxOpponentStackSize PotSize MaxOpponentStackSize StackSize MinOpponentStackSize PotSize MinOpponentStackSize StackSize Potsize StackSize MaxStilltoAct PotSize MaxStilltoAct StackSize MinStilltoAct PotSize MinStilltoAct StackSize The above is currently the only structure supported when using the comparators You can also use this method to call raises more liberally when your stack size is big For example When hand 66 or hand 55 or hand 44 or hand 33 or hand 22 When AmounttoCall lt 2 StackSize call Conversely you can protect a big stack in tournaments by tightening up preflop For example When StackS
92. ifference The when condition without an action is followed by a when condition with an action But you can have multiple when conditions with an action in succession as the when condition without an action is live until another when condition without an action is found Here is a better example of a valid pre flop code When hand TT When raises 1 and BetSize gt 10 fold force When raises 1 and BetSize lt 10 call force When raises gt fold force When raises 0 and calls lt 2 RaisePot force When raises 0 and calls gt 2 call force When hand 99 When raises 1 and BetSize gt 7 fold force When raises 1 and BetSize lt 7 call force When raises gt 1 fold force When raises 0 and calls lt 1 RaisePot force When raises 0 and calls gt 1 call force You see there how the statement starts with a when condition without an action When hand TT followed by when conditions with an action which cover all possible scenarios for the hand Then the next hand group starts with a when condition without an action When hand 99 That is the most efficient way to code by hand or hand group Be careful Once you have started a When Condition without an Action it remains active until a new one is given This means that once you start coding this way you need to keep coding this way for the remainder of the betting round Most codes that we have developed are a mix of this type of code block along with some simple 1 line codes that ar
93. iginal big blind size Fortunately we provide a PotSize variable to help make that calculation for you along with a comparator which can be applied to the pot size value post flop Note that the above piece of code introduces multiple When Condition statements 3 3 6 Statements am using the term statement a lot in this guide The PPL code that you will create consists of a series of statements What mean by a statement is a defined action or series of actions which achieves a desired result for a specific condition Copyright 2008 2013 Shanky Technologies n hank Technologies r P L P a g e 22 POKER PROGRAMMING LANGUAGE Statements can be long or short Statements always start with the word When Stating the action is always done with one word RaisePot fold etc However conditions usually require multiple words including comparator symbols and values The condition that you probably want to start with is a hand or a group of hands that you want to set actions for It is also possible to start with one of the three position conditions included in the language or you could start by using a set of variables to define your own custom condition But let s face it there is no position or other set of variables outside your hand that you are going to want to play the same way all the time irrespective of what cards you are holding Also coding by position is much more cumbersome than coding by hands Let s look at a couple of ex
94. ign values remember that smaller is higher If you point the arrows in the wrong direction you will end up raising with the lower valued hands instead of the higher valued ones You also must account for the 0 value because it is lower than the number 1 Understand that 0 simply means you do not have a full house or four of a kind Therefore you must code for it when using a symbol otherwise it will get included in your actions This is best explained with examples Wrong Way When TripsOnBoard When NutFullHouseOrFourOfAKind gt 2 RaisePot force When others fold That code may seem intuitively correct because you want to raise with the 2 nuts or better But in reality it will raise with the 2 nuts or worse This is because the arrow points the wrong direction It will also fold a straight flush because that is included in others Better But Still Incomplete When TripsOnBoard When NutFullHouseOrFourOfAKind lt 2 RaisePot force When HaveStraightFlush RaisePot force When others fold Copyright 2008 2013 Shanky Technologies n hank Techhologies Page 52 PPL Here you have fixed everything except you have still not accounted for the 0 value Therefore the bot will still raise with any hand that is not a full house or quads as well as the top hands Right Way When TripsOnBoard When NutFullHouseOrFourOfA Kind 2 and not NutFullHouseOrFourOfA Kind 0 RaisePot force When HaveStraightFlush RaisePot force When o
95. ind that if the amounttocall is lt 50 of potsize it was less than a pot sized bet and consequently if amounttocall is over 50 of pot size the bet was more than the pot It is a bit more complicated though when calculating other pot size percentages You cannot simply reduce them by half like you can with 100 The actual formula for calculating this if you care is x 1 1 y Copyright 2008 2013 Shanky Technologies rs US k Techhologies Page 153 PPL Here is a handy chart for making the conversions on just about every bet size you are likely to want to use of Pot Your Opponent Bet Conversion Use this for Bet Size Potsize 20 17 25 20 30 23 40 29 50 3396 6096 3896 75 43 90 47 100 50 125 56 150 60 200 67 Get it If an opponent bets 75 of the pot that bet is now included in the pot so the amounttocall figure would be 43 of the current pot when it is your turn to act This of course assumes no one else calls or rearises A call by a third opponent before you can act reduces the amounttocall of the potsize so you should account for that by including a calls figure in your coding in close decisions If an opponent over bets the pot say 125 of it for instance if the pot was 18 and he bet 20 the amounttocall will be more than 50 of the current pot size when it s your turn to act By the above chart you can see the amounttocall would be 56 of pot size in this case 3 6 4 Previous Bett
96. ing Round Action Variables This group of variables deserves special attention You can really get an edge over your fellow poker botters by taking prior betting round action into account in your decisions of course our bots do this in their default programming as well These are all Boolean variables which are either true or false Here is the list RaisesBeforeFlop BotRaisedBeforeFlop BotlsLastRaiser NoBettingOnFlop FlushPossibleOnFlop StraightPossibleOnFlop PairOnFlop CalledOnFlop bot called on flop OpponentCalledOnFlop TwoOfOneSuitPresentOnFlop UncoordinatedFlop MoreThanOneStraightPossibleOnFlop AcePresentOnFlop RaisesOnFlop BotRaisedOnFlop Copyright 2008 2013 Shanky Technologies US k Techihologies Page 154 PPL NoBettingOnTurn FlushPossibleOnTurn FourOf1 SuiteOnTurn StraightPossibleOnTurn PairOnTurn TripsOnBoardOnTurn OneCardStraightPossibleOnTurn MoreThanOneStraightPossibleOnT urn RaisesOnTurn OpponentCalledOnTurn BotRaisedOnTurn 3 6 5 Defining Your Hand Here is the list of Boolean variables for defining your hand strength HaveStraight HaveNutStraight Have2ndNutStraight HaveUnderStraight HaveStraightDraw HaveNutStraightDraw HavelnsideStraightDraw HavelnsideNutStraightDraw HavePair HaveTopPair Have2ndT opPair Have3rdTopPair Have4thTopPair HaveBottomPair HaveOverPair any overpair Have2ndOverPair pocket pair between top board card and 2nd top board card Have3rdOverPair pocket pa
97. ing when it is your turn to first act It goes to 0 after the action passes and is therefore useless when the action comes back after a raise behind you It is most useful when there has only been one caller and you are in the blinds or are in late position and want to know which position the call came from Restrictions First action preflop only FirstRaiserPosition Works the same as FirstCallerPosition above except for identifying the position of a raiser if any Especially useful when there has been only one raise and you are in the blinds or are in late position and want to know which position it came from Restrictions First action preflop only Folds number of folds since the current betting round card s were dealt LastCallerPosition The position of the players at the table is counted from a counter clockwise position relative to the big blind position not your position Therefore the small blind 1 the button 2 the cutoff next to the button 3 etc This variable tells you the position of the last preflop caller on the first round of betting when it is your turn to first act It goes to 0 after the action passes and is therefore useless when the action comes back after a raise behind you It is most useful when there has only been one caller and you are in the blinds or are in late position and want to know which position the call came from Restrictions First action preflop only LastRaiserPosition Works the same
98. ir between 2nd top board card and 3rd top board card Have4thOverPair pocket pair between 3rd top board card and 4th top board card HavebthOverPair pocket pair between 4th top board card and 5th top board card HaveUnderPair HaveTwoPair HaveTopTwoPair HaveBottomT woPair HaveTrips HaveSet HaveTopSet Have2ndTopSet Have3rdTopSet Have4thTopSet HaveBottomSet HaveQuads Copyright 2008 2013 Shanky Technologies hank I Caz cole Page 55 r P e POKER PROGRAMMING LANGUAGE HaveFullHouse HaveStraightFlush HaveNutStraightFlush HaveFlush HaveNutFlush Have2ndNutFlush Have3rdNutFlush Have4thNutFlush HavebthNutFlush HaveFlushDraw HaveNutFlushDraw Have2ndNutFlushDraw Have3rdNutFlushDraw Have4thNutFlushDraw HavebthNutFlushDraw HaveBackdoorFlushDraw HaveBackdoorNutFlushDraw HaveBackdoor2ndNutFlushDraw HaveBackdoorsrdNutFlushDraw HaveNutFlushCard HaveBestKickerOrBetter PairlnHand HaveBestOverpairOrBetter Have2ndBestOverpairOrBetter Have3rdBestOverpairOrBetter HaveBestKicker Have2ndBestKicker Have3rdBestKicker Have2naBestKickerOrBetter Have3rdBestKickerOrBetter Please Note There cannot be any spaces in the above variables This is one of two exceptions to the spaces and line breaks don t matter rule comments being the other Please be careful as it is natural to want to put a space after have For example Have NutFlushDraw is incorrect and will return an error message from the bot This is an extremely com
99. ize gt 75 and Betsize gt 8 and not hand AA or hand KK or hand QQ or hand AK or hand KQ suited fold force That last line of code introduced using the not operator This can be a bit tricky so there is a detailed discussion of it in the post flop coding section below In situations where it may be important that your effective stack size is less than your stack you can say When havestraightdraw and not havestraight or haveflush or havepair when MaxCurrentOpponentStackSize lt 40 stacksize fold force The above code would keep you from drawing to a straight when the only stack you can win is small Copyright 2008 2013 Shanky Technologies hank Techhologies rP P L Page 141 POKER PROGRAMMING LANGUAGE 3 5 9 Example of a Complete Preflop Fixed Limit Profile Below is an example of a complete preflop custom profile for playing Fixed Limit games It has been debugged for typos which we will show you how to do below and will work if you want to give it a whirl You should easily be able to use it as a template and alter it the way you want custom preflop When hand AA or hand KK or hand AK suited raise force When hand AK or hand QQ When raises lt 1 raise force When BotsLastAction raise or BotsLastAction call call force When raises gt 1 call force When hand AQ suited or hand AJ suited When raises 0 raise force When BotsLastAction raise or BotsLastAction call call force When rai
100. k Technologies rP P L P a 2 e 63 POKER PROGRAMMING LANGUAGE When TwoPairOnBoard and not NutFullHouseOrFourOfAKind 1 or NutFullHouseOrFourOfA Kind 2 or NutFullHouseOrFourOfA Kind 3 or HaveQuads or HaveStraightFlush and Betsize gt 6 fold force When QuadsOnBoard and not HaveBestKicker fold force When QuadsOnBoard and HaveBestKicker RaiseMin force When PairOnBoard and not FlushPossible or StraightPossible or board A or board K or board Q and HaveTrips and raises 1 and Betsize gt 15 call force When PairOnBoard and not FlushPossible or StraightPossible and board A or board K or board Q and HaveTrips and HaveBestKicker and raises 1 call force When opponents and FlushPossible and not PairOnBoard or OneCardFlushPossible or OneCardStraightPossible When HaveTopPair and not HaveBestKicker and bets 0 call force When HaveTopPair and bets 1 and Betsize lt 100 potsize and Betsize lt 15 call force When opponents and PairOnBoard and StraightPossible and not FlushPossible or OneCardStraightP ossible When HaveNutStraight and bets 1 Raise 150 force 3 7 De bugging for Typos It s a safe bet that your newly written code is going to have typos especially if you are going to create entire custom profiles Thankfully the bot will help you debug them This is done by giving you error messages when you try to load a custom coded profile that has bad code The bot window will tell you which line the typo i
101. ld force line See how easy that is You now have created a piece of poker software that goes all in with the hands you want to play and folds all the rest Please note the above profile does not close out post flop situations so the default profile will kick in and play those for you as a backup those times you get a free look at the flop in the big blind If you really want to use a push or fold profile you should probably create post flop instructions for those situations as well which you will learn how to do in the following sections Now let s teach you how to create custom codes from scratch that will do anything you desire 3 PPL for the Shanky Technologies Poker Bots By following these instructions you can override all of our bot s default programming and even your own settings from the option menu to have it play as you instruct it for any situation As you have seen by the above example PPL is very intuitive We developed this simple logical language consisting of only a few parts and any experienced online poker player should take to it like a fish to water Most of the rest of this manual will teach you how to use PPL for our Texas Holdem bot which is our most popular product by far A few examples here and there are thrown in that pertain specifically for our Omaha bots and it should be obvious which variables in the code are meant for use with that product It is assumed that if you want to learn to code one of our Omaha bot
102. le flush could consist of all cards from the board Note that 3 nut flushes could be beaten by a higher flush full houses four of a kind and straight flushes Restrictions Post flop only Have3rdNutFlushDraw True if the bot has a made 3 nut flush or a 3 nut flush draw Restrictions Post flop only Have3rdNutLow True if the bot has the 3 best possible low using the current board cards Restrictions Post flop only Can only be true in Omaha 8 games Have3rdNutLowDraw True if the bot has the 3 nut low draw If a low is possible then this variable will be false This variable is also false for made lows Restrictions Post flop only Can only be true in Omaha 8 games Have3rdOverPair True if the bot has a hole pair which is between the 2 highest and 3 highest card rank on board and therefore is not technically an overpair to the board Ace is highest Pairs on board are only counted as one rank Restrictions Post flop only Have3rdTopPair True if the bot has a hole card that is the same value as the 3 highest card on board Ace is highest Restrictions Post flop only Have3rdTopSet True if the bot has a hole pair that has the same value as the 3 highest board card Ace is highest Restrictions Post flop only Copyright 2008 2013 Shanky Technologies FI s hank SCAM Page 172 E P L POKER PROGRAMMING LANGUAGE Have4thNutFlush True if the bot has the 4 highest possible flush with the current board cards For H
103. le pair that is higher in value than any card on board Ace is highest Restrictions Post flop only HavePair True if the bot has a pair This could be a pair in hand or one of the hand cards paired with at least one of the cards on board A pair on board does not count Restrictions Post flop only HaveQuads True if the bot has a made four of a kind Four of a kind on board does not count Restrictions Post flop only HaveSet True if the bot has a hole pair that has the same value as one of the board cards Restrictions Post flop only Copyright 2008 2013 Shanky Technologies A hanky P P Technologies Page 75 PPL HaveStraight True if the bot has any made straight Restrictions Post flop only HaveStraightDraw True if the bot has a made straight or a straight draw A straight draw is defined as a hand with at least 7 outs to a straight Cards that could complete a flush are counted as outs Restrictions Post flop only HaveStraightFlush True if the bot has a made straight flush For Holdem a straight flush on board does count as a made straight flush Restrictions Post flop only HaveTopNonBoardPairedPair True if the bot has a hole card that is the same value as the highest non paired card on board Ace is highest This was designed to identify the strength of two pair hands when a pair is on board Please note that HaveTwoPair in PPL cannot include a board pair however Restrictions Post flop only HaveTopPai
104. linds are posted The value is always 0 if you are playing at a poker room or game which does not support this feature Can be used preflop or post flop MinOpponentStackSize The number of big blinds that the opponent at your table with the smallest stack has in his stack at the beginning of the hand before blinds are posted The value is always 0 if you are playing at a poker room or game which does not support this feature Can be used preflop or post flop MaxStillToActStackSize The number of big blinds that the opponent with the largest stack who has not acted yet had in their stack at the beginning of the hand before blinds were posted Only valid on the first orbit that is the first time the betting goes around for the betting round otherwise the value is 0 Therefore it only applies to opponents behind Copyright 2008 2013 Shanky Technologies n hanky P P Technologies Pace 167 L POKER PROGRAMMING LANGUAGE you on the first orbit and is really only accurate preflop Can be used to steal blinds from short stacked opponents in tournament situations Can be used on the left of the comparators MinStillToActStackSize The number of big blinds that the opponent with the lowest stack who has not acted yet had in their stack at the beginning of the hand before blinds were posted Only valid on the first orbit that is the first time the betting goes around for the betting round otherwise the value is 0 Therefore it on
105. line number given in error message from the bot window line 87 in the example above Your curser will be placed at the beginning of the specified line which will be at the bottom of the notepad window if it is a line below the text currently showing The error message from the bot should give you a pretty good idea of what the typo is Tip Google Notepad 2 and download it it s free and all the codelines will always be numbered on the left 3 7 2 Common Typos using the letter o instead of the number 0 putting a space between lt or gt missing a parenthesis on one end misspelling terms such as raise OpponentsAtTable etc forgetting to put hand in front of each and every hand and others which you will undoubtedly invent Copyright 2008 2013 Shanky Technologies a hanky P P Technologies Page 165 L POKER PROGRAMMING LANGUAGE Appendix 1 This Appendix lists all the numeric valued and Boolean valued variables supported by our software along with their meanings and any special notes associated with the variable Numeric Valued Variables The following variables are used in conditions of the form Variable Comparator Number For example Raises 2 The complete list of numeric valued variables in alphabetical order is as follows AmountToCall this is always expressed by number of big blinds regardless of game type Limit NL etc It is the amount that the bot needs to put into th
106. ll bet size and a large bet size as well Remember that the big blind size is equal to the small bet size in Limit not the big bet size Programming a Stop loss or Stop win If for some reason you are unwilling to risk your entire stack in a game or just want to quit if you are having a losing session you can program a stop loss based on your starting stack size Example Preflop when startingstacksize gt 300 stacksize sitout force Copyright 2008 2013 Shanky Technologies P hank ss Techhologies Page 160 r P L POKER PROGRAMMING LANGUAGE Similarly you can also quit when you reach a certain profit goal with the same type of code Example Preflop when startingstacksize lt 30 stacksize sitout force TripsonBoard Tip On the river if there are trips on board you may want to call against a single opponent with the top non paired board card but fold with a worse full house For example is the board is 99974 you may want to call a medium sized bet with A7 but not A4 To easily code for this situation you can use the variable HaveTopNonBoardPairedPair Opponent Stack Size Tip We currently have seven numeric valued variables that help you identify your opponent s stack size s Keep in mind only three of these variables deals with live opponent s current stack size The rest are based on a snapshot of the stacks at the table before any cards were dealt and do not take into account who is still in the hand MaxOppon
107. lls gt 1 call force When raises 0 and calls 0 and OpponentsAtTable 1 raise force When others fold force When others When others fold force Copyright 2008 2013 Shanky Technologies PPL POKER PROGRAMMING LANGUAGE n hank Technologies Page 147 E P L POKER PROGRAMMING LANGUAGE 3 6 Post flop Coding Post flop coding is a natural continuation of preflop coding If you have understood preflop coding above then you only need to make a slight adjustment in your thinking to code for the Flop Turn and River On all the subsequent betting rounds coding becomes multi dimensional allowing you to incorporate previous round action into your statement conditions As you might expect there are many more variables available for post flop coding than for preflop The full list of variables is given in Appendix 1 but we will attempt to address the most prominent ones for our examples in this section Post flop code must begin with the single word flop turn or river all by itself on a single line depending on which game state you are coding for Then you can start making statements which define conditions and give specific actions for specific situations For example flop When not FlushPossible or StraightPossible or PairOnBoard When HaveFlushDraw and HaveStraightDraw Raise force Notice in the above example we first defined a board state then specified a hand strength and corresponding action to take This is a very simple pie
108. lop Restrictions Turn and River only OpponentsWithHigherStack the number of opponents at the table with a larger stack than the bot s at the beginning of the hand before blinds are posted Equal stack sizes are not considered higher The value is always 0 if you are playing at a poker room or game which does not support this feature Can be used preflop or post flop OpponentsWithLowerStack the number of opponents at the table with a smaller stack than the bot s at the beginning of the hand before blinds are posted Equal stack sizes are not considered lower The value is always 0 if you are playing at a poker room or game which does not support this feature Can be used preflop or post flop Copyright 2008 2013 Shanky Technologies z hank Technologies Page 168 E P L POKER PROGRAMMING LANGUAGE Overcards The number of hole cards that are Overcards to the board not vice versa Restrictions Post flop only OvercardsOnBoard The number of Board cards that are Overcards to the hole cards Please note that this includes paired board cards so is not necessarily just the number of higher ranks Restrictions Post flop only Position The bots position relative to the other players This variable has its own special values which are first middle or last The only comparator allowed is Your position is always read in real time whenever it is your turn to act For example if you are in middle position on th
109. ly applies to opponents behind you on the first orbit and is really only accurate preflop Can be used to identify large stacks in the blinds in tournament situations and stop normal steal raises Restrictions Only valid on the first orbit of a betting round NumberOfRaisesBeforeFlop The number of preflop raises made by opponents The bot s own raises are not counted Restrictions Post flop only NumberOfRaisesOnFlop The number of raises on the flop betting round made by opponents The bot s own raises are not counted Restrictions Turn and River only NumberOfRaisesOnTurn The number of raises on the Turn betting round made by opponents The bot s own raises are not counted Restrictions River only NutFullHouseOrFourOfAKind This is 0 if we don t have a full house or four of a kind Otherwise it returns a number indicating whether our hand is the 1 nut 2 nut and so on If we have the 1 nut full house or four of a kind this returns 1 If we have the 2 nut full house or 4 of a kind it returns 2 and so on It does not take straight flushes into account So it could return 1 even if our hand can be beaten by a straight flush For example if we are holding an AK and the board cards on the flop are AAK then this will return 1 since we have the first nut hand with the AAAKK full house Note that since we are holding an A a four of a kind is not possible for anybody and hence AAAKK is the 1 nut hand However if we are holding
110. mon typo Also Certain hand defining variables above include additional hand types This is only logical An obvious example would be HavePair which is also true when HaveTwoPair HaveSet or HaveFullHouse are true Another example would be HaveStraight or HaveFlush which both are true when HaveStraightFlush is true Please review Appendix 1 carefully so that you understand the nuances of all the variables For example HaveTwoPair is not true when one of those two pairs is on board In that case you want to use HaveOverPair or maybe even hand AA or hand KK Copyright 2008 2013 Shanky Technologies 9 hank 5 Technologies Pave 56 P P L POKER PROGRAMMING LANGUAGE Overpair Variables Explained Only the HaveOverPair variable actually refers to a hand that most poker players typically refer to as an overpair This is a bit counter intuitive so make sure you understand it HaveOverPair is any pocket pair that is higher in rank than all of the board cards The rest of the overpair variables have2ndoverpair etc refer to other pocket pairs of varying strengths see explanations above 3 6 6 Using Sequential Order Post flop Preflop you learned that suited hands need to be coded before unsuited hands and that all manner of exceptions such as in the big blind or acting after you have been raised behind you need to be coded ahead of regular actions There is a similar Post flop rule Code made hands before draws Get that one throu
111. mple Raises lt 2 In the above Raises is the Variable the lt symbol is the lt Comparator gt and 2 is the Value This condition is true if the number of raises is less than 2 Variables The full list of numeric valued variables which can be used in a comparison conditions are specified in Appendix 1 Some examples are Folds number of folds on the current betting round Checks number of checks by opponents in this betting round The bots own checks are not counted This variable is reset to 0 when flop turn or river cards are dealt so that it represents the number of checks for the particular betting round only Copyright 2008 2013 Shanky Technologies hank zs Techhologies Page lll r P L POKER PROGRAMMING LANGUAGE Calls number of calls by opponents in this betting round The bots own calls are not counted This variable is reset to 0 when flop turn or river cards are dealt so that it represents the number of calls for the particular betting round only Bets number of bets by opponents in this betting round The bots own bets are not counted This variable is reset to 0 when flop turn or river cards are dealt so that it represents the number of bets for the particular betting round only The value can be either 0 or 1 since not more than 1 bet can be made in a particular betting round Raises number of raises by opponents in this betting round The bots own raises are not counted
112. n by a higher flush full houses four of a kind and straight flushes Restrictions Post flop only HavebthNutFlushDraw True if the bot has a made 5 nut flush or a 5 nut flush draw Restrictions Post flop only Haveb5thOverPair True if the bot has a hole pair which is between the 4 highest and 5 highest card rank on board so is not technically an overpair to the board Ace is highest Pairs on board are only counted as one rank Restrictions Post flop only HaveBackdoor2ndNutFlushDraw True if the bot has a made 2 nut flush or a 2 nut flush draw or a backdoor 2 nut flush draw A backdoor flush draw is defined as a hand that has three playable cards of a particular suit so that getting two more cards of the same suit can complete the flush Restrictions Flop only HaveBackdoor3rdNutFlushDraw True if the bot has a made 3 nut flush or a 3 nut flush draw or a backdoor 3 nut flush draw A backdoor flush draw is defined as a hand that has three cards of a particular suit including the so that getting two more cards of the same suite can complete the flush Restrictions Flop only HaveBackdoorFlushDraw True if the bot has a made flush or a flush draw or a backdoor flush draw A backdoor flush draw is defined as a hand that has three cards of a particular suit so that getting two more cards of the same suit can complete the flush Restrictions Flop only HaveBackdoorNutFlushDraw True if the bot has a made nut flush or a nu
113. nd preflop when stilltoact 8 UserUTG when stilltoact 7 UserUTGI when stilltoact 6 UserMid1 when stilltoact 5 UserMid2 when stilltoact 2 4 UserMid3 when stilltoact 3 UserCutoff NOW you can specify your exact starting table position anywhere in the code on any betting round For example later on the preflop round if you use this as part of a statement when raises 1 and botslastaction raise and in button or UserMid3 or UserCutoff you know that you got reraised after raising from a late position so it is more likely that the opponent is reraisng weak than if you raised from an earlier position Here is an example that helps you identify the absolute table position of your opponent preflop when raises 1 and lastraiserposition gt 6 UserEarlyRaiser now you know an opponent opened strong from early position so you can use this to refine plays later in the hand for example flop when havetoppair and havebestkicker and not paironboard or straightpossible or havetwopair or haveflushdraw and position last and bets 1 and raises 1 and botsactionsonthisround 1 andbotslastaction raise and UserEarlyRaiser fold force this flop codeline describes a situation where the opponent who raised in early position preflop then bet the flop and you raised holding TPTK and then they reraised It is very likely they have a big overpair like AA or KK here so you can feel better about folding Without the use
114. nd Specification Condition This kind of condition specifies the cards you have For the Holdem bot this is of the form Hand Card Specification Or Hand Card Specification Card Specification Where Card Specification specifies a single card For Holdem up to 2 cards can be specified as a hand can have only 2 cards For the Omaha bot up to 4 cards can be specified Each Card Specification needs to specify the rank 2 3 4 5 6 7 8 9 T J Q K or A and optionally the suite C D S or H and optionally whether or not the card is suited by using the keyword suited Note Please note that 10 is not valid you must use T for the rank 10 Examples Hand A Means a hand that contains an Ace whether suited or not Since we have not specified any other cards the above Condition will be true whenever we have a hand that contains an Ace irrespective of the 2 card Hand A suited Means a hand that contains an Ace any other card of the same suit Hand AK Means a hand that contains an A and a king whether suited or not Hand A K suited Means a hand that contains an A and a king and the king is suited to some other card in the hand For Holdem with only two cards in the hanad if the king is suited then both cards are the same suit Therefore the above is the same as saying Hand A suited K Which means a hand that contains an A and a King and the Ace is suited It makes no difference for Holdem but for Oma
115. nd calls 0 and opponents lt 5 raise force when raises 0 and calls 0 and opponents 6 call force when raises 0 and calls 0 and opponents gt 6 fold force when raises 0 and calls 1 and opponents gt 3 call force when raises 0 and calls 1 and opponents lt 3 raise force when raises 0 and calls gt 2 call force when in BigBlind and raises 1 call force when raises gt 1 fold In the above code the first line When hand AT is a when condition without an action It is ANDed with all the subsequent statements starting with a when which do include an action Any one of the conditions listed in the statements below the first which defines the hand group can be present and acted upon This is the best way to code for the more common playable hands and it s a good idea to cover all possible situations as in the above example to make sure they get played the way you want The UNTIL another when condition without an action is found part of the red letter rule above means that you cannot have multiple when conditions without an action Here is an example of an invalid pre flop code When hand TT When raises 1 When BetSize 10 Fold force The above code is invalid and will be rejected by the bot with an error message To code this statement properly do this When hand TT and raises 1 When BetSize 10 fold force Copyright 2008 2013 Shanky Technologies e hank x Techhologies Page 125 PPL See the d
116. nd calls gt 4 call force When others fold force When Hand K9 When BotsLastAction raise call force When In SmallBlind and raises 0 and calls gt 1 call force When In BigBlind and OpponentsAtTable lt 4 and raises 1 and calls 0 call force When raises 0 and calls 0 and opponents lt 3 raise force When others fold force When hand K8 or hand K7 When BotsLastAction raise call force When In SmallBlind and raises 0 and calls gt 1 call force When In BigBlind and OpponentsAtTable lt 3 and raises 1 and calls 0 call force When raises 0 and calls 0 and opponents lt 2 raise force When others fold force When Hand Qd9d or hand Qs9s or hand Qd8d or hand Qs8s When BotsLastAction raise call force When BotsLastAction call and calls gt 4 call force When In SmallBlind and raises 0 and calls gt 1 call force When In BigBlind and OpponentsAtTable lt 3 and raises 1 and calls 0 raise force When In BigBlind and raises 1 call force When raises 0 and calls 0 and opponents lt 2 raise force Copyright 2008 2013 Shanky Technologies hanky Technologies Page 145 When raises 0 and opponents 3 call force When raises 0 and calls gt 3 call force When others fold force When Hand Q9 suited or hand Q8 suited or hand Q7 suited or hand J9 suited When BotsLastAction raise call force When BotsLastAction call and calls gt 4 call force When In SmallBlind and raises 0
117. nterfeiting the bots low cards then the bot will have the nut low on the river Restrictions Flop only Can only be true in Omaha 8 games HaveNutLowDraw True if the bot has the nut low draw If a low is possible then this variable will be false This variable is also false for made lows Restrictions Post flop only Can only be true in Omaha 8 games HaveNutLowDrawWithBackup True if the bot has the nut low draw with backup This variable will be false if a low is already possible A backup implies that any non duplicate low card being dealt will cause the bot to have the nut low For example if the board is 67T and the bots hole cards are A29T then the bot has a nut low draw but no backup since if an A or 2 is dealt on the turn the bot will not have the nut low Therefore this variable will be false in this situation However if the bots hold cards in this situation are A23T then the bot will have the nut low on the turn if any non duplicate low card is dealt So even if an A 2 or a 3 is dealt on the turn the bot will have the nut low Therefore this variable will be true in this situation Restrictions Post flop only Can only be true in Omaha 8 games HaveNutLowWithBackup True if the bot has the best possible low using the current board cards with backup A backup implies that the nut low cannot be counterfeited by a new board card For example if the board is 678 and the bots hole cards are A29T then the bot has the nut low but no backup b
118. oard cards but the bots hole cards may rule out a straight flush for anybody else For example if the board is Ac Kc Qc and the bot is holding Tc and 4c then the bot does not have a straight flush but nobody else can have a straight flush either because the bot holds Tc which is required to make a straight flush with the current board cards This variable will evaluate to false while StraightFlushPossible will evaluate to true Therefore the bots nut flush hand cannot be beaten by a straight flush in this situation Restrictions Post flop only StraightOnBoard True if there is a straight on board Restrictions Post flop only StraightPossible True if a straight can be made with the current board cards Restrictions Post flop only StraightPossibleOnFlop True if straight is was possible on the flop Restrictions Post flop only StraightPossibleOnTurn True if straight is was possible on the turn Restrictions Turn and River only ThreeCardStraightInHand True if the bot has three consecutive ranks in it s hole cards Restrictions Can only be true in Omaha games ThreeCardStraightOnBoard True if there are three consecutive ranks on the board Restrictions Post flop only Copyright 2008 2013 Shanky Technologies i hank Techhologies r P L P a g e 78 POKER PROGRAMMING LANGUAGE ThreeCardsWith1gaplnHand True if the bot has three cards in sequence with 1 gap in the hole For example this variable is true if the hand is 568A
119. od Example deir geste ed e te i d DH ispis ianen sineira iii UI NM tiea 33 3 5 1 Eliminating ands Pret lop uuu 33 3 3 2 Trappine ut Early POSIDOD siete dte qtia a acetic tes it sunm E E uet EEEE tense tut i 33 3 5 3 Aggressive Play for T ur aments a cibi ied itu tubae isti ce uus Eodem DD darius 33 3 5 4 Programming Fold or All in Profiles nasus 34 3 5 5 Taking this one step farth r u u ans dne t ra tit URN dad nU isere r Eai p tM mne ns sn ESE EE raS EE 35 3 5 6 Programming for Hand OErOUDS ua oe obe as eeu setup isi fe Mi EE E E ERE 36 3 5 7 Using the StackSize Variable for NL Games n PER Ee RAE RP ce uod 38 5 5 8 Using P COIparatorsiu u usapu ushata binc dune iiL Eus deu s piq E bas RUP ee 38 3 5 9 Example of a Complete Pretlop Fixed Limit Profile i peers onte 41 3 6 P st flop Codio seesi nuan 2 unun su saga 47 3 6 l Deming The BOardiSt t T 48 Copyright 2008 2013 Shanky Technologies s hank Techhologies Pareis P P L 3 6 2 Using the n t Operatorni ate 49 3 6 3 Using the Numerical valued Variables eeseseeseeeseeseeseeeesresstrsresreesetsrrsrrestestsresresstsetesrenseesresresseese 50 3 6 4 Previous Betting Round Action Variables
120. oldem the 4 highest possible flush could consist of all cards from the board Note that 4 nut flushes could be beaten by a higher flush full houses four of a kind and straight flushes Restrictions Post flop only Have4thNutFlushDraw True if the bot has a made 4 nut flush or a 4 nut flush draw Restrictions Post flop only Have4thNutLow True if the bot has the 4 best possible low using the current board cards Restrictions Post flop only Have4thNutLowDraw True if the bot has the 4 nut low draw If a low is possible then this variable will be false This variable is also false for made lows Restrictions Post flop only Can only be true in Omaha 8 games Have4thOverPair True if the bot has a hole pair which is between the 3 highest and 4 highest card rank on board and therefore is not technically an overpair to the board Ace is highest Pairs on board are only counted as one rank Restrictions Post flop only Have4thTopPair True if the bot has a hole card that is the same value as the 4 highest card on board Ace is highest Restrictions Post flop only Have4thTopSet True if the bot has a hole pair that has the same value as the 4 highest board card Ace is highest Restrictions Turn and River only Haveb5thNutFlush True if the bot has the 5 highest possible flush with the current board cards For Holdem the 5 highest possible flush could consist of all cards from the board Note that 5 nut flushes could be beate
121. or or opponent Mad_Scientist fold force when opponents and raises 1 and opponent philivey or opponent MikeSexton or opponent uni bomber3 or opponent 1982_ozzy or opponent durrrrr or opponent mad as hell raisepot force when opponents 1 and opponent pilotbatch or opponent Dman or opponent Chevy25 or opponent OurManinLondon or opponent pingu or opponent ShankyBot_26 or opponent Bonus Bots rock Usershark turn when bets 0 and raises 0 and Usershark bet 75 force 3 3 Writing a Custom Profile This section takes you through the process of writing a custom profiles using the elements of the PPL language discussed in the previous section The explanations below are supported by examples Copyright 2008 2013 Shanky Technologies m hank a3 Technologies Page 120 E P L POKER PROGRAMMING LANGUAGE 3 3 1 Start with the Word custom on One Line The custom instructions must start with the single word custom on one line by itself all in lower case letters underneath where all your chosen option settings display on your profile After that case is not important and spaces and line breaks are not important either with the notable exception of comments see below where they are ended by a line break So the statement When hand AK Suited Raise force is the same as WHEN HAND ak suited Raise force Consequently there are different ways to code the same desired actions and different ways of using the
122. orce 3 6 8 Other Tips We wanted to stick a section in here with additional tips that we can add to as the situations arise This manual could only have been created with help from all the volunteer beta testers in our support forum so a heartfelt thanks goes out to all of them Interesting situations get discussed there on a daily basis As the better coding tips are discovered we will update this user guide with them here OpponentlsAllln Tip you should only use this variable in conjunction with opponents 1 because with another live opponent in the game you don t know their stack size or what they are going to do This variable really only exists so you can call more liberally against one live opponent who has just gone all in as you know that their range is often pretty wide My favorite use for it is in tournaments when I have a large stack and will call with any hand on any street except the river For example When opponents and OpponentIsAllIn and BetSize lt 12 StackSize call force Bot s Last Action Tips worth reiterating here both of the variables BotsLastAction and BotlsLastRaiser carry backward to the last betting round They can both be used to set up a condition from either the last betting round or the current betting round for handling raises after you act When using them on the current Copyright 2008 2013 Shanky Technologies lt lt le s hanky Technologies Pace 159 PP E betting round for han
123. ou might not like the way the hand groups are listed For example the first position setting combines AA KK and AKs which of course means AK suited Copyright 2008 2013 Shanky Technologies 9 hank 5 Technologies Pase 134 P P L POKER PROGRAMMING LANGUAGE on the option menu When this setting is invoked the bot will raise All In only after an opponent raises while holding either AA KK or AK suited Many players have expressed an interest in dropping AKs from that hand group to use in cash games which is easily done with this line of code When hand AA or hand KK and raises gt 1 RaiseMax force You would then leave the Aggressive Tournament Setting off of course Now that line of code makes a great compliment to the Trapping in Early Position code above To use them both you could combine them in a cleaner piece of code using when conditions that looks like this When hand AA or hand KK When raises 0 and Still ToAct gt 7 call force When raises 1 RaiseMax force A lot of players will be satisfied with the types of small adjustments we have covered so far that is eliminating certain hands from certain positions trapping with AA KK early and choosing their own hands and situations for going all in preflop Especially those who are intent upon grinding out rake back or clearing bonuses in cash games To put all this together in a working custom profile it will look like this custom preflop When hand
124. pes already available Many users have reported high final table finishes in large 300 field MTT s completely unassisted including plenty of first place wins using the basic profiles that are already available In addition we have received multiple reports from users who have gotten a piece of large bad beat jackpots using our bot Many of our forum members have reported cashing a 500 signup bonus while they slept There have been graphs posted in our forum showing nice up trends over many thousands of hands in cash games All without any custom profile coding But there are always those who want to be able to tweak the bot to play the way they want it to and that is why we developed PPL Poker Programming Language With it you can fully customize the play of our poker bots whether making a few adjustments here and there or creating an entire set of playing instructions from scratch or anything in between If you are a researcher at a university it should be a simple matter to create a parser So you can use PPL in your project You don t need any computer programming training to become proficient in PPL It s very easy to pick up if you are good with a PC and understand common poker terminology Reading this guide plus a little practice should have you coding away to your heart s content in no time 2 Introduction The Shanky Technologies poker bots are the most sophisticated software programs of their kind ever to become avail
125. playable hands for you automatically and alerts you when you have a playable hand Of course you can also program it to raise for you whenever you have AA or KK as well call wnenever you have AK and there has been exactly one raise less than 10 big blinds in size and anything else you want automatically done So you can configure a bot that plays most hands for you and only beeps for the more difficult discretionary type decisions It s up to you the possibilities are endless Copyright 2008 2013 Shanky Technologies hank Techhologies Page I7 E P L POKER PROGRAMMING LANGUAGE 2 2 Simple Fold or Push Bot Here s a profile for our Holdem bot that will shove or fold pre flop The hands for which the bot shoves can be modified easily Some people might want to use a profile similar to the one below for playing certain Sit and Go tournaments such as super turbos To create this configuration simply create a text file which contains the code below and load it into the bot using the Holdem gt Read Profile menu item custom preflop When hand AA RaiseMax force When hand KK RaiseMax force When hand QQ RaiseMax force When hand JJ RaiseMax force When hand TT RaiseMax force When hand 99 RaiseMax force When hand AK RaiseMax force When hand AQ suited RaiseMax force When others fold force You can complete this by adding additional hands in like manner underneath the AQ suited line but above the when others fo
126. pplies to opponents behind you on Copyright 2008 2013 Shanky Technologies hank Techhologies r P L P a 2 e 61 POKER PROGRAMMING LANGUAGE the first orbit and is really only accurate preflop Can be used to identify large stacks in the blinds in tournament situations and stop normal steal raises Can be used on the left of the comparators 3 6 9 Example of a Post flop NL Holdem Code This example was written for NL cash games in mind usually use it with medium tight preflop settings from the option menu and no preflop PPL code whatsoever It isn t very long and usually does well which shows you that you don t need a tremendous amount of code to get good results with our software present it here as a learning tool custom flop When TripsOnBoard and not NutFullHouseOrFourOfAKind 2 or NutFullHouseOrFourOfA Kind 1 or HaveQuads and Betsize gt 6 fold force When PairOnBoard and not FlushPossible or StraightPossible or board A or board K or board Q and raises 0 and HaveTrips RaisePot force When not FlushPossible or StraightPossible and HaveOverPair and hand AA or hand KK RaisePot force When BotIsLastRaiser When HaveFullHouse or HaveStraightFlush or HaveNutFlush or HaveTrips or HaveNutStraight or HaveSet call force When opponents 2 and bets 0 and not FlushPossible and not board A and StraightPossible and not board K and StraightPossible BetPot force When opponents 1 and bets 0 and raises
127. programming job will get you started with a template for our Holdem Bot below custom preflop Copyright 2008 2013 Shanky Technologies hanky Technologies When hand AA beep force When hand KK beep force When hand QQ beep force When hand JJ beep force When hand TT beep force When hand 99 beep force When hand 88 beep force When hand 77 beep force When hand 66 beep force When hand 55 beep force When hand 44 beep force When hand 33 beep force When hand 22 beep force When hand A suited beep force When hand AK beep force When hand AQ beep force When hand 67 suited beep force When hand z xx beep force When others When others fold force flop When others When others beep force turn When others When others beep force river When others When others beep force Page l6 le E PPL POKER PROGRAMMING LANGUAGE Simply open a new empty text file and copy and paste all of the above code in it You will need to complete it by copying the third to last preflop line shown in red and pasting it underneath that line over and over again then replacing the xx with all the other hands you want to play You will need to read in the custom profile you have created every time you start the bot by choosing the Holdem Read Profile menu item and specifying the name of the file which contains the above text See how easy that is You now have a piece of poker software that folds all the un
128. r True if the bot has a hole card that is the same value as the highest card on board Ace is highest This could include a paired board card and would therefore be true if you have top trips as well Restrictions Post flop only HaveTopSet True if the bot has a hole pair that has the same value as the highest board card Ace is highest Restrictions Post flop only HaveTopTwoPair True if the two highest valued board cards are present in the hole for the bot A pair on board does not count as one of the pairs Ace is highest Restrictions Post flop only HaveTrips True if there is a pair on board and the bot has a hole card of the same value as the board pair Three of a kind on board does not count as having trips Restrictions Post flop only HaveTwoPair True if the bot has two pair A pair on board does not count as one of the pairs Restrictions Post flop only HaveUnderPair True if the bot has a hole pair and the highest hole pair is lower in value than the lowest card on board Ace is highest Restrictions Post flop only HaveUnderStraight True if the bot has a straight such that all hand cards used to make the straight are lower in value than any board cards used to make the straight Restrictions Post flop only IsFinalTable True if the bot is playing at the Final Table at an MTT which has a different appearance than the other tables Our bot software recognizes this and has no problem playing at the final table
129. r defined variable we couldn t know with certainty on the flop that the opponent was an early position pre flop raiser This next example shows an easy way to create pre flop hand groups that may allow you to reduce the amount of code used later when repeating these hand groups preflop when hand AA or hand KK or hand QQ or hand AK UserG1 when hand 22 or hand 33 or hand 44 or hand 55 UserBabies when hand 5d6d or hand 67 suited or hand 78 suited or hand 89 suited UserSCons Copyright 2008 2013 Shanky Technologies Fi hanky P P Technologies L P a g e 18 POKER PROGRAMMING LANGUAGE Which could then be used in the following manner when stacksize 15 and UserG1 raisemax force when UserBabies or UserSCons and amountocall 2346 potsize call force Creating preflop hand groups incorporating already set user variables can be done like this when hand AA or hand KK or hand QQ or hand JJ or hand TT userlist when userlist or hand 99 or hand 88 userlist2 when userlist2 or hand 77 or hand AK userlist3 Here is an example of identifying a limp raiser from UTG or UTG 1 and folding for fear of AA or KK preflop when raises 0 and calls gt 1 and firstcallerposition gt 7 UserTrapl when position last and botslastaction raise and UserTrapl and not hand AA or hand KK or stacksize lt 12 or totalinvested gt 80 stacksize fold force Finally let s look at an ex
130. r or HaveOverPair and potsize gt 3 call force turn when HaveNutFlushDraw and HavePair and not HaveSet or HaveTrips or HaveFlush or HaveStraight or HaveTopPair or HaveOverPair and potsize gt 7 call force Another way is to use the BetSize vs PotSize comparison as has already been discussed Remember to convert so that the bet is included in the pot size although in Fixed Limit if you are using the chart we provided you can do it in reverse as you are really only worried about staying away from the tiny pots Example When HaveNutFlushDraw and HavePair and not HaveSet or HaveTrips or HaveFlush or HaveStraight or HaveTopPair or HaveOverPair when BetSize lt 30 PotSize call force Still another method is to use the opponent and call count perhaps in conjunction with a previous betting round action variable to arrive at a logical conclusion about the kind of odds you are getting For example if there are 3 opponents on the flop you know at least several small bets have gone in to the pot preflop Similarly with 2 opponents on the Turn if there was raising on the flop you know the pot is pretty big These types of assumptions are very reliable so you can effectively code for pot odds in Limit this way Examples Flop When opponents gt 3 and not FlushPossible or HavePair or HaveTrips or HaveStraight or HaveFullHouse and HaveFlushDraw or HaveStraightDraw call force Turn Copyright 2008 2013 Shanky Technologies A hank a3
131. rce When raises 1 fold force When opponents 1 bet force Notice that took a lot of shortcuts in the latter half of that code block which using sequential order properly allowed me to For example the last two lines don t want to fold every time there is one raise and don t want to bet every time there is only 1 opponent but took care of the exceptions higher in the code block So I could make those lines simple commands and it will still accomplish what want Copyright 2008 2013 Shanky Technologies 9 hank Technologies E P L Page 157 POKER PROGRAMMING LANGUAGE 3 6 7 Coding for Pot Odds In NL games you normally handle pot odds by specifying amounttocall vs potsize as covered earlier or perhaps by assuming that small bets will usually be getting good implied odds for drawing hands In Fixed Limit however it is important to handle pot odds correctly because it s a huge component of the game You need to zero in on profitable drawing situations and make sure you don t give opponents who are drawing free chances at it There are a couple of methods for doing this The first way is by using the big blind count as a numerical value assigned to pot odds When using this method you must remember that on the flop the bet size is equal to 1 BB but on the Turn and River the bet size is equal to 2 BB Example flop when HaveNutFlushDraw and HavePair and not HaveSet or HaveTrips or HaveFlush or HaveStraight or HaveTopPai
132. rn l e everybody checked on the turn However note that as a special case only for Omaha Hi Lo this is also true if the bot was in the last position on the turn it was checked around to the bot the bot bet and after that there were no raises Restrictions River only OneCardFlushPossible True if a flush can be made by using one hole card with the current board cards Restrictions Post flop only OneCardStraightPossible True if a straight can be made by using one hole card with the current board cards Restrictions Post flop only OneCardStraightFlushPossible True if a straight flush can be made by using one hole card with the current board cards Restrictions Post flop only OneCardStraightPossibleOnTurn True if a one card straight is was possible on the turn Restrictions Turn and River only Only1OneCardStraightPossible True if one and only one straight can be made using only one hole card with the current board cards For example if the board is 4578 then the only one card straight possible is with a 6 so this variable will be true in this situation However if the board is 4567 then there are two one card straights possible and this variable will be false in this situation Restrictions Post flop only OnlyOneStraightPossible True if one and only one straight can be made with the current board cards For example if the board is AKQ then the only possible way to make a straight is with JT and so this variable will be true in
133. rything and you want the bot to find it first when you are getting short stacked 3 5 8 Using Comparators Another way to use StackSize in your custom preflop code is with the Relative Potsize Stacksize Comparison Condition explained in point 3 of section 3 2 1 of this manual This method involves using the BetSize AmounttoCall Totallnvested StartingStackSize or any of the opponent stack size variables and then a comparator symbol to the StackSize variable For example When AmounttoCall lt 33 StackSize call force In this case the bot will call when an opponent made a bet or raise which requires less than a third of your stack size to call You would of course usually want to further define the situation For making sure you never fold when you are pot committed you can use the Totallnvested variable to define the point where you have put so much of your stack in the pot that you simply do not want to fold This is a safe code to use in just about any NL game situation because you know that you won t be putting most of your stack in the pot without a decent holding anyway Here are some examples When TotalInvested gt 100 StackSize call force will never fold once you invest half your stack When TotalInvested gt 12096 StackSize call force will never fold once you invest most of your stack When TotalInvested gt 20096 StackSize call force more conservative requires 2 3 of your stack invested before defending Copyrigh
134. s highest Restrictions Post flop only Have2ndTopSet True if the bot has a hole pair that has the same value as the 2 highest board card Ace is highest Restrictions Post flop only Have3rdBestKicker True if the bot has the 3 best kicker the 2 best kicker or the best kicker with the current board cards to clarify this variable is also true when havebestkicker or when have2ndbestkicker is true The 3 best kicker is defined as the 3 highest valued card not currently present on the board The 2 best kicker is defined as the 2 highest valued card not currently present on the board The best kicker is defined as the highest valued card not currently present on the board Ace is highest Restrictions Post flop only Have3rdBestKickerOrBetter True if the bot has a made hand which is 3 best kicker or better given the current board cards The or better part refers to any better hand values such as a pair two pair etc and not just a better kicker Restrictions Post flop only Have3rdBestOverpairOrBetter True if the bot has a made hand which is 3 best overpair or better given the current board cards 3 best overpair is QQ with no A K or Q on board The or better part refers to any better hand values such as a pair two pair etc and not just a better overpair Restrictions Post flop only Have3rdNutFlush True if the bot has the 3 highest possible flush with the current board cards For Holdem the 3 highest possib
135. s then you also understand how to play Holdem as well Therefore this guide should enable you to custom code any of our poker bots Copyright 2008 2013 Shanky Technologies PM amp a5 Shank Technologies Page I8 P P L POKER PROGRAMMING LANGUAGE 3 1 What about a Custom Programming Interface Nice idea Right now our bots do not have a graphical interface for using PPL The code only needs to be added to a text file otherwise known as a notepad file You then read in the code into the bot using the Holdem gt Read Profile menu item The bot will parse the code while reading it and print any errors in the log window and in the Holdem log file If there are any errors the entire code is rejected You can have all your options settings in the same file as your PPL code In order to do that first save a profile Go through the option menu and select the options you want for a certain playing profile Then save the profile by going to Holdem Write Profile on the bot menu Change the name to something shorter and easy to type and click save As long as you didn t specify a different path it will be saved to the same folder you have all the bot download files in This is explained in detail in our Holdem Bot User Manual After you have saved a profile you can open it Scroll to the bottom Your customized PPL code simply needs to be pasted underneath what you see saved on that text file In fact you can even just type your code there to begin wit
136. s on This is done in sequential order from top to bottom until you get the entire code cleaned up So the first time you use the Read Profile function for a new custom profile one of two things will happen Either it will read the entire profile and find no errors and load it successfully or it will stop at the first typo it finds and return an error message Something like this Line 87 Unrecognized character Line 87 syntax error unexpected NUMBER expecting end Custom programming rejected due to errors These error messages are printed in the bot s log window and in the log file If you get an error message like this which is likely the first time reading a new profile you need to fix the referenced typo and try again If there are no further typos the profile will load successfully If there are further typos you must keep repeating this process until they all get fixed and the profile finally loads 3 7 1 Finding the Typo so You Can Correct It The error message gives you the line that the typo is on The way to go to that line is by using the Go To function in Notepad Open the profile text file go to Edit and click on Go To If Go To it is grey and not clickable you need to go to Format and click on Word Wrap once and it should become clickable Copyright 2008 2013 Shanky Technologies hank zs Techhologies Pace ied P P L POKER PROGRAMMING LANGUAGE A small window will appear that is titled Goto Line Enter the
137. ser defined variables are set to false when cards are dealt for a new hand A user defined variable is turned on or set when it appears as the action clause of a matching when condition It can then be used just like any other Boolean valued variable as part of a condition Once set the variable retains its true value until the cards are dealt for the next hand Therefore user variables that are set during an early betting round such as pre flop or the flop can be used on later streets such as the flop turn or river The user defined variable is useful for defining specific situations on an earlier betting round that are difficult to define later such as your exact pre flop table position or that of an opponent They are also handy for abbreviating longer codelines that you want to use later in the code such as a group of starting hands Careful attention should be given to their strategic placement in the code structure understanding that the line which sets the user variable must be read first in order to turn it on and knowing that when a normal action is executed no further code is read Many creative uses for the user variable are possible limited only by your own imagination Here are some examples to get your wheels turning so you can understand the possibilities better Keep in mind some of these examples may only become clear to you after you digest the rest of this manual Examples When raises gt 2 and not hand AA or h
138. ses 1 call force When raises 2 and calls gt 3 call force When raises 2 and calls lt 3 fold force When raises gt 2 fold force When hand KQ suited or hand JJ or hand TT When calls gt 4 call force When StillToAct gt 6 and raises 0 call force When BotsLastAction raise or BotsLastAction call call force When raises O raise force When raises 1 call force When raises 2 and calls gt 3 call force When raises 2 and calls lt 3 fold force When raises gt 2 fold force When hand AQ When BotsLastAction raise call force When calls gt 5 and raises 0 call force When raises O raise force When raises 1 call force When raises gt 1 fold force When hand AT suited or hand KJ suited When BotsLastAction raise or BotsLastAction call call force When raises 0 and calls lt 1 and StillToAct lt 4 raise force When raises 1 and calls gt 3 call force When raises 1 and calls lt 3 fold force When raises gt 1 fold force When others call force When hand KT suited or hand QT suited When BotsLastAction raise call force When BotsLastAction call and calls gt 3 call force Copyright 2008 2013 Shanky Technologies hank Techhologies Page 142 When raises 0 and calls 0 and StillToAct lt 3 raise force When raises 1 and calls gt 3 call force When raises 1 and calls lt 3 fold force When raises gt 1 fold force When others call force When hand QdJ
139. shPossible and not StraightPossible and not HaveSet or HaveNutLow or HaveNutLowDraw or HaveNutFlushDraw or HaveNutStraightDraw or havelOoutstraightdraw fold force When opponents lt 2 and BetSize gt 40 StackSize When not PairOnBoard and Have2ndNutFlush RaisePot force When PairOnBoard and HaveTrips and Overcards gt 2 RaisePot force When opponents 1 When not PairOnBoard and Have2ndNutFlush RaisePot force When PairOnBoard and HaveTrips and Overcards gt 2 RaisePot force When PairOnBoard and HaveTrips and hand A and not board AA RaisePot force When raises gt 1 and HaveNutLow and not HaveFlush or HaveStraight or HaveSet or HaveTwoPair or HaveFullHouse or HaveStraightDraw or HaveFlushDraw or HaveTopPair call force When LowPossible and not WheelPossible and not PairOnBoard and not FlushPossible and not board 236 or board 246 or board 256 or board 346 or board 356 or board 347 or board 357 or board 367 or board 457 or board 467 and opponents 1 When HaveLow and not HaveNutLow or Have2ndNutLow or HaveStraight and HaveTwoPair or HaveSet and bets 0 and raises 0 BetPot force When HaveLow and not HaveNutLow or Have2ndNutLow or HaveStraight and HaveTwoPair or HaveSet call force Turn When opponents and OpponentIsAllIn and BetSize lt 20 StackSize call force When not LowPossible and not FlushPossible and not StraightPossible and HaveNutFlushDraw and HaveStraightDraw
140. simply adding a fold count to the code like this When hand A suited or hand A9 or hand K9 suited or had Q9 suited When in SmallBlind and raises 0 and folds gt 3 call force When raises 0 and calls 0 and folds gt 2 and StillToAct lt 3 raise force When raises 1 fold force 3 3 12 Randomizing Actions Because each individual suit can be specified in your hole cards you can randomize actions for certain situations by cards and card suits That way you are not playing the same way in the same situation all the time The classic use for this is in bluffing situations but there are many borderline calling situations where it s a good idea to call a certain percentage of the time Many combinations can be used specifying suited hands certain suited hands and specific cards to come up with many different randomization percentages This can be done within a certain hand or hand group or for an entire situation For example on the river with top pair second best kicker you might decide to only call a large bet 2596 of the time by specifying that your first hole card is a certain suit or 5096 of the time by specifying two suits that it can be Preflop you might decide to re raise from the big blind in short handed situations 50 of the time with certain holdings by specifying suits like this When hand Ks J or hand Kh J or hand Qs J or hand Qh J or hand As T or hand Ah T When in BigBlind and raises 1 and Opponents
141. ssible else call Play same exact action as call above use either Raise generic Raise action The size of the raise depends on available buttons for the particular poker room the user defined custom raise size if any see Custom Bet Sizing below and certain option settings Will raise minimum preflop unless the Make Pot Sized Raises for option is set or a custom bet size is specified RaiseMin will raise minimum RaiseHalfPot will raise pot or max if half pot button not available and raise min if no other button available RaisePot will raise max if pot button not available and raise min if no other button available RaiseMax will raise pot if max button not available and raise min if no other button available Fold will check if available else fold Bet will bet if available otherwise will Call The size of the bet depends on available buttons for the particular poker room the user defined custom bet size if any see Custom Bet Sizing below and certain option settings Note that Bet is never available pre flop BetMin will bet minimum if bet option is available otherwise will call Note that Bet is never available pre flop BetHalfPot will bet pot if half pot button is not available otherwise will bet max if available Will bet min if no other bet option is available Will call if bet option is not available Note that Bet is never available pre flop BetPot will bet pot if button is available otherwise will bet
142. suited JT 9 or hand K Q suited J T or hand K Q suited J 9 or hand K Q suited T 9 RaiseMin force When raises 0 and calls gt 1 and hand A or hand KK or hand QQ or hand 2 234 orhand 2235 orhand 245 or hand 224 6 or hand K suited Q J T or hand K suited QJ 9 or hand K suited QT 9 or hand K suited J T 9 or hand K Q suited J T or hand K Q suited J 9 or hand K Q suited T 9 call force Flop When opponents 1 and OpponentIsAllIn and BetSize lt 20 StackSize call force When HaveNutLowDraw and HaveNutFlushDraw RaisePot force When not LowPossible and not FlushPossible and not StraightPossible and HaveNutFlushDraw and HaveStraightDraw RaisePot force When TripsOnBoard When HaveQuads call force When NutFullHouseOrFourOfAkind gt 3 or NutFullHouseOrFourOfAkind 0 fold force When StackSize lt 8 When BotsLastAction raise or BotsLastAction bet RaisePot force When not In BigBlind or In SmallBlind RaisePot force When StackSize 75 and Betsize 10 When PairOnBoard and not HaveFullHouse or HaveNutLowDraw fold force When not PairOnBoard and FlushPossible and not HaveNutFlush or HaveNutLow or HaveNutLowDraw fold force When not PairOnBoard and not FlushPossible and StraightPossible and not HaveNutStraight or HaveNutLow or HaveNutLowDraw fold force Copyright 2008 2013 Shanky Technologies hank Techhologies rP P L P a g e 81 POKER PROGRAMMING LANGUAGE When not PairOnBoard and not Flu
143. suited or hand JJ call force When others fold force When raises 1 and BetSize gt 8 and calls 0 and folds 0 and StillToAct gt 6 When hand QQ or hand or hand AKs call force When others fold force When raises 0 and calls 1 and folds 0 or raises 0 and calls 0 and folds 1 When hand AA or hand KK or hand QQ or hand AK RaisePot force When hand AQ suited or hand AJ suited or hand JJ or hand KQ suited call force When others fold force As you can see it now takes four statements to code for the exact same eight hands in the UTG 1 position where it only took one statement to code them in the UTG position As you move down in position it becomes exponentially more complicated especially since you will be adding more hands as you go Copyright 2008 2013 Shanky Technologies 9 hank Technologies Page 123 P P L POKER PROGRAMMING LANGUAGE For that reason we would highly recommend coding by hands instead of by position unless you just want to do something for one or two positions and play using the bot s option settings the rest of the time It s much easier to state a group of hands and then cover all possible positional situations below them Here is an example When hand 77 or hand 88 When raises gt 1 fold force When raises 1 and BetSize gt 5 fold force When raises 1 and BetSize lt 5 call force When opponents lt 2 and calls lt RaisePot force When opponents lt 2 an
144. t 2008 2013 Shanky Technologies A NS k Techhologies Pace 139 P P E POKER PROGRAMMING LANGUAGE That type of code is very important for tournament profiles by the way You don t want to fold with just a few chips left after committing most of your stack If you are not coding a complete profile you can skip this step and just use the option menu setting on our bot to make sure you never fold when pot committed If you are coding a complete NL profile and excluding all option menu settings and default programming then you need to decide where that pot committed threshold is and insert this type of code in a strategic place on all your betting rounds But be careful you don t stop your bot from betting and raising when you want as the above lines of code instruct it to just call when the condition is true which means checking and calling To prevent that you could use this type of code instead When TotalInvested gt 120 StackSize and bets gt 1 or raises gt 1 RaiseMax force Conversely in the late stages of a tournament you might want to push against a short stacked opponent with any two cards when your stack is so big it cannot be damaged When MaxCurrentOpponnetStacksize lt 8 stacksize raisemax force List of Comparators There are eleven variables that can be used with a comparison and of those nine can only go on the left of the percent sign The other two must always be on the right They are Left Side Rig
145. t flush draw or a backdoor nut flush draw A backdoor flush draw is defined as a hand that has three cards of a particular suit so that getting two more cards of the same suite can complete the flush Restrictions Flop only HaveBesikicker True if the bot has the best kicker with the current board cards Best kicker is defined as the highest valued card not currently present on the board Ace is highest Restrictions Post flop only Copyright 2008 2013 Shanky Technologies A S k Techhologies Page 173 PPL HaveBestKickerOrBetter True if the bot has a made hand which is best kicker or better given the current board cards Note that the or better part of this variable refers to any higher hand rank including a pair set straight full house etc Restrictions Post flop only HaveBestOverpairOrBetter True if the bot has a made hand which is best overpair or better given the current board cards Best overpair is AA with no A on board Note that the or better part of this variable refers to any higher hand rank including a pair set straight full house etc Restrictions Post flop only HaveBottomPair True if the bot has a hole card that is the same value as the lowest card on board Ace is highest Restrictions Post flop only HaveBottomSet True if the bot has a hole pair that has the same value as the lowest board card Ace is highest Restrictions Post flop only HaveBottomTwoPair True if the two lowest valued
146. the Accessories folder on your Windows start menu Please do not use Word or Wordpad for accessing or editing profiles We would however highly recommend that you download an enhanced text editor such as Notepad 2 which is free just Google it and use that instead Regular Notepad that comes in Windows can mis reference codelines plus enhanced text editors such as Notepad 2 have the codeline numbers conveniently placed on the left of the profile 2 1 Beep Feature z Fold or Beep Bot Before we get into the PPL instructions in section 3 want to mention a feature that our bots now have which appeal to an entirely new market segment One of the actions now included in PPL is Beep Beep means just what it sounds like instead of calling raising checking or folding your computer will beep at you to get your attention so you can play the hand out yourself What this means is that instead of playing poker for you you can have the software folding all the hands you don t want to play on multiple tables and then beep at you and bring the active table to the front whenever a playable hand shows up so you can play it yourself This makes the tedious task of multi tabling much less taxing on your mental faculties To create this configuration you just need to follow the directions below for customizing the bot and create a simple piece of code that lists the hands you want to play and has the action set as beep This is by far the easiest custom
147. thers fold Position the values for position are first middle and last You can only use an sign to assign the value This numerical valued variable can be used preflop as well We find that it covers play from every position very well When you have 4 opponents and are in middle position assigning position middle only identifies you as somewhere in the middle But in these post flop situations your play is usually pretty cut and dried SuitsOnBoard this is the number of different suits on the board not the number of cards of the same suit on board For example a flop of Js 9s 3h would be SuitsOnBoard 2 or SuitsOnBoard gt 1 Bet Size vs Pot Size we warned you earlier that this calculation is tricky and now here is the full explanation Your opponent s uncalled bets are included in the pot size This is necessary for being able to program simple actions based on pot size alone However it results in more complicated calculations for programming actions based on BetSize as a of PotSize The easiest example to show you is when using 100 pot size as your desired figure For example let s say you want to call in a certain situation if an opponent made less than a pot sized bet This one is simple because if the opponent bets 100 of the pot then when the action comes back to you his bet now represents 50 of the entire pot so you could simply code When BetSize lt 50 PotSize call force Always keep in m
148. using just remember the red letter rule when using the not operator in lines that have multiple or conditions defined 3 6 3 Using the Numerical valued Variables Here is a partial list of numerical valued variables that you can use post flop AmountToCall Bets BetSize BigBlindSize BotsLastAction doesn t use numbers has its own special values Calls CallsSinceLastRaise Checks Folds LowCardsInHand for Omaha Hi Lo LowCardsOnBoard for Omaha Hi Lo Copyright 2008 2013 Shanky Technologies P k Techhologies Page 51l PPL MaxCurrentOpponentStackSize NutFullHouseOrFourOfAKind has special values Opponents OpponentsAtTable OpponentsLeft Overcards OvercardsOnBoard Overcards to hand Position has special values PotSize Raises RaisesSinceLastPlay Random StackSize StartingStackSize StillToAct SuitsOnBoard Totallnvested The complete list is included in Appendix 1 along with explanations of their use and any restrictions We want to give a few of them additional treatment here to make sure you understand their proper use NutFullHouseOrFourOfAKind be careful with this one it s tricky It is so handy for paired board states however that it is almost necessary especially in Omaha games Remember that it ignores straight flush possibilities and that the better hands have a lower number rank So the nuts is 1 the 2 nuts is 2 etc Therefore when using the and symbols to ass
149. wever in most cases you probably don t want to use that with the Shanky Technologies poker bots as these programs play a good poker game by default That is you probably only want to customize a few situations and have the bot play by your option settings for everything else But if you want to write an entire set of instructions for a particular betting round you would use that at the end An example might be if you are creating a Fold or Go All In type profile for playing Turbo SNG s 3 3 4 Use the Word force after your Action User modifiable option settings can override the action specified If a conflict is found it will choose the action indicated by the option setting unless your custom code has the word force after the action Since there is usually not much point in custom coding something that will be overridden by your option settings all the code examples in this manual include the word force after each action command 3 3 5 Bet Size Value The bet size is always stated in terms of number of big blinds regardless of which betting round it is So if you want to fold pre flop for raise sizes above 4 big blinds your code snippet might look like this When hand JT suited or hand QJ suited When raises 1 and BetSize lt 4 call force When raises 1 and BetSize gt 4 fold force When raises gt 1 fold force This gets a little more complicated on later betting rounds You have to decide how big of a bet to call based on the or

Download Pdf Manuals

image

Related Search

Related Contents

  Leisure TCR1CM faucet  GaugerGSM User Manual  König SEC-APR20 motion detector  ZyXEL Centralized Network Management Vantage CNM User's Manual  DECT Web UG Eircom 9000_9000A - IE  説明 商品 規格 商品詳細 ESS-PRO 設定 ESS-PRO 使  Manuel de l`utilisateur  LifeWise 63-609 User's Manual  DELL Professional P2213  

Copyright © All rights reserved.
Failed to retrieve file