From 955c3581386a826a70de1c4c5069e2d9fc683014 Mon Sep 17 00:00:00 2001 From: cryptooda Date: Sat, 16 Aug 2025 17:02:31 +0700 Subject: [PATCH] Improve per on price update --- .../Repositories/ICandleRepository.cs | 2 +- .../Trading/PricesService.cs | 34 ++++++++----------- .../Abstractions/IInfluxDbRepository.cs | 1 + .../InfluxDb/CandleRepository.cs | 5 +-- .../InfluxDb/InfluxDbRepository.cs | 7 ++++ 5 files changed, 27 insertions(+), 22 deletions(-) diff --git a/src/Managing.Application.Abstractions/Repositories/ICandleRepository.cs b/src/Managing.Application.Abstractions/Repositories/ICandleRepository.cs index 810bf5c..4a0434d 100644 --- a/src/Managing.Application.Abstractions/Repositories/ICandleRepository.cs +++ b/src/Managing.Application.Abstractions/Repositories/ICandleRepository.cs @@ -24,5 +24,5 @@ public interface ICandleRepository Enums.TradingExchanges exchange, Enums.Timeframe timeframe, DateTime start); - void InsertCandle(Candle candle); + Task InsertCandle(Candle candle); } diff --git a/src/Managing.Application/Trading/PricesService.cs b/src/Managing.Application/Trading/PricesService.cs index 0e407ca..19bfb03 100644 --- a/src/Managing.Application/Trading/PricesService.cs +++ b/src/Managing.Application/Trading/PricesService.cs @@ -39,39 +39,35 @@ public class PricesService : IPricesService throw new Exception($"Enable to found account for exchange {exchange}"); var lastCandles = - await _candleRepository.GetCandles(exchange, ticker, timeframe, DateTime.UtcNow.AddDays(-30), limit: 5); + await _candleRepository.GetCandles(exchange, ticker, timeframe, DateTime.UtcNow.AddDays(-30), limit: 1) + .ConfigureAwait(false); + var lastCandle = lastCandles.LastOrDefault(); var startDate = lastCandle != null ? lastCandle.Date : new DateTime(2017, 1, 1); - List newCandles; - if (!lastCandles.Any()) - { - newCandles = await _exchangeService.GetCandles(account, ticker, startDate, timeframe, true); - } - else - { - newCandles = await _exchangeService.GetCandles(account, ticker, startDate, timeframe, false); - } + List newCandles = + await _exchangeService.GetCandles(account, ticker, startDate, timeframe, true) + .ConfigureAwait(false); + + var candlesToInsert = lastCandle == null + ? newCandles + : newCandles.Where(c => c.Date > lastCandle.Date); - var candles = !lastCandles.Any() ? newCandles : newCandles.Where(c => c.Date > lastCandle?.Date); var candlesInserted = 0; - foreach (var newCandle in candles) + foreach (var newCandle in candlesToInsert) { - if (lastCandle == null || newCandle.Date > lastCandle.Date) - { - _candleRepository.InsertCandle(newCandle); - candlesInserted++; - } + await _candleRepository.InsertCandle(newCandle).ConfigureAwait(false); + candlesInserted++; } if (candlesInserted > 0) - _logger.LogInformation($"[{exchange}][{ticker}][{timeframe}] New candles inserted : {candlesInserted}"); + _logger.LogInformation("[{exchange}][{ticker}][{timeframe}] New candles inserted : {candlesInserted}", exchange, ticker, timeframe, candlesInserted); } catch (Exception ex) { SentrySdk.CaptureException(ex); - _logger.LogError($"[{exchange}][{ticker}][{timeframe}] Error : {ex.Message} | {ex.StackTrace}"); + _logger.LogError("[{exchange}][{ticker}][{timeframe}] Error : {ex.Message} | {ex.StackTrace}", exchange, ticker, timeframe, ex.Message, ex.StackTrace); } } } \ No newline at end of file diff --git a/src/Managing.Infrastructure.Database/InfluxDb/Abstractions/IInfluxDbRepository.cs b/src/Managing.Infrastructure.Database/InfluxDb/Abstractions/IInfluxDbRepository.cs index a7cc5cd..7f2ccef 100644 --- a/src/Managing.Infrastructure.Database/InfluxDb/Abstractions/IInfluxDbRepository.cs +++ b/src/Managing.Infrastructure.Database/InfluxDb/Abstractions/IInfluxDbRepository.cs @@ -8,4 +8,5 @@ public interface IInfluxDbRepository Task QueryAsync(Func> action); void Write(Action action); + Task WriteAsync(Func action); } \ No newline at end of file diff --git a/src/Managing.Infrastructure.Database/InfluxDb/CandleRepository.cs b/src/Managing.Infrastructure.Database/InfluxDb/CandleRepository.cs index 272b841..b6743a1 100644 --- a/src/Managing.Infrastructure.Database/InfluxDb/CandleRepository.cs +++ b/src/Managing.Infrastructure.Database/InfluxDb/CandleRepository.cs @@ -111,9 +111,9 @@ public class CandleRepository : ICandleRepository return results; } - public void InsertCandle(Candle candle) + public async Task InsertCandle(Candle candle) { - _influxDbRepository.Write(write => + await _influxDbRepository.WriteAsync(write => { PriceDto price = PriceHelpers.Map(candle); write.WriteMeasurement( @@ -121,6 +121,7 @@ public class CandleRepository : ICandleRepository WritePrecision.Ns, _priceBucket, _influxDbRepository.Organization); + return Task.CompletedTask; }); } diff --git a/src/Managing.Infrastructure.Database/InfluxDb/InfluxDbRepository.cs b/src/Managing.Infrastructure.Database/InfluxDb/InfluxDbRepository.cs index 40cad0f..7113940 100644 --- a/src/Managing.Infrastructure.Database/InfluxDb/InfluxDbRepository.cs +++ b/src/Managing.Infrastructure.Database/InfluxDb/InfluxDbRepository.cs @@ -23,6 +23,13 @@ public class InfluxDbRepository : IInfluxDbRepository action(write); } + public Task WriteAsync(Func action) + { + // Get write API asynchronously + using var client = new InfluxDBClient(_url, _token); + using var write = client.GetWriteApi(); + return action(write); + } public async Task QueryAsync(Func> action) { using var client = InfluxDBClientFactory.Create(_url, _token);