protected override IWebSocket OnGetTickersWebSocket(Action<IReadOnlyCollection<KeyValuePair<string, ExchangeTicker>>> callback, params string[] marketSymbols) { Dictionary<int, string> channelIdToSymbol = new Dictionary<int, string>(); return ConnectWebSocket(string.Empty, (_socket, msg) => { JToken token = JToken.Parse(msg.ToStringFromUTF8()); if (token is JArray array) { if (array.Count > 10) { List<KeyValuePair<string, ExchangeTicker>> tickerList = new List<KeyValuePair<string, ExchangeTicker>>(); if (channelIdToSymbol.TryGetValue(array[0].ConvertInvariant<int>(), out string symbol)) { ExchangeTicker ticker = ParseTickerWebSocket(symbol, array); if (ticker != null) { callback(new KeyValuePair<string, ExchangeTicker>[] { new KeyValuePair<string, ExchangeTicker>(symbol, ticker) }); } } } } else if (token["event"].ToStringInvariant() == "subscribed" && token["channel"].ToStringInvariant() == "ticker") { // {"event":"subscribed","channel":"ticker","chanId":1,"pair":"BTCUSD"} int channelId = token["chanId"].ConvertInvariant<int>(); channelIdToSymbol[channelId] = token["pair"].ToStringInvariant(); } return Task.CompletedTask; }, async (_socket) => { marketSymbols = marketSymbols == null || marketSymbols.Length == 0 ? (await GetMarketSymbolsAsync()).ToArray() : marketSymbols; foreach (var marketSymbol in marketSymbols) { await _socket.SendMessageAsync(new { @event = "subscribe", channel = "ticker", pair = marketSymbol }); } }); }