예제 #1
0
        static void PlaceBets(MarketCatalogue mc, MarketBook mb, List <CoreLib.Betfair.TO.Runner> runnersToBack)
        {
            var     betPlaced = false;
            decimal unitSize  = decimal.Parse(ConfigurationManager.AppSettings["UnitSize"]);

            Log.Info($"Unit size for {mc.MarketId}-:{unitSize:c2}");

            foreach (var runner in runnersToBack)
            {
                var betAmount = unitSize;

                List <PlaceInstruction> placeInstructions = new List <PlaceInstruction>();
                var placeInstructionBack = new PlaceInstruction();
                placeInstructionBack.Handicap    = 0;
                placeInstructionBack.SelectionId = runner.SelectionId;

                placeInstructionBack.OrderType                    = OrderType.MARKET_ON_CLOSE;
                placeInstructionBack.MarketOnCloseOrder           = new MarketOnCloseOrder();
                placeInstructionBack.MarketOnCloseOrder.Liability = (double)betAmount;
                placeInstructionBack.Side = Side.BACK;
                placeInstructions.Add(placeInstructionBack);

                var customerRef          = Guid.NewGuid().ToString().Substring(0, 20);
                var placeExecutionReport = Program.Client.placeOrders(mc.MarketId, customerRef, placeInstructions);
                Log.Info($"Placement report for {mc.MarketId}-{runner.SelectionId} BACK bets\tStatus:{placeExecutionReport.Status}\tError Code:{placeExecutionReport.ErrorCode}");
                betPlaced = true;
            }

            if (betPlaced)
            {
                Console.Beep();
            }
        }
예제 #2
0
        public static string MarketCatalogConsole(MarketCatalogue marketCatalogue)
        {
            DateTime timeToOff = MarketCatalogueStartTime(marketCatalogue);

            var timeRemainingToOff = timeToOff.Subtract(DateTime.UtcNow);

            return($"{marketCatalogue.MarketId} {marketCatalogue.Event?.Name} {marketCatalogue.MarketName} Time To Jump: {timeRemainingToOff.ToString("d'd 'h'h 'm'm 's's'")}");
        }
예제 #3
0
 private static void CheckForSleep(MarketCatalogue mc)
 {
     if (mc.Description.MarketTime > DateTime.UtcNow.AddMinutes(3))
     {
         Log.Info($"Sleeping until 2 mins before next race. {mc.Event.Venue} {mc.MarketName}");
         System.Threading.Thread.Sleep(120000);
     }
     else
     {
         System.Threading.Thread.Sleep(15000); //avoid hitting the API too often
         Log.Info($"Sleeping 15s");
     }
 }
예제 #4
0
        public GetCoeffKindParams(Runner runner, MarketCatalogue marketCatalogue, double?runnerHandicap)
        {
            Runner          = runner;
            MarketCatalogue = marketCatalogue;
            Handicap        = runnerHandicap;

            var teames = marketCatalogue.Event.Name.ToLower().Split(new[] { " v ", " @ " }, StringSplitOptions.RemoveEmptyEntries);

            FirstTeam  = teames[0];
            SecondTeam = teames[1];

            Mapping[FirstTeam]  = "1";
            Mapping[SecondTeam] = "2";
        }
예제 #5
0
        private static void PlaceTradesIfRequired(MarketCatalogue mc, MarketBook mb, List <CoreLib.Betfair.TO.Runner> runnersToBack, double marketPct)
        {
            if (marketPct > double.Parse(ConfigurationManager.AppSettings["MaxAllowableMarketPct"]))
            {
                Log.Info($"Market percentage for {mc.MarketId} is very high at {marketPct}.  Will not place bets");
                return;
            }

            if (!MarketsBetOn.Contains(mb.MarketId) && mc.Description.MarketTime < DateTime.UtcNow)
            {
                MarketsBetOn.Add(mb.MarketId);
                Log.Info($"Trade Placement for {mc.Event.Name} {mc.MarketName}");
                PlaceBets(mc, mb, runnersToBack);
            }
        }
