/// <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)); }
/// <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)); }
/// <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)); }
/// <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)); }