public AnalyticsManager(IAnalyticsStorage analyticsStorage, List <double> precisions, List <int> markets, List <OrderInfo> orders, int tradesHistorySize = 100)
 {
     this.analyticsStorage = analyticsStorage ?? throw new ArgumentNullException(nameof(analyticsStorage));
     AnalyticsExchange     = AnalyticsExchange.RestoreExchange(markets, orders);
     PriceHistoryManager   = new PriceHistoryManager(analyticsStorage, markets ?? throw new ArgumentNullException(nameof(markets)));
     TradesHistoryManager  = new TradesHistoryManager(markets, tradesHistorySize);
     MarketDepthsManager   = new MarketDepthsManager(markets, precisions, AnalyticsExchange.OrderMap);
     MarketTickersManager  = new MarketTickersManager(markets, PriceHistoryManager);
 }
        public async Task OnUpdates(ExchangeUpdate updates)
        {
            await syncRoot.WaitAsync();

            try
            {
                AnalyticsExchange.OnUpdates(updates);
                await PriceHistoryManager.OnTrade(updates);

                TradesHistoryManager.OnTrade(updates);
                MarketDepthsManager.OnOrderUpdates(updates);
            }
            catch (Exception exc)
            {
                //TODO: add support for delayed trades, now it failes during rising
                OnError?.Invoke(exc);
                logger.Error(exc);
            }
            finally
            {
                syncRoot.Release();
            }
        }
        public async Task Restore(DateTime dateTime)
        {
            await PriceHistoryManager.Restore(dateTime);

            MarketDepthsManager.Restore(dateTime);
        }