public async Task InitializeCandles(int exchangeId) { using (var scope = _serviceProvider.GetRequiredService <IServiceScopeFactory>().CreateScope()) { var marketRepo = scope.ServiceProvider.GetRequiredService <IMarketRepository>(); var candleChartRepo = scope.ServiceProvider.GetRequiredService <ICandleChartRepository>(); var exchangeAccessService = scope.ServiceProvider.GetRequiredService <IExchangeAccessService>(); var marketSymbols = this.GetMarketsNeeded(); foreach (var symbol in marketSymbols) { var market = await marketRepo.GetByCurrencyPairAsync(symbol.Value, symbol.Key, exchangeId); if (market != null) { foreach (var period in CandlePeriod.List()) { var existingCandleChart = await candleChartRepo.GetByCurrencyPairAsync(symbol.Value, symbol.Key, exchangeId, period); if (existingCandleChart == null) { var toAdd = CandleChart.FromMarket(market, period); candleChartRepo.Add(toAdd); await candleChartRepo.UnitOfWork.SaveEntitiesAsync(); } } } } } }
public async Task Handle(BacktestingTraceStartedIntegrationEvent @event) { try { var exchangeId = @event.ExchangeId; var baseCurrency = @event.BaseCurrency; var quoteCurrency = @event.QuoteCurrency; //DateTime dtDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc); var from = @event.From; var to = @event.To; var result = new Dictionary <string, List <CryptoTrading.Services.ExchangeAccess.API.Application.Models.Candle> >(); foreach (var period in CandlePeriod.List()) { var candleChart = await _candleChartRepository.GetByCurrencyPairAsync(baseCurrency, quoteCurrency, exchangeId, period); if (candleChart != null) { var updatedChart = candleChart; DateTime fromWithWarmingPeriod = from; var oneCandleMinutes = CandlePeriodService.GetOneCandleMinutesByPeriod(period); fromWithWarmingPeriod = fromWithWarmingPeriod.AddMinutes(-oneCandleMinutes); if (@event.MinAmountOfCandles.TryGetValue(period.Name, out int warmingPeriod)) { fromWithWarmingPeriod = fromWithWarmingPeriod.AddMinutes(-(oneCandleMinutes * warmingPeriod)); } if (!candleChart.HasCompleteCandlesBetween(fromWithWarmingPeriod, to)) { var candles = await this._exchangeAccessService.GetCandlesData( exchangeId, baseCurrency, quoteCurrency, period, fromWithWarmingPeriod, to); foreach (var candle in candles) { candleChart.UpdateCandle(candle.Timestamp, candle.High, candle.Low, candle.Open, candle.Close, candle.Volume); } updatedChart = this._candleChartRepository.Update(candleChart); await this._candleChartRepository.UnitOfWork.SaveEntitiesAsync(); } var candlesData = updatedChart.GetCandles(fromWithWarmingPeriod, to); var data = new List <CryptoTrading.Services.ExchangeAccess.API.Application.Models.Candle>(); foreach (var candle in candlesData) { data.Add(new CryptoTrading.Services.ExchangeAccess.API.Application.Models.Candle { Timestamp = candle.Timestamp, Open = candle.Open, Close = candle.Close, High = candle.High, Low = candle.Low, Volume = candle.Volume }); } result.Add(period.Name, data); } } await this._exchangeAccessIntegrationEventService.PublishThroughEventBusAsync( new BacktestingDataCreatedIntegrationEvent( @event.TraceId, @event.InvestmentId, @event.ExchangeId, @event.BaseCurrency, @event.QuoteCurrency, @event.From.ToTimestamp(), @event.To.ToTimestamp(), result)); } catch (Exception ex) { Console.WriteLine("Handle Integration Event: BacktestingTraceStartedIntegrationEvent."); Console.WriteLine("Result: Failure."); Console.WriteLine("Error Message: " + ex.Message); } }