public virtual async Task <CallResult <UpdateSubscription> > SubscribeToTickerAsync(string pair, Action <CoinzoSocketTicker> onData)
        {
            var id  = NextSubscriptionId();
            var key = $"{string.Format("{0:0000000000}", id)}-ticker-{pair}";

            SubscriptionChannels.Add(key, string.Empty);
            var internalHandler = new Action <DataEvent <IEnumerable <object> > >(data =>
            {
                if (SubscriptionChannels.ContainsKey(key))
                {
                    if (data.Data.Count() > 0 && (string)(data.Data.ElementAt(0)) == SubscriptionChannels[key])
                    {
                        for (var i = 1; i < data.Data.Count(); i++)
                        {
                            var ticker  = JsonConvert.DeserializeObject <CoinzoSocketTicker>(data.Data.ElementAt(i).ToString());
                            ticker.Pair = pair;
                            ticker.Open = ticker.Close - ticker.Change;
                            onData(ticker);
                        }
                    }
                }
            });

            var request = new CoinzoSocketRequest {
                Event = "subscribe", Channel = "ticker", Pair = pair, SubscriptionKey = key
            };

            return(await SubscribeAsync(request, null, false, internalHandler).ConfigureAwait(false));
        }
        public virtual async Task <CallResult <UpdateSubscription> > SubscribeToCandlesAsync(string pair, CoinzoPeriod period, Action <CoinzoSocketCandle> onData)
        {
            var id  = NextSubscriptionId();
            var key = $"{string.Format("{0:0000000000}", id)}-candles-{pair}";

            SubscriptionChannels.Add(key, string.Empty);
            var internalHandler = new Action <DataEvent <IEnumerable <object> > >(data =>
            {
                if (SubscriptionChannels.ContainsKey(key))
                {
                    if (data.Data.Count() > 0 && (string)(data.Data.ElementAt(0)) == SubscriptionChannels[key])
                    {
                        for (var i = 1; i < data.Data.Count(); i++)
                        {
                            var candles = JsonConvert.DeserializeObject <IEnumerable <CoinzoSocketCandle> >(data.Data.ElementAt(i).ToString());
                            foreach (var candle in candles)
                            {
                                candle.Pair   = pair;
                                candle.Period = period;
                                onData(candle);
                            }
                        }
                    }
                }
            });

            var period_s = JsonConvert.SerializeObject(period, new PeriodConverter(false));
            var request  = new CoinzoSocketRequest {
                Event = "subscribe", Channel = "candles", Pair = pair, Key = period_s, SubscriptionKey = key
            };

            return(await SubscribeAsync(request, null, false, internalHandler).ConfigureAwait(false));
        }
        public virtual async Task <CallResult <UpdateSubscription> > SubscribeToOrderBookAsync(string pair, Action <CoinzoSocketOrderBookTotal> onTotalData, Action <CoinzoSocketOrderBookEntry> onEntryData)
        {
            var id  = NextSubscriptionId();
            var key = $"{string.Format("{0:0000000000}", id)}-book-{pair}";

            SubscriptionChannels.Add(key, string.Empty);
            var internalHandler = new Action <DataEvent <IEnumerable <object> > >(data =>
            {
                if (SubscriptionChannels.ContainsKey(key))
                {
                    if (data.Data.Count() > 0 && (string)(data.Data.ElementAt(0)) == SubscriptionChannels[key])
                    {
                        for (var i = 1; i < data.Data.Count(); i++)
                        {
                            if (i == 1)
                            {
                                var total  = JsonConvert.DeserializeObject <CoinzoSocketOrderBookTotal>(data.Data.ElementAt(i).ToString());
                                total.Pair = pair;
                                onTotalData(total);
                            }
                            else
                            {
                                var entry  = JsonConvert.DeserializeObject <CoinzoSocketOrderBookEntry>(data.Data.ElementAt(i).ToString());
                                entry.Pair = pair;
                                onEntryData(entry);
                            }
                        }
                    }
                }
            });

            var request = new CoinzoSocketRequest {
                Event = "subscribe", Channel = "book", Pair = pair, Precision = 0, SubscriptionKey = key
            };

            return(await SubscribeAsync(request, null, false, internalHandler).ConfigureAwait(false));
        }