public async Task <IFeedHistory> GetAsync(string assetPairId, string priceType, DateTime feedTime)
        {
            var entity = await _tableStorage.GetDataAsync(FeedHistoryEntity.GeneratePartition(assetPairId, priceType),
                                                          FeedHistoryEntity.GenerateRowKey(feedTime));

            return(entity?.ToDto());
        }
        public async Task <IEnumerable <IFeedHistory> > GetLastTenMinutesAskAsync(string assetPairId)
        {
            var rangeQuery = AzureStorageUtils.QueryGenerator <FeedHistoryEntity>
                             .GreaterThanQuery(FeedHistoryEntity.GeneratePartition(assetPairId, PriceType.Ask),
                                               FeedHistoryEntity.GenerateRowKey(DateTime.UtcNow.AddMinutes(-10)));

            return((await _tableStorage.WhereAsync(rangeQuery)).Select(x => x.ToDto()));
        }
        public async Task <IEnumerable <IFeedHistory> > GetAsync(string assetPairId, string priceType,
                                                                 DateTime @from, DateTime to)
        {
            var entities = await _tableStorage.GetDataAsync(FeedHistoryEntity.GeneratePartition(assetPairId, priceType),
                                                            entity =>
            {
                var dt = FeedHistoryExt.ParseFeedTime(entity.RowKey);
                return(dt > @from && dt < to);
            });

            return(entities.Select(x => x.ToDto()));
        }
        public async Task <IFeedHistory> GetСlosestAvailableAsync(string assetPairId, string priceType, DateTime feedTime)
        {
            var rangeQuery = AzureStorageUtils.QueryGenerator <FeedHistoryEntity>
                             .GreaterThanQuery(FeedHistoryEntity.GeneratePartition(assetPairId, priceType),
                                               FeedHistoryEntity.GenerateRowKey(feedTime)).Take(1);

            var resList = new List <FeedHistoryEntity>();
            await _tableStorage.ExecuteAsync(rangeQuery, entities =>
            {
                resList.AddRange(entities);
            }, () => false);

            return(resList.Any() ? resList.First().ToDto() : null);
        }
        public static FeedHistoryDto ToDto(this FeedHistoryEntity entity)
        {
            var dto = new FeedHistoryDto();

            //example: "BTCCHF_Bid"
            var assetPriceTypeVals = entity.PartitionKey.Split('_');

            dto.AssetPair = assetPriceTypeVals[0];
            dto.PriceType = assetPriceTypeVals[1];

            dto.TradeCandles = ParseCandles(entity.Data);
            dto.FeedTime     = ParseFeedTime(entity.RowKey);

            return(dto);
        }