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. }
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); } }
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); }
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); }
private void Alert(OptimumValues optimumValues) { // check if a notification should be sent and then send notification. }