diff --git a/src/Managing.Api.Workers/Program.cs b/src/Managing.Api.Workers/Program.cs index cd72b07..f14d137 100644 --- a/src/Managing.Api.Workers/Program.cs +++ b/src/Managing.Api.Workers/Program.cs @@ -1,7 +1,6 @@ using System.Text.Json.Serialization; using HealthChecks.UI.Client; using Managing.Api.Workers.Filters; -using Managing.Api.Workers.Workers; using Managing.Application.Hubs; using Managing.Bootstrap; using Managing.Common; @@ -152,18 +151,6 @@ builder.Services.AddSwaggerGen(options => }); builder.WebHost.SetupDiscordBot(); -// builder.Services.AddHostedService(); -// builder.Services.AddHostedService(); -// builder.Services.AddHostedService(); -// builder.Services.AddHostedService(); -builder.Services.AddHostedService(); -builder.Services.AddHostedService(); -builder.Services.AddHostedService(); -builder.Services.AddHostedService(); -// builder.Services.AddHostedService(); -// builder.Services.AddHostedService(); -// builder.Services.AddHostedService(); -// builder.Services.AddHostedService(); // App var app = builder.Build(); diff --git a/src/Managing.Api.Workers/Workers/NoobiesboardWorker.cs b/src/Managing.Api.Workers/Workers/NoobiesboardWorker.cs deleted file mode 100644 index 08ef353..0000000 --- a/src/Managing.Api.Workers/Workers/NoobiesboardWorker.cs +++ /dev/null @@ -1,30 +0,0 @@ -using Managing.Application.Abstractions.Services; -using Managing.Application.Workers; -using Managing.Application.Workers.Abstractions; -using static Managing.Common.Enums; - -namespace Managing.Api.Workers.Workers; - -public class NoobiesboardWorker : BaseWorker -{ - private readonly IStatisticService _statisticService; - private static readonly WorkerType _workerType = WorkerType.Noobiesboard; - - public NoobiesboardWorker( - ILogger logger, - IStatisticService statisticService, - IWorkerService workerService) : base( - _workerType, - logger, - TimeSpan.FromHours(24), - workerService - ) - { - _statisticService = statisticService; - } - - protected override async Task Run(CancellationToken cancellationToken) - { - await _statisticService.UpdateNoobiesboard(); - } -} \ No newline at end of file diff --git a/src/Managing.Api.Workers/Workers/PositionFetcher.cs b/src/Managing.Api.Workers/Workers/PositionFetcher.cs deleted file mode 100644 index 59664d8..0000000 --- a/src/Managing.Api.Workers/Workers/PositionFetcher.cs +++ /dev/null @@ -1,38 +0,0 @@ -using Managing.Application.Abstractions.Services; -using Managing.Application.Hubs; -using Managing.Application.Workers; -using Managing.Application.Workers.Abstractions; -using Microsoft.AspNetCore.SignalR; -using static Managing.Common.Enums; - -namespace Managing.Api.Workers.Workers; - -public class PositionFetcher : BaseWorker -{ - private static readonly WorkerType _workerType = WorkerType.PositionFetcher; - private readonly ITradingService _tradingService; - private readonly IHubContext _hubContext; - private readonly ILogger _logger; - - public PositionFetcher( - ILogger logger, - IWorkerService workerService, - ITradingService tradingService, - - IHubContext hubContext) : base( - _workerType, - logger, - TimeSpan.FromSeconds(10), - workerService) - { - _logger = logger; - _tradingService = tradingService; - _hubContext = hubContext; - } - - protected override async Task Run(CancellationToken cancellationToken) - { - var positions = _tradingService.GetPositions().Where(p => p.Initiator != PositionInitiator.PaperTrading); - await _hubContext.Clients.All.SendAsync("Positions", positions); - } -} diff --git a/src/Managing.Api.Workers/Workers/PositionManagerWorker.cs b/src/Managing.Api.Workers/Workers/PositionManagerWorker.cs deleted file mode 100644 index 73085b0..0000000 --- a/src/Managing.Api.Workers/Workers/PositionManagerWorker.cs +++ /dev/null @@ -1,377 +0,0 @@ -using Managing.Application.Abstractions; -using Managing.Application.Abstractions.Services; -using Managing.Application.Workers; -using Managing.Application.Workers.Abstractions; -using Managing.Domain.Accounts; -using Managing.Domain.Shared.Helpers; -using Managing.Domain.Trades; -using Newtonsoft.Json; -using static Managing.Common.Enums; - -namespace Managing.Api.Workers.Workers; - -public class PositionManagerWorker : BaseWorker -{ - private static readonly WorkerType _workerType = WorkerType.PositionManager; - private readonly ITradingService _tradingService; - private readonly IExchangeService _exchangeService; - private readonly IAccountService _accountService; - private readonly ILogger _logger; - private readonly ICacheService _cacheService; - - public PositionManagerWorker( - ILogger logger, - IWorkerService workerService, - ITradingService tradingService, - IExchangeService exchangeService, - IAccountService accountService, ICacheService cacheService) : base( - _workerType, - logger, - TimeSpan.FromMinutes(1), - workerService) - { - _logger = logger; - _tradingService = tradingService; - _exchangeService = exchangeService; - _accountService = accountService; - _cacheService = cacheService; - } - - protected override async Task Run(CancellationToken cancellationToken) - { - await ManageNewPositions(); - await ManagePartiallyFilledPositions(); - await ManageFilledPositions(); - } - - private async Task ManagePartiallyFilledPositions() - { - var positions = GetPositions(PositionStatus.PartiallyFilled); - _logger.LogInformation("Processing {PartiallyFilledCount} partially filled positions", positions.Count()); - - foreach (var position in positions) - { - using (_logger.BeginScope("Position {PositionId} ({Ticker})", position.Identifier, position.Ticker)) - { - try - { - // Lock position for processing - position.Status = PositionStatus.Updating; - _tradingService.UpdatePosition(position); - - _logger.LogDebug("Verifying position on exchange for {Direction} position opened at {OpenDate}", - position.OriginDirection, position.Date.ToString("o")); - - var account = await _accountService.GetAccount(position.AccountName, false, false); - - // Get positions directly from broker - var brokerPositions = await _exchangeService.GetBrokerPositions(account); - var exchangePosition = brokerPositions.FirstOrDefault(p => - p.Ticker == position.Ticker && - p.OriginDirection == position.OriginDirection); - - if (exchangePosition == null) - { - _logger.LogWarning("Position not found on exchange - marking as canceled"); - position.Status = PositionStatus.Canceled; - _tradingService.UpdatePosition(position); - continue; - } - - // Update with exchange data if available - if (exchangePosition.StopLoss != null) - { - _logger.LogInformation("Stop Loss found on exchange - ID: {OrderId}", exchangePosition.StopLoss.ExchangeOrderId); - position.StopLoss = exchangePosition.StopLoss; - } - else - { - _logger.LogWarning("Stop Loss not found on exchange - creating new SL order"); - var updatedSl = await _exchangeService.OpenStopLoss(account, position.Ticker, position.OriginDirection, - position.StopLoss.Price, position.StopLoss.Quantity, false, DateTime.UtcNow); - - if (updatedSl != null) - { - position.StopLoss = updatedSl; - } - } - - if (exchangePosition.TakeProfit1 != null) - { - _logger.LogInformation("Take Profit found on exchange - ID: {OrderId}", exchangePosition.TakeProfit1.ExchangeOrderId); - position.TakeProfit1 = exchangePosition.TakeProfit1; - } - else - { - _logger.LogWarning("Take Profit not found on exchange - creating new TP order"); - var updatedTp1 = await _exchangeService.OpenTakeProfit(account, position.Ticker, position.OriginDirection, - position.TakeProfit1.Price, position.TakeProfit1.Quantity, false, DateTime.UtcNow); - - if (updatedTp1 != null) - { - position.TakeProfit1 = updatedTp1; - } - } - - // Handle TP2 if it exists - if (position.TakeProfit2 != null) - { - if (exchangePosition.TakeProfit2 != null) - { - _logger.LogInformation("Take Profit 2 found on exchange - ID: {OrderId}", exchangePosition.TakeProfit2.ExchangeOrderId); - position.TakeProfit2 = exchangePosition.TakeProfit2; - } - else - { - _logger.LogWarning("Take Profit 2 not found on exchange - creating new TP2 order"); - var updatedTp2 = await _exchangeService.OpenTakeProfit(account, position.Ticker, position.OriginDirection, - position.TakeProfit2.Price, position.TakeProfit2.Quantity, false, DateTime.UtcNow); - - if (updatedTp2 != null) - { - position.TakeProfit2 = updatedTp2; - } - } - } - - // Update position status based on verification results - var success = AllTradesActive(position); - position.Status = success ? PositionStatus.Filled : PositionStatus.PartiallyFilled; - - _logger.LogInformation("Final position status: {Status}", position.Status); - } - catch (Exception ex) - { - _logger.LogError(ex, "Position processing failed"); - position.Status = PositionStatus.PartiallyFilled; - } - finally - { - _tradingService.UpdatePosition(position); - } - } - } - } - - private bool AllTradesActive(Position position) - { - return position.StopLoss.Status.IsActive() && - position.TakeProfit1.Status.IsActive() && - (position.TakeProfit2?.Status.IsActive() ?? true); - } - - private async Task ManageFilledPositions() - { - var positions = GetPositions(PositionStatus.Filled); - _logger.LogInformation("Monitoring {FilledPositionCount} filled positions", positions.Count()); - - foreach (var position in positions) - { - using (_logger.BeginScope("Position {PositionId} ({Ticker})", position.Identifier, position.Ticker)) - { - try - { - // Acquire processing lock - _logger.LogDebug("Acquiring position lock"); - position.Status = PositionStatus.Updating; - _tradingService.UpdatePosition(position); - - _logger.LogInformation("Checking position state on exchange - Direction: {Direction}, Open Since: {OpenDate}", - position.OriginDirection, position.Date.ToString("yyyy-MM-dd HH:mm:ss")); - - var account = await GetAccount(position.AccountName); - - // Check if position still exists on broker - var brokerPositions = await _exchangeService.GetBrokerPositions(account); - var exchangePosition = brokerPositions.FirstOrDefault(p => - p.Ticker == position.Ticker && - p.OriginDirection == position.OriginDirection); - - if (exchangePosition == null) - { - // Position no longer on exchange - it has been closed - _logger.LogInformation("Position no longer on exchange - marking as finished"); - position.Status = PositionStatus.Finished; - - // Determine if SL or TP was hit by checking which one is missing - if (exchangePosition?.StopLoss == null && position.StopLoss.Status != TradeStatus.Filled) - { - _logger.LogInformation("Stop loss appears to have been hit"); - position.StopLoss.SetStatus(TradeStatus.Filled); - position.ProfitAndLoss = TradingBox.GetProfitAndLoss( - position, - position.StopLoss.Quantity, - position.StopLoss.Price, - position.Open.Leverage); - } - else if (exchangePosition?.TakeProfit1 == null && position.TakeProfit1.Status != TradeStatus.Filled) - { - _logger.LogInformation("Take profit 1 appears to have been hit"); - position.TakeProfit1.SetStatus(TradeStatus.Filled); - position.ProfitAndLoss = TradingBox.GetProfitAndLoss( - position, - position.TakeProfit1.Quantity, - position.TakeProfit1.Price, - position.Open.Leverage); - } - else if (exchangePosition?.TakeProfit2 == null && position.TakeProfit2?.Status != TradeStatus.Filled) - { - _logger.LogInformation("Take profit 2 appears to have been hit"); - position.TakeProfit2.SetStatus(TradeStatus.Filled); - position.ProfitAndLoss = TradingBox.GetProfitAndLoss( - position, - position.TakeProfit2.Quantity, - position.TakeProfit2.Price, - position.Open.Leverage); - } - - // Cancel any remaining orders - await _exchangeService.CancelOrder(account, position.Ticker); - } - else - { - // Position still exists - update with exchange data - _logger.LogInformation("Position still active on exchange with quantity {Quantity}", - exchangePosition.Open?.Quantity ?? 0); - - // Update our position with broker data - if (exchangePosition.Open != null) - position.Open = exchangePosition.Open; - - if (exchangePosition.StopLoss != null) - position.StopLoss = exchangePosition.StopLoss; - - if (exchangePosition.TakeProfit1 != null) - position.TakeProfit1 = exchangePosition.TakeProfit1; - - if (exchangePosition.TakeProfit2 != null) - position.TakeProfit2 = exchangePosition.TakeProfit2; - - if (exchangePosition.ProfitAndLoss != null) - position.ProfitAndLoss = exchangePosition.ProfitAndLoss; - else - { - // Calculate PNL if not provided - var lastPrice = _exchangeService.GetPrice(account, position.Ticker, DateTime.UtcNow); - position.ProfitAndLoss = TradingBox.GetProfitAndLoss( - position, - position.Open.Quantity, - lastPrice, - position.Open.Leverage); - } - - _logger.LogInformation("Updated position from exchange - PNL: {PNL}", - position.ProfitAndLoss?.Net ?? 0); - - // Keep status as Filled - position.Status = PositionStatus.Filled; - } - - _tradingService.UpdatePosition(position); - } - catch (Exception ex) - { - _logger.LogError(ex, "Failed to manage position - {ErrorMessage}", ex.Message); - - // Reset status for retry - position.Status = PositionStatus.Filled; - _tradingService.UpdatePosition(position); - } - finally - { - // Ensure lock is always released - if (position.Status == PositionStatus.Updating) - { - position.Status = PositionStatus.Filled; - _tradingService.UpdatePosition(position); - } - } - } - } - } - - private IEnumerable GetPositions(PositionStatus positionStatus) - { - return _tradingService.GetPositionsByStatus(positionStatus) - .Where(p => p.Initiator != PositionInitiator.PaperTrading); - } - - private async Task ManageNewPositions() - { - var positions = GetPositions(PositionStatus.New); - - _logger.LogInformation("Processing {NewPositionCount} new positions", positions.Count()); - - foreach (var position in positions) - { - using (_logger.BeginScope("Position {Identifier}", position.Identifier)) - { - try - { - // Immediate status update for concurrency protection - _logger.LogDebug("[{Identifier}] Acquiring position lock via status update", position.Identifier); - position.Status = PositionStatus.Updating; - _tradingService.UpdatePosition(position); - - var account = await GetAccount(position.AccountName); - - // Check if position exists on broker - var brokerPositions = await _exchangeService.GetBrokerPositions(account); - var exchangePosition = brokerPositions.FirstOrDefault(p => - p.Ticker == position.Ticker && - p.OriginDirection == position.OriginDirection); - - if (exchangePosition != null) - { - // Position is confirmed on exchange - position.Status = PositionStatus.PartiallyFilled; - position.Open = exchangePosition.Open; // Use the exchange data - _tradingService.UpdatePosition(position); - - _logger.LogInformation("[{Identifier}] Position found on exchange - moving to partially filled status", - position.Identifier); - continue; - } - - // Position not found on exchange - check for staleness - if (position.Date < DateTime.UtcNow.AddDays(-1)) - { - position.Status = PositionStatus.Canceled; - _tradingService.UpdatePosition(position); - _logger.LogWarning("[{Identifier}] Position canceled - stale since {PositionAge} days", - position.Identifier, - (DateTime.UtcNow - position.Date).TotalDays); - } - else - { - // Reset status to try again - position.Status = PositionStatus.New; - _tradingService.UpdatePosition(position); - _logger.LogInformation("[{Identifier}] Position not yet found on exchange - awaiting fill", - position.Identifier); - } - } - catch (Exception ex) - { - _logger.LogError(ex, "Error processing position {Identifier}", position.Identifier); - // Reset to New status for retry - position.Status = PositionStatus.New; - _tradingService.UpdatePosition(position); - } - } - } - } - - private async Task GetAccount(string accountName) - { - var account = _cacheService.GetValue(accountName); - - if (account == null) - { - account = await _accountService.GetAccount(accountName, false, false); - _cacheService.SaveValue(accountName, JsonConvert.SerializeObject(account)); - } - - return account; - } -} \ No newline at end of file diff --git a/src/Managing.Api.Workers/Workers/TopVolumeTickerWorker.cs b/src/Managing.Api.Workers/Workers/TopVolumeTickerWorker.cs deleted file mode 100644 index c61a33c..0000000 --- a/src/Managing.Api.Workers/Workers/TopVolumeTickerWorker.cs +++ /dev/null @@ -1,30 +0,0 @@ -using Managing.Application.Abstractions.Services; -using Managing.Application.Workers; -using Managing.Application.Workers.Abstractions; -using static Managing.Common.Enums; - -namespace Managing.Api.Workers.Workers; - -public class TopVolumeTickerWorker : BaseWorker -{ - private readonly IStatisticService _statisticService; - private static readonly WorkerType _workerType = WorkerType.TopVolumeTicker; - - public TopVolumeTickerWorker( - ILogger logger, - IWorkerService workerService, - IStatisticService statisticService) : base( - _workerType, - logger, - TimeSpan.FromHours(12), - workerService - ) - { - _statisticService = statisticService; - } - - protected override async Task Run(CancellationToken cancellationToken) - { - await _statisticService.UpdateTopVolumeTicker(TradingExchanges.Evm, 10); - } -} \ No newline at end of file diff --git a/src/Managing.Api.Workers/appsettings.Oda.json b/src/Managing.Api.Workers/appsettings.Oda.json index 6f09b9e..0d6e980 100644 --- a/src/Managing.Api.Workers/appsettings.Oda.json +++ b/src/Managing.Api.Workers/appsettings.Oda.json @@ -24,5 +24,17 @@ "ElasticConfiguration": { "Uri": "http://localhost:9200" }, - "AllowedHosts": "*" + "AllowedHosts": "*", + "WorkerPricesFifteenMinutes": true, + "WorkerPricesOneHour": true, + "WorkerPricesFourHours": true, + "WorkerPricesOneDay": true, + "WorkerPricesFiveMinutes": false, + "WorkerFee": false, + "WorkerPositionManager": false, + "WorkerPositionFetcher": false, + "WorkerSpotlight": false, + "WorkerTraderWatcher": false, + "WorkerLeaderboard": false, + "WorkerFundingRatesWatcher": false } \ No newline at end of file diff --git a/src/Managing.Application.Tests/BotsTests.cs b/src/Managing.Application.Tests/BotsTests.cs index 9489ea0..ca52b30 100644 --- a/src/Managing.Application.Tests/BotsTests.cs +++ b/src/Managing.Application.Tests/BotsTests.cs @@ -33,6 +33,7 @@ namespace Managing.Application.Tests var backtestRepository = new Mock().Object; var discordService = new Mock().Object; var scenarioService = new Mock().Object; + var messengerService = new Mock().Object; var tradingBotLogger = TradingBaseTests.CreateTradingBotLogger(); var backtestLogger = TradingBaseTests.CreateBacktesterLogger(); var botService = new Mock().Object; @@ -44,7 +45,7 @@ namespace Managing.Application.Tests _tradingService.Object, botService); _backtester = new Backtester(_exchangeService, _botFactory, backtestRepository, backtestLogger, - scenarioService, _accountService.Object); + scenarioService, _accountService.Object, messengerService); _elapsedTimes = new List(); // Initialize cross-platform file paths @@ -75,7 +76,6 @@ namespace Managing.Application.Tests Timeframe = timeframe, IsForWatchingOnly = false, BotTradingBalance = 1000, - BotType = BotType.FlippingBot, IsForBacktest = true, CooldownPeriod = 1, MaxLossStreak = 0, @@ -87,7 +87,8 @@ namespace Managing.Application.Tests }; // Act - var backtestResult = await _backtester.RunTradingBotBacktest(config, localCandles.TakeLast(500).ToList(), null, false); + var backtestResult = + await _backtester.RunTradingBotBacktest(config, localCandles.TakeLast(500).ToList(), null, false); var json = JsonConvert.SerializeObject(backtestResult, Formatting.None); File.WriteAllText($"{ticker.ToString()}-{timeframe.ToString()}-{Guid.NewGuid()}.json", json); @@ -125,7 +126,6 @@ namespace Managing.Application.Tests Timeframe = timeframe, IsForWatchingOnly = false, BotTradingBalance = 1000, - BotType = BotType.ScalpingBot, IsForBacktest = true, CooldownPeriod = 1, MaxLossStreak = 0, @@ -175,7 +175,6 @@ namespace Managing.Application.Tests Timeframe = timeframe, IsForWatchingOnly = false, BotTradingBalance = 1000, - BotType = BotType.ScalpingBot, IsForBacktest = true, CooldownPeriod = 1, MaxLossStreak = 0, @@ -266,7 +265,6 @@ namespace Managing.Application.Tests Timeframe = timeframe, IsForWatchingOnly = false, BotTradingBalance = 1000, - BotType = BotType.ScalpingBot, IsForBacktest = true, CooldownPeriod = 1, MaxLossStreak = 0, @@ -285,7 +283,6 @@ namespace Managing.Application.Tests Timeframe = timeframe, IsForWatchingOnly = false, BotTradingBalance = 1000, - BotType = BotType.FlippingBot, IsForBacktest = true, CooldownPeriod = 1, MaxLossStreak = 0, @@ -408,7 +405,6 @@ namespace Managing.Application.Tests Timeframe = timeframe, IsForWatchingOnly = false, BotTradingBalance = 1000, - BotType = BotType.ScalpingBot, IsForBacktest = true, CooldownPeriod = 1, MaxLossStreak = 0, @@ -427,7 +423,6 @@ namespace Managing.Application.Tests Timeframe = timeframe, IsForWatchingOnly = false, BotTradingBalance = 1000, - BotType = BotType.FlippingBot, IsForBacktest = true, CooldownPeriod = 1, MaxLossStreak = 0, @@ -664,7 +659,6 @@ namespace Managing.Application.Tests Timeframe = timeframe, IsForWatchingOnly = false, BotTradingBalance = 1000, - BotType = botType, IsForBacktest = true, CooldownPeriod = 1, MaxLossStreak = 0, diff --git a/src/Managing.Api.Workers/Workers/FeeWorker.cs b/src/Managing.Application.Workers/FeeWorker.cs similarity index 84% rename from src/Managing.Api.Workers/Workers/FeeWorker.cs rename to src/Managing.Application.Workers/FeeWorker.cs index 8ea937b..b8f4648 100644 --- a/src/Managing.Api.Workers/Workers/FeeWorker.cs +++ b/src/Managing.Application.Workers/FeeWorker.cs @@ -1,9 +1,9 @@ -using Managing.Application.Abstractions.Services; -using Managing.Application.Workers; +using Managing.Application.Abstractions.Services; using Managing.Application.Workers.Abstractions; +using Microsoft.Extensions.Logging; using static Managing.Common.Enums; -namespace Managing.Api.Workers.Workers; +namespace Managing.Application.Workers; public class FeeWorker : BaseWorker { @@ -27,4 +27,4 @@ public class FeeWorker : BaseWorker { _tradingService.UpdateFee(TradingExchanges.Evm); } -} +} \ No newline at end of file diff --git a/src/Managing.Api.Workers/Workers/FundingRatesWatcher.cs b/src/Managing.Application.Workers/FundingRatesWatcher.cs similarity index 84% rename from src/Managing.Api.Workers/Workers/FundingRatesWatcher.cs rename to src/Managing.Application.Workers/FundingRatesWatcher.cs index 42d80be..3058b35 100644 --- a/src/Managing.Api.Workers/Workers/FundingRatesWatcher.cs +++ b/src/Managing.Application.Workers/FundingRatesWatcher.cs @@ -1,9 +1,9 @@ -using Managing.Application.Abstractions.Services; -using Managing.Application.Workers; +using Managing.Application.Abstractions.Services; using Managing.Application.Workers.Abstractions; using Managing.Common; +using Microsoft.Extensions.Logging; -namespace Managing.Api.Workers.Workers; +namespace Managing.Application.Workers; public class FundingRatesWatcher : BaseWorker { @@ -26,4 +26,4 @@ public class FundingRatesWatcher : BaseWorker { await _statisticService.UpdateFundingRates(); } -} \ No newline at end of file +} \ No newline at end of file diff --git a/src/Managing.Api.Workers/Workers/LeaderboardWorker.cs b/src/Managing.Application.Workers/LeaderboardWorker.cs similarity index 73% rename from src/Managing.Api.Workers/Workers/LeaderboardWorker.cs rename to src/Managing.Application.Workers/LeaderboardWorker.cs index 54d383b..24c8868 100644 --- a/src/Managing.Api.Workers/Workers/LeaderboardWorker.cs +++ b/src/Managing.Application.Workers/LeaderboardWorker.cs @@ -1,17 +1,17 @@ -using Managing.Application.Abstractions.Services; -using Managing.Application.Workers; +using Managing.Application.Abstractions.Services; using Managing.Application.Workers.Abstractions; +using Microsoft.Extensions.Logging; using static Managing.Common.Enums; -namespace Managing.Api.Workers.Workers; +namespace Managing.Application.Workers; -public class LeaderboardWorker : BaseWorker +public class LeaderboardWorker : BaseWorker { private readonly IStatisticService _statisticService; private static readonly WorkerType _workerType = WorkerType.LeaderboardWorker; public LeaderboardWorker( - ILogger logger, + ILogger logger, IStatisticService statisticService, IWorkerService workerService) : base( _workerType, @@ -27,4 +27,4 @@ public class LeaderboardWorker : BaseWorker { await _statisticService.UpdateLeaderboard(); } -} \ No newline at end of file +} \ No newline at end of file diff --git a/src/Managing.Api.Workers/Workers/PricesBaseWorker.cs b/src/Managing.Application.Workers/PricesBaseWorker.cs similarity index 92% rename from src/Managing.Api.Workers/Workers/PricesBaseWorker.cs rename to src/Managing.Application.Workers/PricesBaseWorker.cs index d37148c..83c90f2 100644 --- a/src/Managing.Api.Workers/Workers/PricesBaseWorker.cs +++ b/src/Managing.Application.Workers/PricesBaseWorker.cs @@ -1,9 +1,9 @@ -using Managing.Application.Abstractions.Services; -using Managing.Application.Workers; +using Managing.Application.Abstractions.Services; using Managing.Application.Workers.Abstractions; +using Microsoft.Extensions.Logging; using static Managing.Common.Enums; -namespace Managing.Api.Workers.Workers; +namespace Managing.Application.Workers; public abstract class PricesBaseWorker : BaseWorker where T : class { @@ -64,4 +64,4 @@ public abstract class PricesBaseWorker : BaseWorker where T : class await _pricesService.UpdatePrice(TradingExchanges.Evm, ticker, _timeframe); } } -} \ No newline at end of file +} \ No newline at end of file diff --git a/src/Managing.Api.Workers/Workers/PricesFifteenMinutesWorker.cs b/src/Managing.Application.Workers/PricesFifteenMinutesWorker.cs similarity index 82% rename from src/Managing.Api.Workers/Workers/PricesFifteenMinutesWorker.cs rename to src/Managing.Application.Workers/PricesFifteenMinutesWorker.cs index bbc327b..fc4f63c 100644 --- a/src/Managing.Api.Workers/Workers/PricesFifteenMinutesWorker.cs +++ b/src/Managing.Application.Workers/PricesFifteenMinutesWorker.cs @@ -1,8 +1,9 @@ -using Managing.Application.Abstractions.Services; +using Managing.Application.Abstractions.Services; using Managing.Application.Workers.Abstractions; +using Microsoft.Extensions.Logging; using static Managing.Common.Enums; -namespace Managing.Api.Workers.Workers; +namespace Managing.Application.Workers; public class PricesFifteenMinutesWorker : PricesBaseWorker { @@ -21,4 +22,4 @@ public class PricesFifteenMinutesWorker : PricesBaseWorker { @@ -21,4 +22,4 @@ public class PricesFiveMinutesWorker : PricesBaseWorker ) { } -} \ No newline at end of file +} \ No newline at end of file diff --git a/src/Managing.Api.Workers/Workers/PricesFourHoursWorker.cs b/src/Managing.Application.Workers/PricesFourHoursWorker.cs similarity index 81% rename from src/Managing.Api.Workers/Workers/PricesFourHoursWorker.cs rename to src/Managing.Application.Workers/PricesFourHoursWorker.cs index 08fc4ed..50791c7 100644 --- a/src/Managing.Api.Workers/Workers/PricesFourHoursWorker.cs +++ b/src/Managing.Application.Workers/PricesFourHoursWorker.cs @@ -1,8 +1,9 @@ -using Managing.Application.Abstractions.Services; +using Managing.Application.Abstractions.Services; using Managing.Application.Workers.Abstractions; +using Microsoft.Extensions.Logging; using static Managing.Common.Enums; -namespace Managing.Api.Workers.Workers; +namespace Managing.Application.Workers; public class PricesFourHoursWorker : PricesBaseWorker { @@ -21,4 +22,4 @@ public class PricesFourHoursWorker : PricesBaseWorker ) { } -} \ No newline at end of file +} \ No newline at end of file diff --git a/src/Managing.Api.Workers/Workers/PricesOneDayWorker.cs b/src/Managing.Application.Workers/PricesOneDayWorker.cs similarity index 81% rename from src/Managing.Api.Workers/Workers/PricesOneDayWorker.cs rename to src/Managing.Application.Workers/PricesOneDayWorker.cs index 0667ad6..b82a9be 100644 --- a/src/Managing.Api.Workers/Workers/PricesOneDayWorker.cs +++ b/src/Managing.Application.Workers/PricesOneDayWorker.cs @@ -1,8 +1,9 @@ -using Managing.Application.Abstractions.Services; +using Managing.Application.Abstractions.Services; using Managing.Application.Workers.Abstractions; +using Microsoft.Extensions.Logging; using static Managing.Common.Enums; -namespace Managing.Api.Workers.Workers; +namespace Managing.Application.Workers; public class PricesOneDayWorker : PricesBaseWorker { @@ -21,4 +22,4 @@ public class PricesOneDayWorker : PricesBaseWorker ) { } -} \ No newline at end of file +} \ No newline at end of file diff --git a/src/Managing.Api.Workers/Workers/PricesOneHourWorker.cs b/src/Managing.Application.Workers/PricesOneHourWorker.cs similarity index 81% rename from src/Managing.Api.Workers/Workers/PricesOneHourWorker.cs rename to src/Managing.Application.Workers/PricesOneHourWorker.cs index 5b99fd7..10f6e34 100644 --- a/src/Managing.Api.Workers/Workers/PricesOneHourWorker.cs +++ b/src/Managing.Application.Workers/PricesOneHourWorker.cs @@ -1,8 +1,9 @@ -using Managing.Application.Abstractions.Services; +using Managing.Application.Abstractions.Services; using Managing.Application.Workers.Abstractions; +using Microsoft.Extensions.Logging; using static Managing.Common.Enums; -namespace Managing.Api.Workers.Workers; +namespace Managing.Application.Workers; public class PricesOneHourWorker : PricesBaseWorker { @@ -20,4 +21,4 @@ public class PricesOneHourWorker : PricesBaseWorker Timeframe.OneHour) { } -} \ No newline at end of file +} \ No newline at end of file diff --git a/src/Managing.Api.Workers/Workers/SpotlightWorker.cs b/src/Managing.Application.Workers/SpotlightWorker.cs similarity index 86% rename from src/Managing.Api.Workers/Workers/SpotlightWorker.cs rename to src/Managing.Application.Workers/SpotlightWorker.cs index 43ebde3..2d7cd6d 100644 --- a/src/Managing.Api.Workers/Workers/SpotlightWorker.cs +++ b/src/Managing.Application.Workers/SpotlightWorker.cs @@ -1,9 +1,9 @@ -using Managing.Application.Abstractions.Services; -using Managing.Application.Workers; +using Managing.Application.Abstractions.Services; using Managing.Application.Workers.Abstractions; using Managing.Common; +using Microsoft.Extensions.Logging; -namespace Managing.Api.Workers.Workers; +namespace Managing.Application.Workers; public class SpotlightWorker : BaseWorker { @@ -33,4 +33,4 @@ public class SpotlightWorker : BaseWorker throw; } } -} \ No newline at end of file +} \ No newline at end of file diff --git a/src/Managing.Api.Workers/Workers/TraderWatcher.cs b/src/Managing.Application.Workers/TraderWatcher.cs similarity index 85% rename from src/Managing.Api.Workers/Workers/TraderWatcher.cs rename to src/Managing.Application.Workers/TraderWatcher.cs index bfd851f..9500a3d 100644 --- a/src/Managing.Api.Workers/Workers/TraderWatcher.cs +++ b/src/Managing.Application.Workers/TraderWatcher.cs @@ -1,15 +1,15 @@ -using Managing.Application.Abstractions.Services; -using Managing.Application.Workers; +using Managing.Application.Abstractions.Services; using Managing.Application.Workers.Abstractions; +using Microsoft.Extensions.Logging; using static Managing.Common.Enums; -namespace Managing.Api.Workers.Workers; +namespace Managing.Application.Workers; /// /// Represents a worker that watches traders and performs actions based on trading activities. -/// Inherits from where TWorker is . +/// Inherits from where TWorker is . /// -public class TraderWatcher : BaseWorker +public class TraderWatcher : BaseWorker { private readonly ITradingService _tradingService; private static readonly WorkerType _workerType = WorkerType.TraderWatcher; @@ -21,7 +21,7 @@ public class TraderWatcher : BaseWorker /// The trading service to monitor trading activities. /// The worker service to manage worker lifecycle. public TraderWatcher( - ILogger logger, + ILogger logger, ITradingService tradingService, IWorkerService workerService) : base( _workerType, @@ -41,4 +41,4 @@ public class TraderWatcher : BaseWorker { await _tradingService.WatchTrader(); } -} \ No newline at end of file +} \ No newline at end of file diff --git a/src/Managing.Bootstrap/WorkersBootstrap.cs b/src/Managing.Bootstrap/WorkersBootstrap.cs index 110997e..2f985ca 100644 --- a/src/Managing.Bootstrap/WorkersBootstrap.cs +++ b/src/Managing.Bootstrap/WorkersBootstrap.cs @@ -49,6 +49,7 @@ public static class WorkersBootstrap { return services .AddApplication() + .AddWorkers(configuration) .AddInfrastructure(configuration); } @@ -76,6 +77,58 @@ public static class WorkersBootstrap private static IServiceCollection AddWorkers(this IServiceCollection services, IConfiguration configuration) { + // Price Workers + if (configuration.GetValue("WorkerPricesFifteenMinutes", false)) + { + services.AddHostedService(); + } + + if (configuration.GetValue("WorkerPricesOneHour", false)) + { + services.AddHostedService(); + } + + if (configuration.GetValue("WorkerPricesFourHours", false)) + { + services.AddHostedService(); + } + + if (configuration.GetValue("WorkerPricesOneDay", false)) + { + services.AddHostedService(); + } + + if (configuration.GetValue("WorkerPricesFiveMinutes", false)) + { + services.AddHostedService(); + } + + // Other Workers + if (configuration.GetValue("WorkerFee", false)) + { + services.AddHostedService(); + } + + if (configuration.GetValue("WorkerSpotlight", false)) + { + services.AddHostedService(); + } + + if (configuration.GetValue("WorkerTraderWatcher", false)) + { + services.AddHostedService(); + } + + if (configuration.GetValue("WorkerLeaderboard", false)) + { + services.AddHostedService(); + } + + if (configuration.GetValue("WorkerFundingRatesWatcher", false)) + { + services.AddHostedService(); + } + return services; }