private List <ForecastJson> GetForecastsLoseSeries(List <ForecastJson> forecasts, long?checkPointForecastId, int threadNumbers) { ForecastJson forecast = forecasts.FirstOrDefault(x => x.Id == checkPointForecastId); if (forecast == null) { return(forecasts); } var dates = new List <DateTimeOffset>(); for (var i = 0; i < threadNumbers; i++) { int index = i; dates.Add(forecasts.LastOrDefault(x => x.ThreadNumber == index && x.GameResultType == GameResultType.Win && x.GameAt < forecast.GameAt.AddDays(-3))?.GameAt ?? forecast.GameAt); dates.Add(forecasts.FirstOrDefault(x => x.ThreadNumber == index && x.GameResultType == GameResultType.Win && x.GameAt > forecast.GameAt.AddDays(3))?.GameAt ?? forecast.GameAt); } DateTimeOffset minDate = dates.Min().AddDays(-3); DateTimeOffset maxDate = dates.Max().AddDays(3); return(forecasts.Where(x => x.GameAt < maxDate && x.GameAt > minDate).ToList()); }
public async Task SynchronizeForecastsAsync() { List <ForecastJson> existingData = _dataService.GetForecasts(); List <ForecastJson> forecasts = await _gamblingSupportService.GetForecastsAsync(1); forecasts = forecasts.Where(x => x.ForecastType == ForecastType.Paid && x.Coefficient > 1.7).ToList(); _dataService.InitializeThreadNumbers(forecasts); foreach (ForecastJson forecast in forecasts) { ForecastJson existsForecast = existingData.FirstOrDefault(x => x.Id == forecast.Id); if (existsForecast != null) { forecast.Coefficient = existsForecast.Coefficient; forecast.GameResultType = GetGameResultType(existsForecast.GameResultType, forecast.GameResultType); forecast.ShowAt = existsForecast.ShowAt; forecast.BetValue = existsForecast.BetValue; forecast.AllowModification = existsForecast.AllowModification; forecast.ThreadNumber = existsForecast.ThreadNumber; } } forecasts = forecasts.AsEnumerable().Reverse().ToList(); SetModificationRestrictions(forecasts); await _dataService.SaveForecastsAsync(forecasts, false); }
public async Task <StateJson> CalculateNextStateAsync(long forecastId, decimal?betValue = null, bool?allowIncreaseBet = null, StateJson lastState = null) { return(await Task.Run(() => { ForecastJson forecast = _dataService.GetForecastBy(forecastId); ForecastJson previousForecast = _dataService.GetLastCalculatedForecastByIndex(forecast.ThreadNumber); SettingsJson settings = _dataService.GetSettings(); return CalculateNextAlgorithmState(forecast, previousForecast, lastState: lastState, settings: settings, allowIncreaseBet: allowIncreaseBet ?? settings.AllowIncreaseBetValue, betValue: betValue); })); }
private StateJson CalculateNextAlgorithmState(ForecastJson currentForecast, ForecastJson previousForecast, StateJson lastState = null, SettingsJson settings = null, bool allowIncreaseBet = false, decimal?betValue = null) { if (currentForecast == null) { return(null); } if (lastState == null) { lastState = _dataService.GetLastState(); } StateJson state = lastState.Copy(); state.ForecastId = currentForecast.Id; if (previousForecast?.GameResultType == GameResultType.Expectation) { return(state); } int index = currentForecast.ThreadNumber; if (allowIncreaseBet) { SetNewInitialBetValue(state, settings); } int numberOfLoses = CalculateNumberOfLoses(settings?.IncreaseBetValueWhenDefeat, previousForecast?.GameResultType, state.LoseNumbers[index]); if (previousForecast == null) { state.Bets[index] = betValue ?? GetBetValue(state.InitialBet, state.LoseValues[index], currentForecast.Coefficient, settings?.BetValueRoundDecimals ?? 2, numberOfLoses); state.Bank -= state.Bets[index]; return(state); } decimal result = CalculateResult(lastState.Bets[index], previousForecast.GameResultType, previousForecast.Coefficient); if (result < 0) { state.LoseValues[index] += lastState.Bets[index]; state.LoseNumbers[index] += 1; } else { if (previousForecast.GameResultType == GameResultType.Expectation) { state.Bank += lastState.Bets[index]; } else { state.Bank += result; } if (previousForecast.GameResultType == GameResultType.Win) { state.LoseValues[index] = 0; state.LoseNumbers[index] = 0; } } state.Bets[index] = betValue ?? GetBetValue(state.InitialBet, state.LoseValues[index], currentForecast.Coefficient, settings?.BetValueRoundDecimals ?? 2, numberOfLoses); state.Bank -= state.Bets[index]; return(state); }