/// <summary>
        /// Default Constructor
        /// </summary>
        public Exchange(IList <CurrencyPair> currencyPairs)
        {
            /*_currencyPairs.Add(CurrencyConstants.BtcLtc);
             * _currencyPairs.Add(CurrencyConstants.XbtLtc);
             * _currencyPairs.Add(CurrencyConstants.BtcLtcSeparated);
             * _currencyPairs.Add(CurrencyConstants.XbtLtcSeparated);
             * _currencyPairs.Add(CurrencyConstants.BtcDoge);
             * _currencyPairs.Add(CurrencyConstants.XbtDoge);
             * _currencyPairs.Add(CurrencyConstants.BtcDogeSeparated);
             * _currencyPairs.Add(CurrencyConstants.XbtDogeSeparated);*/
            ExtractCurrencyPairs(currencyPairs);
            foreach (var currencyPair in _currencyPairs)
            {
                LimitOrderBook orderBook      = new LimitOrderBook(currencyPair);
                DepthOrderBook depthOrderBook = new DepthOrderBook(currencyPair, 5);

                TradeListener      tradeListener     = new TradeListener();
                IOrderListener     orderListener     = new OrderListener();
                IOrderBookListener orderBookListener = new OrderBookListener();
                IBBOListener       bboListener       = new BBOListener();
                IDepthListener     depthListener     = new DepthListener();

                orderBook.OrderAccepted -= OnAccept;
                orderBook.OrderAccepted -= depthOrderBook.OnOrderAccepted;

                orderBook.OrderAccepted += OnAccept;
                orderBook.OrderAccepted += depthOrderBook.OnOrderAccepted;

                orderBook.OrderCancelled -= depthOrderBook.OnOrderCancelled;
                orderBook.OrderCancelled += depthOrderBook.OnOrderCancelled;

                orderBook.OrderBookChanged -= depthOrderBook.OnOrderBookChanged;
                orderBook.OrderBookChanged -= orderBookListener.OnOrderBookChanged;

                orderBook.OrderBookChanged += depthOrderBook.OnOrderBookChanged;
                orderBook.OrderBookChanged += orderBookListener.OnOrderBookChanged;

                orderBook.OrderChanged -= depthOrderBook.OnOrderChanged;
                orderBook.OrderChanged -= orderListener.OnOrderChanged;

                orderBook.OrderChanged += depthOrderBook.OnOrderChanged;
                orderBook.OrderChanged += orderListener.OnOrderChanged;

                orderBook.OrderFilled -= depthOrderBook.OnOrderFilled;
                orderBook.OrderFilled += depthOrderBook.OnOrderFilled;

                orderBook.TradeExecuted -= tradeListener.OnTrade;
                orderBook.TradeExecuted += tradeListener.OnTrade;

                depthOrderBook.BboChanged   -= bboListener.OnBBOChange;
                depthOrderBook.DepthChanged -= depthListener.OnDepthChanged;

                depthOrderBook.BboChanged   += bboListener.OnBBOChange;
                depthOrderBook.DepthChanged += depthListener.OnDepthChanged;

                _exchangeEssentialsList.AddEssentials(new ExchangeEssentials(orderBook, depthOrderBook, tradeListener,
                                                                             orderListener, depthListener, bboListener));
            }
        }
        /// <summary>
        /// parameterized constructor
        /// </summary>
        public Exchange(IList <CurrencyPair> currencyPairs, ExchangeEssentialsList exchangeEssentialsList)
        {
            //_currencyPairs.Add(CurrencyConstants.BtcLtc);
            //_currencyPairs.Add(CurrencyConstants.XbtLtc);
            //_currencyPairs.Add(CurrencyConstants.BtcLtcSeparated);
            //_currencyPairs.Add(CurrencyConstants.XbtLtcSeparated);
            ExtractCurrencyPairs(currencyPairs);
            _exchangeEssentialsList = exchangeEssentialsList;
            foreach (var exchangeEssential in _exchangeEssentialsList)
            {
                //TradeListener tradeListener = new TradeListener();
                //IOrderListener orderListener = new OrderListener();
                IOrderBookListener orderBookListener = new OrderBookListener();
                //IBBOListener bboListener = new BBOListener();
                //IDepthListener depthListener = new DepthListener();

                exchangeEssential.LimitOrderBook.OrderAccepted -= OnAccept;
                exchangeEssential.LimitOrderBook.OrderAccepted -= exchangeEssential.DepthOrderBook.OnOrderAccepted;

                exchangeEssential.LimitOrderBook.OrderAccepted += OnAccept;
                exchangeEssential.LimitOrderBook.OrderAccepted += exchangeEssential.DepthOrderBook.OnOrderAccepted;

                exchangeEssential.LimitOrderBook.OrderCancelled -= exchangeEssential.DepthOrderBook.OnOrderCancelled;
                exchangeEssential.LimitOrderBook.OrderCancelled += exchangeEssential.DepthOrderBook.OnOrderCancelled;

                exchangeEssential.LimitOrderBook.OrderBookChanged -= exchangeEssential.DepthOrderBook.OnOrderBookChanged;
                exchangeEssential.LimitOrderBook.OrderBookChanged -= orderBookListener.OnOrderBookChanged;

                exchangeEssential.LimitOrderBook.OrderBookChanged += exchangeEssential.DepthOrderBook.OnOrderBookChanged;
                exchangeEssential.LimitOrderBook.OrderBookChanged += orderBookListener.OnOrderBookChanged;

                exchangeEssential.LimitOrderBook.OrderChanged -= exchangeEssential.DepthOrderBook.OnOrderChanged;
                exchangeEssential.LimitOrderBook.OrderChanged -= exchangeEssential.OrderListener.OnOrderChanged;

                exchangeEssential.LimitOrderBook.OrderChanged += exchangeEssential.DepthOrderBook.OnOrderChanged;
                exchangeEssential.LimitOrderBook.OrderChanged += exchangeEssential.OrderListener.OnOrderChanged;

                exchangeEssential.LimitOrderBook.OrderFilled -= exchangeEssential.DepthOrderBook.OnOrderFilled;
                exchangeEssential.LimitOrderBook.OrderFilled += exchangeEssential.DepthOrderBook.OnOrderFilled;

                exchangeEssential.LimitOrderBook.TradeExecuted -= exchangeEssential.TradeListener.OnTrade;
                exchangeEssential.LimitOrderBook.TradeExecuted += exchangeEssential.TradeListener.OnTrade;

                exchangeEssential.DepthOrderBook.BboChanged   -= exchangeEssential.BBOListener.OnBBOChange;
                exchangeEssential.DepthOrderBook.DepthChanged -= exchangeEssential.DepthListener.OnDepthChanged;

                exchangeEssential.DepthOrderBook.BboChanged   += exchangeEssential.BBOListener.OnBBOChange;
                exchangeEssential.DepthOrderBook.DepthChanged += exchangeEssential.DepthListener.OnDepthChanged;
                //exchangeEssential.Update(tradeListener,orderListener,depthListener,bboListener);
            }
        }