예제 #6
0
        public static IList <LineDTO> Convert(MarketCatalogue marketCatalogue, MarketBook marketBook, Action <LineDTO> action)
        {
            var lines = new List <LineDTO>();

            foreach (var runner in marketBook.Runners)
            {
                decimal?сoeffParam;
                var     coeffKind = GetCoeffKind(new GetCoeffKindParams(runner, marketCatalogue, runner.Handicap), out сoeffParam);

                if (string.IsNullOrEmpty(coeffKind))
                {
                    continue;
                }

                var coeffType = GetCoeffType(new GetCoeffKindParams(runner, marketCatalogue, runner.Handicap));

                //берем меньший кэф
                var price = runner.ExchangePrices.AvailableToBack.OrderBy(x => x.Price).FirstOrDefault(x => x.Size > 100.0);

                if (price != null)
                {
                    var line = new LineDTO
                    {
                        CoeffParam = сoeffParam,
                        CoeffKind  = coeffKind,
                        CoeffValue = (decimal)price.Price,
                        CoeffType  = coeffType
                    };


                    line.SerializeObject(new LineInfo
                    {
                        Size        = price.Size,
                        MarketId    = marketBook.MarketId,
                        SelectionId = runner.SelectionId,
                        Handicap    = runner.Handicap
                    });

                    //line.LineData = string.Join(",", runner.ExchangePrices.AvailableToLay.Where(x => x.Size > 10.0).Select(f => (decimal)f.Price));

                    action(line);
                    line.UpdateName();
                    lines.Add(line);
                }
            }

            return(lines);
        }
예제 #7
0
        private static void GenerateTrades(MarketCatalogue mc, MarketBook mb, out List <CoreLib.Betfair.TO.Runner> ret, out double marketPct)
        {
            ret       = null;
            marketPct = 0;
            var ratingMeeting = (from m in Ratings.meetings where m.name.ToUpper() == mc.Event.Venue.ToUpper() select m).FirstOrDefault();

            if (ratingMeeting == null)
            {
                Log.Info($"No ratings for {mc.Event.Name} {mc.MarketName}");
                return;
            }

            var ratingsRace = (from r in ratingMeeting.races where r.bfExchangeMarketId == mc.MarketId select r).FirstOrDefault();

            if (ratingsRace == null)
            {
                return;
            }

            ret = new List <CoreLib.Betfair.TO.Runner>();
            var overs = float.Parse(ConfigurationManager.AppSettings["OversNeeded"]);

            foreach (var runner in mb.Runners)
            {
                var catalogueRunner = (from r in mc.Runners where r.SelectionId == runner.SelectionId select r).FirstOrDefault();
                if (catalogueRunner != null)
                {
                    var modelRunner = (from runners in ratingsRace.runners where runners.name == catalogueRunner.RunnerName select runners).FirstOrDefault();
                    if (modelRunner != null)
                    {
                        if (runner.LastPriceTraded > modelRunner.ratedPrice * overs)
                        {
                            ret.Add(runner);
                        }
                    }
                }

                if (runner.LastPriceTraded.HasValue)
                {
                    marketPct += (1.0 / (double)runner.LastPriceTraded);
                }
            }
        }
