public async Task SubscribeOnCandles(string currencyPairId, CandlePeriod period, Action <IList <Candle> > callback, int limit = 30) { Connect(); var innerPeriod = period.ToInnerFormat(); var dateFrom = DateTime.UtcNow; switch (period) { case CandlePeriod.Minute1: dateFrom = dateFrom.AddMinutes(-(limit * 1)); break; case CandlePeriod.Minute3: dateFrom = dateFrom.AddMinutes(-(limit * 3)); break; case CandlePeriod.Minute5: dateFrom = dateFrom.AddMinutes(-(limit * 5)); break; case CandlePeriod.Minute15: dateFrom = dateFrom.AddMinutes(-(limit * 15)); break; case CandlePeriod.Minute30: dateFrom = dateFrom.AddMinutes(-(limit * 30)); break; case CandlePeriod.Hour1: dateFrom = dateFrom.AddHours(-(limit * 1)); break; case CandlePeriod.Hour4: dateFrom = dateFrom.AddHours(-(limit * 4)); break; case CandlePeriod.Day1: dateFrom = dateFrom.AddDays(-(limit * 1)); break; case CandlePeriod.Day7: dateFrom = dateFrom.AddDays(-(limit * 7)); break; case CandlePeriod.Month1: dateFrom = dateFrom.AddMonths(-(limit * 1)); break; } var dateTo = DateTime.UtcNow; var innerExistingCandles = await _connection.Context.MarketCandlesAsync(currencyPairId, dateFrom, dateTo, innerPeriod); var existingCandles = innerExistingCandles.Candles.Select(candle => candle.ToOuterModel()).ToList(); callback(existingCandles); var subscription = new Subscription { SubscribeRequest = StreamingRequest.SubscribeCandle(currencyPairId, innerPeriod), UnsubscribeRequest = StreamingRequest.UnsubscribeCandle(currencyPairId, innerPeriod), EventHandler = (o, e) => { if (!(e.Response is CandleResponse candleResponse) || candleResponse.Payload.Figi != currencyPairId || candleResponse.Payload.Interval != innerPeriod) { return; } var candle = candleResponse.Payload.ToOuterModel(); callback(new List <Candle> { candle }); } }; _connection.StreamingEventReceived += (o, e) => subscription.EventHandler(o, e); await _connection.Context.SendStreamingRequestAsync(subscription.SubscribeRequest); }