private async Task UpdateTicker(MarketTicker marketTicker, DateTime updateDate)
        {
            var frames = await framesManager.GetPriceHistory(0, marketTicker.Market, period);

            var fromDate         = DateTime.UtcNow.AddDays(-1);
            var framesFor24Hours = frames.frames.TakeWhile(f => f.StartTime >= fromDate);

            if (framesFor24Hours.Count() < 1)
            {
                return;
            }

            marketTicker.Open          = framesFor24Hours.Last().Open;
            marketTicker.Close         = framesFor24Hours.First().Close;
            marketTicker.High          = framesFor24Hours.Select(f => f.High).Max();
            marketTicker.Low           = framesFor24Hours.Select(f => f.Low).Min();
            marketTicker.BaseVolume    = framesFor24Hours.Sum(f => f.BaseVolume);
            marketTicker.CounterVolume = framesFor24Hours.Sum(f => f.CounterVolume);
            marketTicker.UpdatedAt     = updateDate;
        }
        public async Task Update()
        {
            try
            {
                var updateDate = DateTime.UtcNow;
                await syncRoot.WaitAsync();

                foreach (var market in markets)
                {
                    if (!tickers.TryGetValue(market, out var currentTicker))
                    {
                        currentTicker = new MarketTicker(market);
                        tickers.Add(market, currentTicker);
                    }
                    await UpdateTicker(currentTicker, updateDate);
                }
            }
            finally
            {
                syncRoot.Release();
            }
        }