protected override async Task DoWork(PairConfig config, CancellationToken stoppingToken) { _logger.LogTrace($"{Exchange.Description} Candles monitor is started"); while (!stoppingToken.IsCancellationRequested) { try { using (BinanceClient client = new BinanceClient()) { DateTime now = DateTime.UtcNow; IPeriodCode candlePeriod = config.Timeframe.HasValue ? PeriodCode.Create(config.Timeframe.Value) : DefaultCandleInterval; WebCallResult <IEnumerable <BinanceKline> > klines = client.GetKlines(config.Symbol, candlePeriod.ToPeriodCode(), now.AddDays(-30), now, 500); _logger.LogTrace($"Received candles from {Exchange.Description}"); List <Candle> candles = klines.Data.Select(x => x.ToCandle(config.Symbol, candlePeriod)).ToList(); foreach (Candle candle in candles) { await _candleProcessor.Create(candle); } } await Task.Delay(TimeSpan.FromHours(1)); } catch (Exception ex) { _logger.LogError($"{Exchange.Description} Candles service failed with message: {ex.Message}", ex); } } }
public static KlineInterval ToPeriodCode(this IPeriodCode period) { if (period == (IPeriodCode)PeriodCode.MINUTE) { return(KlineInterval.OneMinute); } else if (period == (IPeriodCode)PeriodCode.FIVE_MINUTES) { return(KlineInterval.FiveMinutes); } else if (period == (IPeriodCode)PeriodCode.QUARTER_HOUR) { return(KlineInterval.FifteenMinutes); } else if (period == (IPeriodCode)PeriodCode.HALF_HOUR) { return(KlineInterval.ThirtyMinutes); } else if (period == (IPeriodCode)PeriodCode.HOUR) { return(KlineInterval.OneHour); } else if (period == (IPeriodCode)PeriodCode.FOUR_HOUR) { return(KlineInterval.FourHour); } else if (period == (IPeriodCode)PeriodCode.DAY) { return(KlineInterval.OneDay); } throw new Exception($"Not supported perion {period.ToString()}"); }
public static Candle ToCandle(this BinanceKline kline, string symbol, IPeriodCode period) { Candle candle = new Candle(); candle.ExchangeCode = ExchangeCode.BINANCE.Code; candle.Symbol = symbol; candle.OpenTime = kline.OpenTime; candle.Open = kline.Open; candle.CloseTime = kline.CloseTime; candle.Close = kline.Close; candle.High = kline.High; candle.Low = kline.Low; candle.Volume = kline.Volume; candle.NumberOfTrades = kline.TradeCount; candle.PeriodCode = period.Code; candle.Time = new DateTime(kline.OpenTime.Year, kline.OpenTime.Month, kline.OpenTime.Day, kline.OpenTime.Hour, kline.OpenTime.Minute, 0); return(candle); }
protected override async Task DoWork(PairConfig pair, CancellationToken stoppingToken) { _logger.LogInformation($"{Exchange.Description} Candles worker is started"); IPeriodCode candlePeriod = pair.Timeframe.HasValue ? PeriodCode.Create(pair.Timeframe.Value) : DefaultCandleInterval; while (!stoppingToken.IsCancellationRequested) { try { using (BinanceSocketClient client = new BinanceSocketClient()) { ConnectionInfo cnInfo = new ConnectionInfo(_settings.Value.BusConnectionString); using (NatsClient natsClient = new NatsClient(cnInfo)) { if (!natsClient.IsConnected) { natsClient.Connect(); } CallResult <UpdateSubscription> successKline = client.SubscribeToKlineUpdates(pair.Symbol, candlePeriod.ToPeriodCode(), async(data) => { await SaveCandle(data.Data, natsClient); }); successKline.Data.ConnectionLost += () => { _logger.LogError($"Connection to {Exchange} is lost"); }; successKline.Data.ConnectionRestored += (data) => { _logger.LogError($"Connection to {Exchange} is Restored"); }; while (!stoppingToken.IsCancellationRequested) { } natsClient.Disconnect(); await client.Unsubscribe(successKline.Data); } } } catch (Exception ex) { _logger.LogError($"{Exchange.Description} Candles service failed with message: {ex.Message}", ex); } } }