Пример #1
0
        public IObservable <BookmakerOdd> GetBookmakerOdds(IObservable <SentimentDelta> probabilityDeltas, Random random)
        {
            var bookmakerSentiments = new Dictionary <string, BookmakersSentiment>();

            var changeInSentiment = probabilityDeltas.SelectMany(delta =>
            {
                var newMarket = delta.OpeningPrediction;

                var key = string.Format("{0} vs. {1}", delta.TeamA, delta.TeamB);

                if (!bookmakerSentiments.ContainsKey(key))
                {
                    bookmakerSentiments.Add(key, new BookmakersSentiment
                    {
                        PayoutVariancePct = this.payout - .93m
                    });
                    newMarket = true;
                }

                if (newMarket || delta.ClosingPrediction || random.NextDouble() >= probabilityOfBookmakerMissingSentiment)
                {
                    var bookmakerSentiment     = bookmakerSentiments[key];
                    bookmakerSentiment         = bookmakerSentiment.VarySentiment(random);
                    var bookmakerSentimentNorm = 1 + (bookmakerSentiment.HomeWinVariancePct
                                                      + bookmakerSentiment.DrawVariancePct
                                                      + bookmakerSentiment.AwayWinVariancePct);

                    var newHomeWinImpliedProbability = ((delta.HomeWinProbabilityCurrent + bookmakerSentiment.HomeWinVariancePct) / bookmakerSentimentNorm);
                    var newDrawImpliedProbability    = ((delta.DrawProbabilityCurrent + bookmakerSentiment.DrawVariancePct) / bookmakerSentimentNorm);
                    var newAwayWinImpliedProbability = ((delta.AwayWinProbabilityCurrent + bookmakerSentiment.AwayWinVariancePct) / bookmakerSentimentNorm);

                    var bookmakerOdd = new BookmakerOdd
                    {
                        Bookmaker   = this.name,
                        TeamA       = delta.TeamA,
                        TeamB       = delta.TeamB,
                        HomeWinOdds = Math.Round((this.payout + bookmakerSentiment.PayoutVariancePct) / newHomeWinImpliedProbability, 2),
                        DrawOdds    = Math.Round((this.payout + bookmakerSentiment.PayoutVariancePct) / newDrawImpliedProbability, 2),
                        AwayWinOdds = Math.Round((this.payout + bookmakerSentiment.PayoutVariancePct) / newAwayWinImpliedProbability, 2),
                        OpeningOdds = newMarket,
                        ClosingOdds = delta.ClosingPrediction
                    };

                    if (delta.ClosingPrediction)
                    {
                        bookmakerSentiments.Remove(key);
                    }

                    return(Observable.Return(bookmakerOdd));
                }
                else
                {
                    return(Observable.Empty <BookmakerOdd>());
                }
            });

            return(changeInSentiment.Publish().RefCount());
        }
Пример #2
0
        private void BroadcastBookmakerPriceUpdate(BookmakerOdd odd)
        {
            var context = GlobalHost.ConnectionManager.GetHubContext <OddsHub>();

            context.Clients.All.broadcastBookmakerPriceUpdate(odd);
        }