public async Task SubscribeOnCandles(string currencyPairId, CandlePeriod period, Action <IList <Infrastructure.Common.Models.Market.Candle> > callback, int limit = 30) { var request = new SocketSubscriptionRequest <CandleRequestParameters> { RequestMethodName = "subscribeCandles", SnapshotMethodName = "snapshotCandles", NotificationMethodName = "updateCandles", UnsubscribeMethodName = "unsubscribeCandles", RequestParameters = new CandleRequestParameters { CurrencyPairId = currencyPairId, Period = period.ToInnerFormat(), Limit = limit } }; await _connection.Subscribe <CandleNotificationParameters>(request, notificationParameters => { var notificationCurrencyPairId = notificationParameters.CurrencyPairId; var notificationPeriod = CandlePeriodMap.ToOuterFormat(notificationParameters.Period); if (!(currencyPairId == notificationCurrencyPairId && notificationPeriod == period)) { return; } callback(notificationParameters.Candles .Select(CandleMap.ToOuterModel) .ToList()); }); }
public async Task<IList<Infrastructure.Common.Models.Market.Candle>> GetCandles(String currencyPairId, CandlePeriod period, int limit) { var connection = new HitBtcConnection(); var request = new RestRequest(String.Format("public/candles/{0}", currencyPairId), Method.GET); request.ConfigureRequest(); var candlePeriod = period.ToInnerFormat(); request.AddParameter("period", candlePeriod); request.AddParameter("limit", limit); request.AddParameter("sort", "DESC"); var response = await connection.DoRequest(request); var candles = response .ExtractResponseData<Candle[]>() .Select(entity => entity.ToOuterModel()) .ToList(); return candles; }
public async Task SubscribeOnCandles(string currencyPairId, CandlePeriod period, Action <IList <Candle> > callback, int limit = 30) { Connect(); var innerPeriod = period.ToInnerFormat(); var dateFrom = DateTime.UtcNow; switch (period) { case CandlePeriod.Minute1: dateFrom = dateFrom.AddMinutes(-(limit * 1)); break; case CandlePeriod.Minute3: dateFrom = dateFrom.AddMinutes(-(limit * 3)); break; case CandlePeriod.Minute5: dateFrom = dateFrom.AddMinutes(-(limit * 5)); break; case CandlePeriod.Minute15: dateFrom = dateFrom.AddMinutes(-(limit * 15)); break; case CandlePeriod.Minute30: dateFrom = dateFrom.AddMinutes(-(limit * 30)); break; case CandlePeriod.Hour1: dateFrom = dateFrom.AddHours(-(limit * 1)); break; case CandlePeriod.Hour4: dateFrom = dateFrom.AddHours(-(limit * 4)); break; case CandlePeriod.Day1: dateFrom = dateFrom.AddDays(-(limit * 1)); break; case CandlePeriod.Day7: dateFrom = dateFrom.AddDays(-(limit * 7)); break; case CandlePeriod.Month1: dateFrom = dateFrom.AddMonths(-(limit * 1)); break; } var dateTo = DateTime.UtcNow; var innerExistingCandles = await _connection.Context.MarketCandlesAsync(currencyPairId, dateFrom, dateTo, innerPeriod); var existingCandles = innerExistingCandles.Candles.Select(candle => candle.ToOuterModel()).ToList(); callback(existingCandles); var subscription = new Subscription { SubscribeRequest = StreamingRequest.SubscribeCandle(currencyPairId, innerPeriod), UnsubscribeRequest = StreamingRequest.UnsubscribeCandle(currencyPairId, innerPeriod), EventHandler = (o, e) => { if (!(e.Response is CandleResponse candleResponse) || candleResponse.Payload.Figi != currencyPairId || candleResponse.Payload.Interval != innerPeriod) { return; } var candle = candleResponse.Payload.ToOuterModel(); callback(new List <Candle> { candle }); } }; _connection.StreamingEventReceived += (o, e) => subscription.EventHandler(o, e); await _connection.Context.SendStreamingRequestAsync(subscription.SubscribeRequest); }