예제 #8
0
        public static string MarketBookConsole(
            MarketCatalogue marketCatalogue,
            MarketBook marketBook,
            IEnumerable <RunnerCatalog> runnerDescriptions,
            Func <RunnerCatalog, Runner, string> backSide = null,
            Func <RunnerCatalog, Runner, string> laySide  = null)
        {
            var nearestBacks = marketBook.Runners
                               .Where(c => c.Status == RunnerStatus.ACTIVE)
                               .Select(c => c.ExchangePrices.AvailableToBack.Count > 0 ? c.ExchangePrices.AvailableToBack.First().Price : 0.0);
            var nearestLays = marketBook.Runners
                              .Where(c => c.Status == RunnerStatus.ACTIVE)
                              .Select(c => c.ExchangePrices.AvailableToLay.Count > 0 ? c.ExchangePrices.AvailableToLay.First().Price : 0.0);

            var timeToJump          = Convert.ToDateTime(marketCatalogue.Event.OpenDate);
            var timeRemainingToJump = timeToJump.Subtract(DateTime.UtcNow);

            var sb = new StringBuilder()
                     .AppendFormat("{0} {1}", marketCatalogue.Event.Name, marketCatalogue.MarketName)
                     .AppendFormat(" : {0}% {1}%", BFHelpers.GetMarketEfficiency(nearestBacks).ToString("0.##"), BFHelpers.GetMarketEfficiency(nearestLays).ToString("0.##"))
                     .AppendFormat(" : Status={0}", marketBook.Status)
                     .AppendFormat(" : IsInplay={0}", marketBook.IsInplay)
                     .AppendFormat(" : Runners={0}", marketBook.NumberOfActiveRunners)
                     .AppendFormat(" : Matched={0}", marketBook.TotalMatched.ToString("C0"))
                     .AppendFormat(" : Avail={0}", marketBook.TotalAvailable.ToString("C0"));

            sb.AppendLine();
            sb.AppendFormat("Time To Jump: {0}h {1}:{2}",
                            timeRemainingToJump.Hours + (timeRemainingToJump.Days * 24),
                            timeRemainingToJump.Minutes.ToString("##"),
                            timeRemainingToJump.Seconds.ToString("##"));
            sb.AppendLine();

            if (marketBook.Runners != null && marketBook.Runners.Count > 0)
            {
                foreach (var runner in marketBook.Runners.Where(c => c.Status == RunnerStatus.ACTIVE))
                {
                    var runnerName = runnerDescriptions?.FirstOrDefault(c => c.SelectionId == runner.SelectionId);
                    var bsString   = backSide != null?backSide(runnerName, runner) : "";

                    var lyString = laySide != null?laySide(runnerName, runner) : "";

                    string consoleRunnerName = runnerName != null ? runnerName.RunnerName : "null";

                    sb.AppendLine(string.Format("{0} {9} [{1}] {2},{3},{4}  ::  {5},{6},{7} [{8}] {10}",
                                                consoleRunnerName.PadRight(25),
                                                runner.ExchangePrices.AvailableToBack.Sum(a => a.Size).ToString("0").PadLeft(7),
                                                runner.ExchangePrices.AvailableToBack.Count > 2 ? runner.ExchangePrices.AvailableToBack[2].Price.ToString("0.00").PadLeft(6) : "  0.00",
                                                runner.ExchangePrices.AvailableToBack.Count > 1 ? runner.ExchangePrices.AvailableToBack[1].Price.ToString("0.00").PadLeft(6) : "  0.00",
                                                runner.ExchangePrices.AvailableToBack.Count > 0 ? runner.ExchangePrices.AvailableToBack[0].Price.ToString("0.00").PadLeft(6) : "  0.00",
                                                runner.ExchangePrices.AvailableToLay.Count > 0 ? runner.ExchangePrices.AvailableToLay[0].Price.ToString("0.00").PadLeft(6) : "  0.00",
                                                runner.ExchangePrices.AvailableToLay.Count > 1 ? runner.ExchangePrices.AvailableToLay[1].Price.ToString("0.00").PadLeft(6) : "  0.00",
                                                runner.ExchangePrices.AvailableToLay.Count > 2 ? runner.ExchangePrices.AvailableToLay[2].Price.ToString("0.00").PadLeft(6) : "  0.00",
                                                runner.ExchangePrices.AvailableToLay.Sum(a => a.Size).ToString("0").PadLeft(7),
                                                bsString,
                                                lyString));
                }
            }

            return(sb.ToString());
        }
예제 #9
0
 public static DateTime MarketCatalogueStartTime(MarketCatalogue marketCatalogue)
 {
     return(marketCatalogue.MarketStartTime.CompareTo(DateTime.MinValue) == 0
         ? Convert.ToDateTime(marketCatalogue.Description?.MarketTime)
         : marketCatalogue.MarketStartTime);
 }