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);
        }
Exemple #4
0
        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);
                }
            }
        }