diff --git a/src/Managing.Application/Abstractions/IBotService.cs b/src/Managing.Application/Abstractions/IBotService.cs index b0aef5c..cca593c 100644 --- a/src/Managing.Application/Abstractions/IBotService.cs +++ b/src/Managing.Application/Abstractions/IBotService.cs @@ -13,7 +13,7 @@ public interface IBotService void AddTradingBotToCache(ITradingBot bot); List GetActiveBots(); IEnumerable GetSavedBots(); - void StartBot(BotBackup backupBot); + void StartBotFromBackup(BotBackup backupBot); ITradingBot CreateScalpingBot(string accountName, MoneyManagement moneyManagement, string name, Enums.Ticker ticker, string scenario, Enums.Timeframe interval, bool isForWatchingOnly); diff --git a/src/Managing.Application/Bots/TradingBot.cs b/src/Managing.Application/Bots/TradingBot.cs index 0a380e9..21c1f80 100644 --- a/src/Managing.Application/Bots/TradingBot.cs +++ b/src/Managing.Application/Bots/TradingBot.cs @@ -744,5 +744,5 @@ public class TradingBotBackup public string AccountName { get; set; } public bool IsForWatchingOnly { get; set; } public Dictionary WalletBalances { get; set; } - public MoneyManagement MoneyManagement { get; internal set; } + public MoneyManagement MoneyManagement { get; set; } } \ No newline at end of file diff --git a/src/Managing.Application/ManageBot/BotService.cs b/src/Managing.Application/ManageBot/BotService.cs index 8f72196..d6591dc 100644 --- a/src/Managing.Application/ManageBot/BotService.cs +++ b/src/Managing.Application/ManageBot/BotService.cs @@ -1,8 +1,12 @@ using Managing.Application.Abstractions; +using Managing.Application.Abstractions.Services; using Managing.Application.Bots; using Managing.Common; using Managing.Core; using Managing.Domain.Bots; +using Managing.Domain.MoneyManagements; +using Managing.Domain.Workflows; +using Microsoft.Extensions.Logging; using Newtonsoft.Json; namespace Managing.Application.ManageBot @@ -11,14 +15,24 @@ namespace Managing.Application.ManageBot { private readonly IBotRepository _botRepository; private readonly ITaskCache _taskCache; - private readonly IBotFactory _botFactory; - + private readonly IExchangeService _exchangeService; + private readonly IMessengerService _messengerService; + private readonly IAccountService _accountService; + private readonly ILogger _tradingBotLogger; + private readonly ITradingService _tradingService; - public BotService(IBotRepository botRepository, ITaskCache taskCache, IBotFactory botFactory) + + public BotService(IBotRepository botRepository, ITaskCache taskCache, IExchangeService exchangeService, + IMessengerService messengerService, IAccountService accountService, ILogger tradingBotLogger, + ITradingService tradingService) { _botRepository = botRepository; _taskCache = taskCache; - _botFactory = botFactory; + _exchangeService = exchangeService; + _messengerService = messengerService; + _accountService = accountService; + _tradingBotLogger = tradingBotLogger; + _tradingService = tradingService; } public async void SaveBotBackup(BotBackup botBackup) @@ -73,20 +87,20 @@ namespace Managing.Application.ManageBot return _botRepository.GetBots(); } - public void StartBot(BotBackup backupBot) + public void StartBotFromBackup(BotBackup backupBot) { switch (backupBot.BotType) { case Enums.BotType.SimpleBot: Func> simpleBot = () => - Task.FromResult(_botFactory.CreateSimpleBot(backupBot.Name, null)); + Task.FromResult(CreateSimpleBot(backupBot.Name, null)); var bot1 = _taskCache.AddOrGetExisting(backupBot.Name, simpleBot).Result; bot1.LoadBackup(backupBot); bot1.Start(); break; case Enums.BotType.ScalpingBot: var data = JsonConvert.DeserializeObject(backupBot.Data); - Func> scalpingBot = () => Task.FromResult(_botFactory.CreateScalpingBot( + Func> scalpingBot = () => Task.FromResult(CreateScalpingBot( data.AccountName, data.MoneyManagement, data.Name, @@ -100,7 +114,7 @@ namespace Managing.Application.ManageBot break; case Enums.BotType.FlippingBot: var dataFlippingBot = JsonConvert.DeserializeObject(backupBot.Data); - Func> flippingBot = () => Task.FromResult(_botFactory.CreateFlippingBot( + Func> flippingBot = () => Task.FromResult(CreateFlippingBot( dataFlippingBot.AccountName, dataFlippingBot.MoneyManagement, dataFlippingBot.Name, @@ -116,5 +130,88 @@ namespace Managing.Application.ManageBot ; } + + public IBot CreateSimpleBot(string botName, Workflow workflow) + { + return new SimpleBot(botName, _tradingBotLogger, workflow, this); + } + + public ITradingBot CreateScalpingBot(string accountName, MoneyManagement moneyManagement, string name, + Enums.Ticker ticker, string scenario, Enums.Timeframe interval, bool isForWatchingOnly) + { + return new ScalpingBot( + accountName, + moneyManagement, + name, + scenario, + _exchangeService, + ticker, + _tradingService, + _tradingBotLogger, + interval, + _accountService, + _messengerService, + this, + isForWatchingOnly: isForWatchingOnly); + } + + public ITradingBot CreateBacktestScalpingBot(string accountName, MoneyManagement moneyManagement, + Enums.Ticker ticker, string scenario, Enums.Timeframe interval, bool isForWatchingOnly) + { + return new ScalpingBot( + accountName, + moneyManagement, + "BacktestBot", + scenario, + _exchangeService, + ticker, + _tradingService, + _tradingBotLogger, + interval, + _accountService, + _messengerService, + this, + true, + isForWatchingOnly); + } + + public ITradingBot CreateFlippingBot(string accountName, MoneyManagement moneyManagement, string name, + Enums.Ticker ticker, string scenario, Enums.Timeframe interval, bool isForWatchingOnly) + { + return new FlippingBot( + accountName, + moneyManagement, + name, + scenario, + _exchangeService, + ticker, + _tradingService, + _tradingBotLogger, + interval, + _accountService, + _messengerService, + this, + isForWatchingOnly: isForWatchingOnly); + } + + public ITradingBot CreateBacktestFlippingBot(string accountName, MoneyManagement moneyManagement, + Enums.Ticker ticker, string scenario, Enums.Timeframe interval, bool isForWatchingOnly) + { + return new FlippingBot( + accountName, + moneyManagement, + "BacktestBot", + scenario, + _exchangeService, + ticker, + _tradingService, + _tradingBotLogger, + interval, + _accountService, + _messengerService, + this, + true, + isForWatchingOnly); + } } } \ No newline at end of file diff --git a/src/Managing.Application/ManageBot/LoadBackupBotCommandHandler.cs b/src/Managing.Application/ManageBot/LoadBackupBotCommandHandler.cs index b738834..84a8443 100644 --- a/src/Managing.Application/ManageBot/LoadBackupBotCommandHandler.cs +++ b/src/Managing.Application/ManageBot/LoadBackupBotCommandHandler.cs @@ -42,7 +42,7 @@ public class LoadBackupBotCommandHandler : IRequestHandler b.GetName() == backupBot.Name); + result.Add(scalpingBot.GetName(), BotStatus.Backup); } else { diff --git a/src/Managing.Infrastructure.Storage/TaskCache.cs b/src/Managing.Infrastructure.Storage/TaskCache.cs index 6a1c66d..ace37a9 100644 --- a/src/Managing.Infrastructure.Storage/TaskCache.cs +++ b/src/Managing.Infrastructure.Storage/TaskCache.cs @@ -8,11 +8,14 @@ namespace Managing.Infrastructure.Storage public class TaskCache : ITaskCache { private MemoryCache _cache { get; } = MemoryCache.Default; - private CacheItemPolicy _defaultPolicy { get; } = new CacheItemPolicy(); + + private CacheItemPolicy _defaultPolicy { get; } = new CacheItemPolicy() + { + SlidingExpiration = TimeSpan.FromMinutes(15), + }; public async Task AddOrGetExisting(string key, Func> valueFactory) { - var asyncLazyValue = new AsyncLazy(valueFactory); var existingValue = (AsyncLazy)_cache.AddOrGetExisting(key, asyncLazyValue, _defaultPolicy); @@ -33,6 +36,7 @@ namespace Managing.Infrastructure.Storage // Get the most recent value with a recursive call. return await AddOrGetExisting(key, valueFactory); } + return result; } catch (Exception) @@ -71,7 +75,7 @@ namespace Managing.Infrastructure.Storage public virtual List GetCache() { List list = new List(); - + foreach (var item in _cache) { list.Add((T)item.Value); @@ -80,4 +84,4 @@ namespace Managing.Infrastructure.Storage return list; } } -} +} \ No newline at end of file