Example #1
0
        public async Task <IEnumerable <IFeedCandle> > GetCandlesAsync(PriceType priceType, TimeInterval interval, DateTime from, DateTime to)
        {
            if (priceType == PriceType.Unspecified)
            {
                throw new ArgumentException(nameof(priceType));
            }

            var partitionKey = CandleTableEntity.GeneratePartitionKey(priceType);
            var rowKeyFrom   = CandleTableEntity.GenerateRowKey(from, interval);
            var rowKeyTo     = CandleTableEntity.GenerateRowKey(to, interval);

            var query      = new TableQuery <CandleTableEntity>();
            var pkeyFilter = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, partitionKey);

            var rowkeyCondFrom = TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.GreaterThanOrEqual, rowKeyFrom);
            var rowkeyCondTo   = TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.LessThanOrEqual, rowKeyTo);
            var rowkeyFilter   = TableQuery.CombineFilters(rowkeyCondFrom, TableOperators.And, rowkeyCondTo);

            query.FilterString = TableQuery.CombineFilters(pkeyFilter, TableOperators.And, rowkeyFilter);

            var entities = await _tableStorage.WhereAsync(query);

            var result = from e in entities
                         select e.Candles.Select(ci => ci.ToCandle(e.PriceType == PriceType.Bid, e.DateTime, interval));

            return(result
                   .SelectMany(c => c)
                   .Where(c => c.DateTime >= from && c.DateTime < to));
        }
Example #2
0
 public static string PartitionKey(this IFeedCandle candle, PriceType priceType)
 {
     if (candle == null)
     {
         throw new ArgumentNullException(nameof(candle));
     }
     return(CandleTableEntity.GeneratePartitionKey(priceType));
 }
Example #3
0
        public async Task InsertOrMergeAsync(IFeedCandle candle, PriceType priceType, TimeInterval interval)
        {
            // Get candle table entity
            var partitionKey = CandleTableEntity.GeneratePartitionKey(priceType);
            var rowKey       = CandleTableEntity.GenerateRowKey(candle.DateTime, interval);

            var entity = await _tableStorage.GetDataAsync(partitionKey, rowKey) ??
                         new CandleTableEntity(partitionKey, rowKey);

            // Merge candle
            entity.MergeCandle(candle, interval);

            // Update
            await _tableStorage.InsertOrMergeAsync(entity);
        }
Example #4
0
        public async Task <IFeedCandle> GetCandleAsync(PriceType priceType, TimeInterval interval, DateTime dateTime)
        {
            if (priceType == PriceType.Unspecified)
            {
                throw new ArgumentException(nameof(priceType));
            }

            // 1. Get candle table entity
            var partitionKey = CandleTableEntity.GeneratePartitionKey(priceType);
            var rowKey       = CandleTableEntity.GenerateRowKey(dateTime, interval);

            CandleTableEntity entity = await _tableStorage.GetDataAsync(partitionKey, rowKey);

            // 2. Find required candle in candle list by tick
            if (entity != null)
            {
                var tick       = dateTime.GetIntervalTick(interval);
                var candleItem = entity.Candles.FirstOrDefault(ci => ci.Tick == tick);
                return(candleItem.ToCandle(priceType == PriceType.Bid, entity.DateTime, interval));
            }
            return(null);
        }