/// <inheritdoc />
        protected override async Task <CallResult <UpdateSubscription> > DoStart()
        {
            CallResult <UpdateSubscription> subResult;

            if (limit == null)
            {
                subResult = await socketClient.SubscribeToOrderBookUpdatesAsync(Symbol, updateInterval, HandleUpdate).ConfigureAwait(false);
            }
            else
            {
                subResult = await socketClient.SubscribeToPartialOrderBookUpdatesAsync(Symbol, limit.Value, updateInterval, HandleUpdate).ConfigureAwait(false);
            }

            if (!subResult)
            {
                return(new CallResult <UpdateSubscription>(null, subResult.Error));
            }

            Status = OrderBookStatus.Syncing;
            if (limit == null)
            {
                var bookResult = await restClient.GetOrderBookAsync(Symbol, limit ?? 5000).ConfigureAwait(false);

                if (!bookResult)
                {
                    await socketClient.UnsubscribeAll().ConfigureAwait(false);

                    return(new CallResult <UpdateSubscription>(null, bookResult.Error));
                }

                SetInitialOrderBook(bookResult.Data.LastUpdateId, bookResult.Data.Bids, bookResult.Data.Asks);
            }
            else
            {
                var setResult = await WaitForSetOrderBook(10000).ConfigureAwait(false);

                return(setResult ? subResult : new CallResult <UpdateSubscription>(null, setResult.Error));
            }

            return(new CallResult <UpdateSubscription>(subResult.Data, null));
        }