/// <summary> /// Gets lookup table of historical daily bars lists for all assets from Alpaca REST API endpoint. /// </summary> /// <param name="request">Historical daily bars request parameters.</param> /// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param> /// <returns>Read-only list of daily bars for specified asset.</returns> public async Task <IReadOnlyDictionary <String, IReadOnlyList <IAgg> > > GetBarSetAsync( BarSetRequest request, CancellationToken cancellationToken = default) { request.EnsureNotNull(nameof(request)).Validate(); var builder = new UriBuilder(_httpClient.BaseAddress) { Path = _httpClient.BaseAddress.AbsolutePath + $"bars/{request.TimeFrame.ToEnumString()}", Query = new QueryBuilder() .AddParameter("symbols", String.Join(",", request.Symbols)) .AddParameter((request.AreTimesInclusive ? "start" : "after"), request.TimeInterval.From, "O") .AddParameter((request.AreTimesInclusive ? "end" : "until"), request.TimeInterval.Into, "O") .AddParameter("limit", request.Limit) }; var response = await _httpClient .GetSingleObjectAsync <IReadOnlyDictionary <String, List <JsonAlpacaAgg> >, Dictionary <String, List <JsonAlpacaAgg> > >( FakeThrottler.Instance, builder, cancellationToken) .ConfigureAwait(false); return(response.ToDictionary( kvp => kvp.Key, kvp => (IReadOnlyList <IAgg>)kvp.Value.AsReadOnly())); }
/// <inheritdoc /> public Task <IReadOnlyDictionary <String, IReadOnlyList <IAgg> > > GetBarSetAsync( BarSetRequest request, CancellationToken cancellationToken = default) => _httpClient.GetAsync <String, IReadOnlyList <IAgg>, String, List <JsonAlpacaAgg> >( request.EnsureNotNull(nameof(request)).Validate().GetUriBuilder(_httpClient), StringComparer.Ordinal, cancellationToken, _alpacaRestApiThrottler);