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(); } }
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'")}"); }
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"); } }
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"; }
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); } }
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); }
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); } } }
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()); }
public static DateTime MarketCatalogueStartTime(MarketCatalogue marketCatalogue) { return(marketCatalogue.MarketStartTime.CompareTo(DateTime.MinValue) == 0 ? Convert.ToDateTime(marketCatalogue.Description?.MarketTime) : marketCatalogue.MarketStartTime); }