Пример #1
0
        public static void Inform(OptimumValues optimumValues)
        {
            bool isNewBest = false;

            if (optimumValues.WorstPayoff > bestWorstPayoff)
            {
                bestWorstPayoff = optimumValues.WorstPayoff;
                isNewBest       = true;
            }
            LogValues(optimumValues, isNewBest);
            // OkashTODO: check based on worst payoff and time since last notification whether to notify.
            //            if to notify then send push notification and update local variables.
        }
Пример #2
0
        private static void LogValues(OptimumValues optimumValues, bool isNewBest)
        {
            string fileName = GetFullNameOfLogFile(optimumValues.GetMatchTitle());

            using (StreamWriter writer = new StreamWriter(fileName, true))
            {
                string line = "[" + DateTime.Now.ToString() + "] " + optimumValues.WorstPayoff.ToString() +
                              " - " + optimumValues.GetNotificationString();
                if (isNewBest)
                {
                    line += " (£££)";
                }
                writer.WriteLine(line);
            }
        }
Пример #3
0
        private void ProcessUpdatedOdds(Dictionary <int, ExchangePrice> value)
        {
            OptimumValues optimumValues = Optimiser.Optimise(value, _chosenRunnerId, _chosenOdds, _chosenAmount, _budget);

            if (DecisionEngine.PlaceBet(optimumValues.ChosenAlternativeAmount, optimumValues.WorstPayoff, _expectedEndingTime))
            {
                if (ExecutionEngine.PlaceBets(_provider, _matchId, optimumValues.Alternative1Id, optimumValues.Alternative1Amount,
                                              optimumValues.Alternative1Odds, optimumValues.Alternative2Id, optimumValues.Alternative2Amount, optimumValues.Alternative2Odds))
                {
                    _stopProcessing = true;
                }
            }
            // fill in the gaps... those values which were not populated by optimiser.
            optimumValues.Alternative1Name      = _runnersIndexedById[optimumValues.Alternative1Id.ToString()].Title;
            optimumValues.Alternative2Name      = _runnersIndexedById[optimumValues.Alternative2Id.ToString()].Title;
            optimumValues.ChosenAlternativeName = _runnersIndexedById[optimumValues.ChosenAlternativeId.ToString()].Title;
            // inform listeners if this needs to be informed
            Informer.Inform(optimumValues);
        }
Пример #4
0
        public static OptimumValues Optimise(Dictionary <int, ExchangePrice> oddsIndexedByRunnerId, int chosenRunnerId,
                                             decimal chosenOdds, decimal chosenAmount, decimal budget)
        {
            int[] altRunners = oddsIndexedByRunnerId.Where(p => p.Key != chosenRunnerId).Select(p => p.Key).ToArray();

            OptimumValues optimumValues = new OptimumValues();

            optimumValues.ChosenAlternativeId     = chosenRunnerId;
            optimumValues.ChosenAlternativeOdds   = chosenOdds;
            optimumValues.ChosenAlternativeAmount = chosenAmount;

            optimumValues.Alternative1Id   = altRunners[0];
            optimumValues.Alternative1Odds = oddsIndexedByRunnerId[altRunners[0]].Odds;
            optimumValues.Alternative2Id   = altRunners[1];
            optimumValues.Alternative2Odds = oddsIndexedByRunnerId[altRunners[1]].Odds;


            decimal chosenWinPayoff, alt1WinPayoff, alt2WinPayoff, minPayoff;

            for (decimal localMax = 4.0M; localMax < budget; localMax += 0.1M)
            {
                for (decimal alt1Share = 2.0M, alt2Share = localMax - alt1Share; (alt1Share <= localMax) && (alt2Share >= 2.0M); alt1Share += 0.01M)
                {
                    chosenWinPayoff = GetPayoff(chosenOdds, chosenAmount, alt1Share, alt2Share);
                    alt1WinPayoff   = GetPayoff(oddsIndexedByRunnerId[altRunners[0]].Odds, alt1Share, chosenAmount, alt2Share);
                    alt2WinPayoff   = GetPayoff(oddsIndexedByRunnerId[altRunners[1]].Odds, alt2Share, chosenAmount, alt1Share);
                    minPayoff       = Math.Min(Math.Min(chosenWinPayoff, alt1WinPayoff), alt2WinPayoff);
                    if (minPayoff > optimumValues.WorstPayoff)
                    {
                        optimumValues.WorstPayoff                = minPayoff;
                        optimumValues.Alternative1Amount         = alt1Share;
                        optimumValues.Alternative2Amount         = alt2Share;
                        optimumValues.PayoffChosenAlternativeWin = chosenWinPayoff;
                        optimumValues.PayoffAlternative1Win      = alt1WinPayoff;
                        optimumValues.PayoffAlternative2Win      = alt2WinPayoff;
                    }
                    alt2Share = localMax - alt1Share;
                }
            }

            return(optimumValues);
        }
Пример #5
0
 private void Alert(OptimumValues optimumValues)
 {
     // check if a notification should be sent and then send notification.
 }