Comments

  • peteresgate@outlook.com
    30.9.2019 13:51:49

    Sorry about the formatting.  I copied and pasted the working code and it looked good on my side with the correct indentations etc,, but the website changed it to the posted result that is there now.  I'll look at setting up GitHub and reposting the link to the code so others who are following/learning can view and get it.

  • Stefan
    30.9.2019 9:56:56

    Peter, I do not want to patronize you, but I have got very simple question?

    Are you satisfied with what you did?

    Why did I ask?

    Because any written source code must be formatted to be readable by other programmers.

    Yes, some programming languages that use for instance { } to separate block of code, could be stripped to one line and compiler successfully build such code, but not F# where code block must be formatted by text/code indentation and you cannot used tabs:

    https://docs.microsoft.com/en-us/dotnet/fsharp/style-guide/formatting

    I mentioned that, because during weekend you posted video showing you edited bot trigger in Notepad text editor. So anyone who would like to use your code you posted in your comment, must copy and paste your text, reformat it correctly, and then will find out that your code does not do what you claim you did.

    So you waste maybe 10 minutes or more, to someone who wants to test your code. English is foreign language for me so is very hard for me to find politically correct words for your behavior.

    Please, install either Visual Code, like I show here:

    Betfair Bot Programming for Non-Developers

    Or Visual Studio Community version:

    Bfexplorer - Betfair BOT SDK

    Both IDE (Integrated Developer Environment) applications are free, unlike Microsoft Excel other betfair app use, where you must buy licenses of Microsoft Excel. Using Bfexplorer BOT SDK all applications or tools helping you to create bot trigger are for free.

    Why is using right programs/applications important when developing/writing code?

    Because like text editors with spellchecking, such IDE checks your code when writing, so any mistake in misspelling anything in code is reported. Visual Studio, or Visual Studio code offer you as well, so called IntelliSense/IntelliCode technology when writing code, so helping you to write the code:

    https://visualstudio.microsoft.com/services/intellicode/

    And finally why did I ask you to make some changes in the code?

    To force you learn something, because bot trigger code in other parts of our tutorial will be more difficult.

    I know you are not software developer, but in part 1 the source code is really readable even by non programmer, it contains plain English words like if, then, else, match, let, try, with, and some words you would maybe need to think about, like open, type, interface, member and map  

    https://en.wikipedia.org/wiki/Map_(higher-order_function)

    Please, when you want to use source code, and want to share it with others, do them favor and share it on http://github.com through Github Gist, like I do:

    https://gist.github.com/StefanBelo

    Again, you can register on github.com for free. Or just use any of other code sharing services on the Internet:

    https://www.google.com/search?q=code+sharing+service&oq=code+sharing+service

  • peteresgate@outlook.com
    30.9.2019 2:52:29
    The following is the Part 1 code with the last price traded added. In Part 2, we will build triggers into this that react to our selection position change from starting point (x seconds in play) to trigger point (The number 1 and 2 position horses both have back odds less then X (and our selection is not position 1,2 or 3) module BfexplorerBot //(* #I @"C:\Program Files (x86)\BeloSoft\Bfexplorer\" #r "BeloSoft.Data.dll" #r "BeloSoft.Betfair.API.dll" #r "BeloSoft.Bfexplorer.Domain.dll" #r "BeloSoft.Bfexplorer.Trading.dll" #r "BeloSoft.Bfexplorer.Service.Core.dll" //*) open System open BeloSoft.Data open BeloSoft.Bfexplorer.Domain open BeloSoft.Bfexplorer.Trading let toIndexes (value : string) = try value.Split(',') |> Array.map Int32.Parse |> List.ofArray with | _ -> List.empty /// /// HorseRacingBotTrigger /// type HorseRacingBotTrigger(market : Market, _selection : Selection, _botName : string, botTriggerParameters : BotTriggerParameters, _myBfexplorer : IMyBfexplorer) = let allowedSelectionIndexes = toIndexes (defaultArg (botTriggerParameters.GetParameter("AllowedSelectionIndexes")) "1,2,3") let isHorseRacingMarket() = market.MarketInfo.BetEventType.Id = 7 && market.MarketDescription.MarketType = "WIN" let getActiveSelections() = market.Selections |> Seq.filter isActiveSelection |> Seq.toList let getMySelectionsData() = maybe { if allowedSelectionIndexes.Length > 0 then let selections = getActiveSelections() let mumberOfSelections = selections.Length let maximalIndex = allowedSelectionIndexes |> List.max if mumberOfSelections >= maximalIndex then return allowedSelectionIndexes |> List.map (fun index -> selections.[index - 1]), mumberOfSelections } interface IBotTrigger with member __.Execute() = if isHorseRacingMarket() then match getMySelectionsData() with | Some (selections, mumberOfSelections) -> let mySelectionNames = selections |> List.map (fun mySelection -> mySelection.Name) |> String.concat ", " let mySelectionBookValue = selections |> List.map (fun mySelection -> mySelection.LastPriceTraded) |> List.sum TriggerResult.EndExecutionWithMessage (sprintf "\nMy selections: %s %f\nNumber of runners: %d" mySelectionNames mySelectionBookValue mumberOfSelections) | None -> TriggerResult.EndExecutionWithMessage "Failed to make my selections!" else TriggerResult.EndExecutionWithMessage "You can run this bot on a horse racing market only!" member __.EndExecution() = ()
  • Stefan
    28.9.2019 0:46:54

    Ok, but you did not specify that you want to check horse's positions in two different times. My first implementation was that bot waits till market is turned at in-play, then saves information about all allowed selections, so horse's positions is saved as well.

    At set time in race, bot checks your conditions, so favourites must be traded at that moment of checking under set price/odds.

    Then allowed selections are sorted by position change difference, so biggest position change is the first one, if this selection is not among the first three favourites, it is nominated as the selection your strategy will be executed on.

    The bot trigger again similar like I explained to you in the part 3, does not have to know anything about your criteria for entry point, so if you allow starting lay/back trading session only when the selection/horse is traded from 10.0 to 20.0, then you can simply set that to Entry Criteria for this lay trading bot.

    Now think a little bit. I hope you already know that Entry Criteria could be evaluated just once, or could be evaluated till all set Entry Criteria are met. This feature gives you two different options for your bot placing a lay bet.

    If you think more, then you will find that bfexplorer offers more bots placing a bet, or starting trading session, namely:

    Place Bet

    Be the First in Queue

    Fill or Kill

    Place Bet and Close Selection Bet Position

    Scratch Trading

    This gives you really big flexibility for different ways your bet is placed on the market selection, and closes your bet position for loss when needed.

    Of course not all of above bot strategies to place a bet are suitable for in-play markets where odds changes so rapidly as on the horse racing, therefore I would suggest to use:

    Place Bet and Close Selection Bet Position

    But of course you can test them all, or other combinations for instance:

    Place Bet, and Trailing Stop Loss

    What is very good news for you is that bot trigger code does not have to implement anything to place a bet and manage its status, so you will get simpler trigger code.

    I really cannot imagine how people could manage such strategies just in Excel spreadsheets, so traders using Bet Angel, Cymatic or Gruss software. I think they cannot run such strategies, am I right?

    Your tutorial in the part 1 is ready, I will post bot trigger code for the part 2, but first test your bot trigger for part 1, and as the simple coding exercise, change the bot trigger code to report not only horse name, but the last traded price as well.

    Here is the hint:

    https://gist.github.com/StefanBelo/a85ee8b9959b841ea423eade056cc762

  • peteresgate@outlook.com
    27.9.2019 23:57:23

    That is a great explanation :)

    Thanks for clearing that up for me.  

  • peteresgate@outlook.com
    27.9.2019 23:57:02

    After for example 20 seconds in play, I would like to check the position of the horse (using it's odds). When (if) 2 horses achieve odds less then x ( 2 for example), then re-check the position of our selection and compare it to the position it was at at 20 seconds. So if at 20 seconds, it is at position 2 and then when trigger is 2 horses are at odds below 2, it re-checks the selection and sees that it is at position 5, the selection has dropped in position.

  • Stefan
    27.9.2019 18:44:20

    How is evaluated “…our selection has dropped in position...”?

  • Stefan
    27.9.2019 17:55:07

    Peter, you do not need to program a trigger or anything for this feature, as your lay trade can be started by bot strategy: “Place Bet and Close Selection Bet Position”, and set your Profit/Loss target as required. So in your case you want to close your bet position, so by your words:

    “… so that if it looks like my trade is not going good, I'd like to limit my losses …”

    You can set Loss parameter, either by (ProfitLossType parameter) Ticks, Percentage, or exact Money value.  As the Profit parameter is required one, (Loss is not, when you set it to 0, your position is not closed for Loss) you must set it to unrealistic value.

    If you want to hedge your bet position, leave HedgingEnabled checked (set to True). When hedge the stake is calculated, I hope that you understand that, other software vendors call this procedure “green up”. Well, in this case I really do not understand your English, as no one is saying about “red up” ;-)

  • Stefan
    27.9.2019 17:15:04

    Yes, one of your requirements for horse racing strategy is to execute only if allowed number of horses will run in the race.

    This can be set in Entry Criteria: NumberOfSelections and for operator you can apply one of 5 relevant options, so this could be removed from the bot trigger code.

    Here is my bot trigger code:

    https://gist.github.com/StefanBelo/71b025e6a4c687fe98f99a258ddb6cb5

    It is 67 lines of code but actual code starts from line 19. The main bot trigger code is executed by Execute function, so algorithm for this bot code is on 11 lines.

    The bot trigger code contains one general functions  getActiveSelections (lines 35-36) as for some markets like horse racing, greyhounds, golf and so on, selections could be withdraw, we must use this function to get only active selections, in our case horses.

    One of requirements is to apply any further evaluation only on specific selections defined by order index in which betfair displays market selections. Peter named that “starting lanes”.  

    In bot trigger, bfexplorer inputs any data to bot trigger through object botTriggerParameters, so any data entered through parameter: TriggerParameters.

    On the line 18 we retrieved such parameter named: AllowedSelectionIndexes. Keep in mind that you must enter exactly this name in the parameter list, it is case sensitive. When no parameter is entered, the bot trigger code implements default value, it is set to: "1,2,3,10,11,12"  

    So horses order indexes separated by comma. As the indexes are enter as text value, the helper method “toIndexes” transforms this text to list of integers.

    The function “getMySelectionsData” (lines 38 – 48) checks whether bot trigger has valid indexes for evaluated race, and returns list of selections, and number of selections, otherwise returns nothing, to be exact in F# programming terms it returns Option.None value.

    And that is all for our first bot trigger, as mentioned before the code is executed by Execute function, and code execution can be described:

    If it is horse racing market and we can get my selections data, then it is displayed message: \nMy selections: name 1, name 2\nNumber of runners: 15”.

    If it is not horse racing market it is displayed message: "You can run this bot on a horse racing market only!".

    If there is any error in getting my selections data, then error message is displayed:

    And bot trigger execution is ended.

  • Stefan
    26.9.2019 11:09:24

    First of all, couple of hints about F# programming.  As with any programming language you can built a lot of different project types. In our case you must create .net C# or F# library project targeting .NET Framework 4.7.2, so as seen in Add a new project in Visual Studio: Library (.NET Framework).

    Ok, you have used Bfexplorer BOT SDK project: MyBotTriggers, so all should be setup. When you set this project be: Set as StartUp Project, and in the project Properties / Debug, you set Start external program:

    C:\Program Files (x86)\BeloSoft\Bfexplorer\Bfexplorer.BotUI.exe

    Then after you click Start (F5) , your project is build and bfexplorer app is executed as external program using your: MyBotTriggers.dll assembly.

    You could read here:

    http://bfexplorer.net/Articles/Content/354

    http://bfexplorer.net/Articles/Content/248

    That when debug in Visual Studio (VS) you can type in Debug / Command line arguments:

    YourUserName YourPassword True

    So when your project is executed/(started for debugging) VS start bfexplorer as well and automatically login with your betfair credentials YourUserName YourPassword. Last argument value True, means that bfexplorer is switched to Practice mode, you do not want to place real bets on betfair when debugging your bot or trigger code, right?

    Let me assume that your trigger code is correct, well actually when there were any problems with your code VS would reported errors.

    What you maybe do not know, F# programming language supports scripting

    https://blogs.msdn.microsoft.com/chrsmith/2008/09/12/scripting-in-f/

    so .fs file is normal F# source code file compiled to your targeted assembly, but .fsx is just scripting file that is actually not compiled. On my githbub:

    https://github.com/StefanBelo/Bfexplorer-BOT-SDK

    https://gist.github.com/StefanBelo

    You can find source code of such F# scripts, for instance:

    https://gist.github.com/StefanBelo/50186494957fa8a1a154866a7319d5e0

     So if you want to execute such bot trigger with "Execute Trigger Bot" as script code, your code must include referenced assemblies, have a look at from lines 7 to 14.

    On the other hand when you want to compile your bot trigger to assembly, and so debug your code like I do on attached video to this post, then you must un-comment lines 7 and 14, and rename your script file to .fs extension.

    When building bot trigger code to assembly, the bot trigger code must be the only one code in your project. It is all fine if rest of files in your project have “.fsx”, as they are not compiled, but if you have got more Bot Trigger source code files in your project with “.fs” extension, then you must set them as Build Action: None (click on file with right mouse button and in context menu: Properties)

    Why in bot trigger assembly must be just one bot trigger code?

    It is the way how bfexplorer instantiate Bot Trigger code. Your bot trigger must implement IBotTrigger interface, so bfexplorer after loading your bot trigger assembly: MyBotTriggers.dll, executes constructor of the first object implementing IBotTrigger.

    Well, yes you can have many bot triggers in your assembly, but as the mechanism of selecting the exact bot trigger just takes the first found, you must use just one bot trigger implementing IBotTrigger in your assembly.

    This mechanism is quite different for bot assemblies, have a look at on projects MyCsharpBot and MyFsharpBot, where you can find interface IBotCreator.

    I do not know what the level of understanding of .net programming, you have got, but any junior software developers should understand what I said up to now. I mean all that said should be clear for junior developer just from browsing Bfexplorer BOT SDK projects code.

    Have a look at attached video to see how easy your can debug any bot trigger code.

    What I can advise you about bot trigger programming, use bot trigger really just for triggering, orchestrating your bots that place bets, like “Place Bet” bot.

    Well, yes you have got in the trigger the option to place a bet directly, using:

    TriggerResult.PlaceBets

    But is it really a good idea, mainly when a lot of things could happen at the moment you place a bet:

    Market can be suspended.

    Your Internet connection could go down.

    Market prices could move rapidly so your bet could be placed bet unmatched.

    Just part of your bet is matched.

    Market is turned at in-play so your unmatched bet is cancelled when your bet was placed without keep attribute, and so on…

    The point is that you must manage bet status in any possible state, and bfexplorer prebuilt bots do so well.

  • Stefan
    25.9.2019 17:13:37

    Not all projects in bfexplorer bot sdk solution are using bfexplorer app as hosting environment.

    Bfexplorer Bot SDK allows you to build your own apps for betfair if for any reason you do not like to use bfexplorer app.

    Projects like:

    BetfairApiConsole, BetfairApiConsoleFSharp, BetfairApiMarketBrowsing, BfexplorerServiceConsole are console apps, so standalone application showing different kind of using bot sdk code.

    JayBeeBot project is winforms app with very simple user interface, integrating existing bot you can find in bfexplorer app.

    Projects like: MyBotTriggers or MyBotTriggersCSharp are bot trigger projects, so yes these two projects could be executing with bfexplorer app as hosting app, and using with bot: “Execute Trigger Bot”

    Projects like: MyCsharpBot or MyFsharpBot are bot assembly projects, and again they can be executed with bfexplorer ap as hosting app, and bots implemented in these projects automatically occur in My Bots to Execute dialog, when adding a new bot strategy. So these kind of bots offer parameters interface for this add bot dialog.

    Project MyConsoleScripts contains scripts that could be executed in Bfexplorer Console tool in bfexplorer app. You can automate bfexplorer tasks or interact with exposed bfexplorer objects.

    You must have at least base understanding of programming in C# or F# programming languge, or any other .net programming languge, for instance Visual basic to use Bfexplorer BOT SDK.

    Please read articles about Bfexplorer BOT SDK:

    http://bfexplorer.net/Articles/Search?text=bot sdk

  • Stefan
    25.9.2019 17:12:48

    In my example I mentioned “Place Bet” or “Place Bet and Close Selection Bet Position” bot strategies, so if you set trigger criteria for one of these bots, it is clear the bot is executed / triggered.

    There are other bots in bfexplorer arsenal that actually do not place bets, but execute other bots, so in your case you can use bot named: “Execute Bots” and set your criteria for this bot, when criteria are met, this bot executes other bot (bots) set by the parameter: BotNames.

    What does it mean?

    Your “Execute Bots” can evaluate different criteria for different selection, and execute another bot that can be executed on the other selection, depending on how you set parameter s and criteria for this action bot.

    Of course all these preprogrammed bot strategies can do what they were programmed for and what set of parameters these bots offer.

    When your strategy needs more, other betfair apps offer Excel scripting, so you must program VBA code to do what you need. In your example you would have to program in Excel VBA, conversion of market name in win horse racing markets, to race distance, and make your trigger work by evaluating race distance to allowed race distances.

    Bfexplorer offers trigger programming, so such short code is then executed by bot named: “Execute Trigger Bot”.

    On the forum you can find a lot of such examples:

    http://bfexplorer.net/Articles/Search?text=bot trigger

  • peteresgate@outlook.com
    25.9.2019 10:33:23

    I do understand what a trigger is, I just don't underdtand how to implement it with this software so if you could explain it that would be much appreciated.  So with the example of Trigger 2 of which you have explained it as a bot, how would I now make this a trigger so as to run a different bot when this trigger is true?  Thanks

  • Stefan
    25.9.2019 10:07:11

    You can execute whatever strategy you want, by other words, actually by your words you could understand:

    A trigger is set of conditions (formulas) which all must be fulfilled the trigger to be activated, fired.

    By my words, so words any software developer could understand:

    A trigger is function returning boolean value, if returned value is true, another action is executed:

    If trigger() then action()
  • peteresgate@outlook.com
    25.9.2019 9:56:17

    Hello.  Thanks for the quick  reply.  I have noticed the support is very good and fast.  I just wanted to clarify  the Trigger  2 again.  I don't want to bet on this horse, I want to bet on amother horse when this trigger is true.  I feel that this program can definitely do it, but is it something that needs to be programmed or is there a trigger  ir some method that already does this? 

  • Stefan
    25.9.2019 9:27:32

    For your Trigger 2:

    Depending on whether you want to place a bet or trade on specific horse, you can use bot strategy: “Place Bet” or “Place Bet and Close Selection Bet Position” (that is trading bot strategy).

    You set SortSelectionBy Last Price Traded, ExecuteOnSelection to 1, EvaluateEntryCriteriaOnlyOnce set to True (checked), and in Entry Criteria tab you add criteria LastPriceTraded is between 1.5 and 2.0

    Your Trigger 1 can be done by filtering markets in Event Browser and executing your strategy only on selected markets using Bot Executor.

    If you want to fully automate Trigger 1 as well, then you must realize where information about race distance is. It is in market name and is coded in miles and furlongs for GB, US and IE, and meters for the rest of countries, so 6f, 7f, 1m, 1000m and so on.

    It means that you need to transform text of race distance to meters. You did so in custom build triggers like you can see in attached videos.

    When I first executed my strategy on 6f race, and MinimumRaceDistance was set to 1760 meters, the bot did not executed my action bot “Trade 3 ticks”, as race distance did not fulfill set criteria, when I change that to 1000 meters, and top tipster’s selection fulfilled another criteria so Confidence at least 40, the bot strategy chosen nomited horse Holloa and executed trading strategy on this horse.  

    I make simple triggers for free only to my subscribers.

  • peteresgate@outlook.com
    25.9.2019 8:45:39

    I just wanted to clarify Trigger 2.  When I say any horse, I mean I'd like to use a specific horse based on current position (based on odds).  For example Trigger is when horse # 2 has odds between 1.5 and 2 (therefore obviously horse number 1 has better odds and horse number 3 has worse odds).

  • Tony
    22.9.2019 13:52:57

    Football livescores start working again this morning. I blamed nobody. Just stated what happened tonight.

  • Stefan
    22.9.2019 10:43:51

    All live score apps work in bfexplorer.

    I just wonder what your posts are about. Because you must understand that software is not mechanical thing, it cannot wear out, so if worked before it must work. Only input values could change or services could be down.

    All live score data used by betfair are provided by third parties as well, so if score does not work, you must blame data provider not my app or betfair. Do we understand each other?