/// <inheritdoc />
        public async Task <CallResult <UpdateSubscription> > SubscribeToKlineUpdatesAsync(string symbol, KlineInterval interval, Action <DataEvent <IEnumerable <CoinExKline> > > onMessage, CancellationToken ct = default)
        {
            symbol.ValidateCoinExSymbol();
            var internalHandler = new Action <DataEvent <JToken[]> >(data =>
            {
                if (data.Data.Length > 2)
                {
                    _log.Write(LogLevel.Warning, $"Received unexpected data format for kline update. Expected 1 or 2 objects, received {data.Data.Length}. Data: [{string.Join(",", data.Data.Select(s => s.ToString()))}]");
                    return;
                }

                var desResult = _baseClient.DeserializeInternal <IEnumerable <CoinExKline> >(new JArray(data.Data));
                if (!desResult)
                {
                    _log.Write(LogLevel.Warning, "Received invalid kline update: " + desResult.Error);
                    return;
                }

                onMessage(data.As(desResult.Data, symbol));
            });

            return(await _baseClient.SubscribeInternalAsync(this, new CoinExSocketRequest(_baseClient.NextIdInternal(), KlineSubject, SubscribeAction, symbol, interval.ToSeconds()), null, false, internalHandler, ct).ConfigureAwait(false));
        }
        /// <inheritdoc />
        public async Task <CallResult <CoinExKline> > GetKlinesAsync(string symbol, KlineInterval interval)
        {
            symbol.ValidateCoinExSymbol();

            return(await _baseClient.QueryInternalAsync <CoinExKline>(this, new CoinExSocketRequest(_baseClient.NextIdInternal(), KlineSubject, QueryAction, symbol, interval.ToSeconds()), false).ConfigureAwait(false));
        }
Пример #3
0
 /// <summary>
 /// Gets market kline data
 /// </summary>
 /// <param name="market">The market to get the data for</param>
 /// <param name="interval">The interval of the candles</param>
 /// <returns></returns>
 public async Task <CallResult <CoinExKline> > GetMarketKlinesAsync(string market, KlineInterval interval)
 {
     return(await QueryNewSocket <CoinExKline>(new CoinExSocketRequest(KlineSubject, QueryAction, market, interval.ToSeconds()), false).ConfigureAwait(false));
 }
Пример #4
0
        /// <summary>
        /// Subscribe to kline updates for a market
        /// </summary>
        /// <param name="market">The market to receive updates for</param>
        /// <param name="interval">The interval of the candle to receive updates for</param>
        /// <param name="onMessage">Datahandler, receives Param 1[string]: the market name, Param 2[CoinExKline[]]: list of klines updated klines</param>
        /// <returns>A stream subscription. This stream subscription can be used to be notified when the socket is closed and can close this specific stream
        /// using the <see cref="UnsubscribeFromStream(CoinExStreamSubscription)"/> method</returns>
        public async Task <CallResult <CoinExStreamSubscription> > SubscribeToMarketKlineUpdatesAsync(string market, KlineInterval interval, Action <string, CoinExKline[]> onMessage)
        {
            var sub = new CoinExKlineSubscription()
            {
                Handler = onMessage, Market = market
            };

            return(await Subscribe(sub, new CoinExSocketRequest(KlineSubject, SubscribeAction, market, interval.ToSeconds())).ConfigureAwait(false));
        }
Пример #5
0
        /// <summary>
        /// Subscribe to kline updates for a market
        /// </summary>
        /// <param name="market">The market to receive updates for</param>
        /// <param name="interval">The interval of the candle to receive updates for</param>
        /// <param name="onMessage">Data handler, receives Param 1[string]: the market name, Param 2[CoinExKline[]]: list of klines updated klines</param>
        /// <returns>A stream subscription. This stream subscription can be used to be notified when the socket is disconnected/reconnected</returns>
        public async Task <CallResult <UpdateSubscription> > SubscribeToMarketKlineUpdatesAsync(string market, KlineInterval interval, Action <string, CoinExKline[]> onMessage)
        {
            var internalHandler = new Action <JToken[]>(data =>
            {
                if (data.Length > 2)
                {
                    log.Write(LogVerbosity.Warning, $"Received unexpected data format for kline update. Expected 1 or 2 objects, received {data.Length}. Data: [{string.Join(",", data.Select(s => s.ToString()))}]");
                    return;
                }

                var desResult = Deserialize <CoinExKline[]>(new JArray(data), false);
                if (!desResult.Success)
                {
                    log.Write(LogVerbosity.Warning, "Received invalid market kline update: " + desResult.Error);
                    return;
                }

                onMessage(market, desResult.Data);
            });

            return(await Subscribe(new CoinExSocketRequest(NextId(), KlineSubject, SubscribeAction, market, interval.ToSeconds()), null, false, internalHandler).ConfigureAwait(false));
        }