public RealtimeOrderBookClient(string ProductString, CBAuthenticationContainer auth = null)
        {
            this.ProductString          = ProductString;
            this.productOrderBookClient = new ProductOrderBookClient(auth);

            Sells = new ObservableSortedDictionary <decimal, ObservableLinkedList <BidAskOrder> >(new DescendingComparer <decimal>());
            Buys  = new ObservableSortedDictionary <decimal, ObservableLinkedList <BidAskOrder> >(new DescendingComparer <decimal>());

            this.RealtimeOrderBookSubscription = new RealtimeOrderBookSubscription(ProductString, auth);
            this.RealtimeOrderBookSubscription.RealtimeOpen   += OnOpen;
            this.RealtimeOrderBookSubscription.RealtimeDone   += OnDone;
            this.RealtimeOrderBookSubscription.RealtimeMatch  += OnMatch;
            this.RealtimeOrderBookSubscription.RealtimeChange += OnChange;
            //await ResetStateWithFullOrderBook();
        }
        public RealtimeOrderBookClient(string ProductString, RealtimeOrderBookSubscription realtimeOrderBookSubscription,
                                       CBAuthenticationContainer auth = null)
        {
            this.ProductString          = ProductString;
            this.productOrderBookClient = new ProductOrderBookClient(auth);

            Sells = new ConcurrentObservableSortedDictionary <decimal, ObservableLinkedList <BidAskOrder> >(isMultithreaded: true, comparer: new DescendingComparer <decimal>());
            Buys  = new ConcurrentObservableSortedDictionary <decimal, ObservableLinkedList <BidAskOrder> >(isMultithreaded: true, comparer: new DescendingComparer <decimal>());

            this.RealtimeOrderBookSubscription = realtimeOrderBookSubscription;
            this.RealtimeOrderBookSubscription.RealtimeOpen   += OnOpen;
            this.RealtimeOrderBookSubscription.RealtimeDone   += OnDone;
            this.RealtimeOrderBookSubscription.RealtimeMatch  += OnMatch;
            this.RealtimeOrderBookSubscription.RealtimeChange += OnChange;

            // not really used for anything except for their sequence number
            this.RealtimeOrderBookSubscription.RealtimeReceived  += OnReceived;
            this.RealtimeOrderBookSubscription.RealtimeLastMatch += OnLastMatch;
            this.RealtimeOrderBookSubscription.Heartbeat         += OnHeartbeat;

            this.RealtimeOrderBookSubscription.ConnectionClosed += OnConnectionClosed;
        }