diff --git a/src/Managing.Api/Controllers/BacktestController.cs b/src/Managing.Api/Controllers/BacktestController.cs index 027c4f9..857ca31 100644 --- a/src/Managing.Api/Controllers/BacktestController.cs +++ b/src/Managing.Api/Controllers/BacktestController.cs @@ -249,12 +249,12 @@ public class RunBacktestRequest public bool Save { get; set; } = false; /// - /// The name of the money management strategy to use (optional if MoneyManagement is provided) + /// The name of the money management to use (optional if MoneyManagement is provided) /// public string? MoneyManagementName { get; set; } /// - /// The money management strategy details (optional if MoneyManagementName is provided) + /// The money management details (optional if MoneyManagementName is provided) /// public MoneyManagement? MoneyManagement { get; set; } } \ No newline at end of file diff --git a/src/Managing.Api/Controllers/ScenarioController.cs b/src/Managing.Api/Controllers/ScenarioController.cs index 2806bf0..0aa569c 100644 --- a/src/Managing.Api/Controllers/ScenarioController.cs +++ b/src/Managing.Api/Controllers/ScenarioController.cs @@ -28,7 +28,7 @@ public class ScenarioController : BaseController /// The service for user-related operations. public ScenarioController( IScenarioService scenarioService, - IUserService userService) + IUserService userService) : base(userService) { _scenarioService = scenarioService; @@ -52,7 +52,8 @@ public class ScenarioController : BaseController /// A list of strategy names to include in the scenario. /// The created scenario. [HttpPost] - public async Task> CreateScenario(string name, List strategies, int? loopbackPeriod = null) + public async Task> CreateScenario(string name, List strategies, + int? loopbackPeriod = null) { var user = await GetUser(); return Ok(_scenarioService.CreateScenarioForUser(user, name, strategies, loopbackPeriod)); @@ -83,31 +84,31 @@ public class ScenarioController : BaseController /// /// A list of strategies. [HttpGet] - [Route("strategy")] - public async Task>> GetStrategies() + [Route("indicator")] + public async Task>> GetIndicators() { var user = await GetUser(); - return Ok(_scenarioService.GetStrategiesByUser(user)); + return Ok(_scenarioService.GetIndicatorsByUser(user)); } /// - /// Creates a new strategy with specified parameters for the authenticated user. + /// Creates a new indicator with specified parameters for the authenticated user. /// - /// The type of the strategy. - /// The name of the strategy. - /// The period for the strategy (optional). - /// The fast periods for the strategy (optional). - /// The slow periods for the strategy (optional). - /// The signal periods for the strategy (optional). - /// The multiplier for the strategy (optional). - /// The stochastic periods for the strategy (optional). - /// The smooth periods for the strategy (optional). - /// The cycle periods for the strategy (optional). - /// The created strategy. + /// The type of the indicator. + /// The name of the indicator. + /// The period for the indicator (optional). + /// The fast periods for the indicator (optional). + /// The slow periods for the indicator (optional). + /// The signal periods for the indicator (optional). + /// The multiplier for the indicator (optional). + /// The stochastic periods for the indicator (optional). + /// The smooth periods for the indicator (optional). + /// The cycle periods for the indicator (optional). + /// The created indicator. [HttpPost] - [Route("strategy")] - public async Task> CreateStrategy( - StrategyType strategyType, + [Route("indicator")] + public async Task> CreateIndicator( + IndicatorType indicatorType, string name, int? period = null, int? fastPeriods = null, @@ -119,9 +120,9 @@ public class ScenarioController : BaseController int? cyclePeriods = null) { var user = await GetUser(); - return Ok(_scenarioService.CreateStrategyForUser( + return Ok(_scenarioService.CreateIndicatorForUser( user, - strategyType, + indicatorType, name, period, fastPeriods, @@ -134,23 +135,23 @@ public class ScenarioController : BaseController } /// - /// Deletes a strategy by name for the authenticated user. + /// Deletes a indicator by name for the authenticated user. /// - /// The name of the strategy to delete. + /// The name of the indicator to delete. /// An ActionResult indicating the outcome of the operation. [HttpDelete] - [Route("strategy")] - public async Task DeleteStrategy(string name) + [Route("indicator")] + public async Task DeleteIndicator(string name) { var user = await GetUser(); - return Ok(_scenarioService.DeleteStrategyByUser(user, name)); + return Ok(_scenarioService.DeleteIndicatorByUser(user, name)); } - // Update strategy + // Update indicator [HttpPut] - [Route("strategy")] - public async Task UpdateStrategy( - StrategyType strategyType, + [Route("indicator")] + public async Task Updateindicator( + IndicatorType indicatorType, string name, int? period = null, int? fastPeriods = null, @@ -162,9 +163,9 @@ public class ScenarioController : BaseController int? cyclePeriods = null) { var user = await GetUser(); - return Ok(_scenarioService.UpdateStrategyByUser( + return Ok(_scenarioService.UpdateIndicatorByUser( user, - strategyType, + indicatorType, name, period, fastPeriods, diff --git a/src/Managing.Api/Models/Requests/CreateScenarioRequest.cs b/src/Managing.Api/Models/Requests/CreateScenarioRequest.cs index 95ed55d..c1310e8 100644 --- a/src/Managing.Api/Models/Requests/CreateScenarioRequest.cs +++ b/src/Managing.Api/Models/Requests/CreateScenarioRequest.cs @@ -4,9 +4,7 @@ namespace Managing.Api.Models.Requests { public class CreateScenarioRequest { - [Required] - public string Name { get; internal set; } - [Required] - public List Strategies { get; internal set; } + [Required] public string Name { get; internal set; } + [Required] public List Indicators { get; internal set; } } -} +} \ No newline at end of file diff --git a/src/Managing.Api/Models/Requests/CreateStrategyRequest.cs b/src/Managing.Api/Models/Requests/CreateStrategyRequest.cs index 88fc80f..be0ad0d 100644 --- a/src/Managing.Api/Models/Requests/CreateStrategyRequest.cs +++ b/src/Managing.Api/Models/Requests/CreateStrategyRequest.cs @@ -5,12 +5,8 @@ namespace Managing.Api.Models.Requests; public class CreateStrategyRequest { - [Required] - public StrategyType Type { get; internal set; } - [Required] - public Timeframe Timeframe { get; internal set; } - [Required] - public string Name { get; internal set; } - [Required] - public int Period { get; internal set; } -} + [Required] public IndicatorType Type { get; internal set; } + [Required] public Timeframe Timeframe { get; internal set; } + [Required] public string Name { get; internal set; } + [Required] public int Period { get; internal set; } +} \ No newline at end of file diff --git a/src/Managing.Application.Abstractions/Repositories/ITradingRepository.cs b/src/Managing.Application.Abstractions/Repositories/ITradingRepository.cs index e38b87a..9c8120c 100644 --- a/src/Managing.Application.Abstractions/Repositories/ITradingRepository.cs +++ b/src/Managing.Application.Abstractions/Repositories/ITradingRepository.cs @@ -14,15 +14,15 @@ public interface ITradingRepository Signal GetSignalByIdentifier(string identifier, User user = null); void InsertPosition(Position position); void UpdatePosition(Position position); - Strategy GetStrategyByName(string strategy); + Indicator GetStrategyByName(string strategy); void InsertScenario(Scenario scenario); - void InsertStrategy(Strategy strategy); + void InsertStrategy(Indicator indicator); IEnumerable GetScenarios(); - IEnumerable GetStrategies(); + IEnumerable GetIndicators(); void DeleteScenario(string name); - void DeleteStrategy(string name); + void DeleteIndicator(string name); void DeleteScenarios(); - void DeleteStrategies(); + void DeleteIndicators(); Position GetPositionByIdentifier(string identifier); IEnumerable GetPositions(PositionInitiator positionInitiator); IEnumerable GetPositionsByStatus(PositionStatus positionStatus); @@ -30,5 +30,5 @@ public interface ITradingRepository void InsertFee(Fee fee); void UpdateFee(Fee fee); void UpdateScenario(Scenario scenario); - void UpdateStrategy(Strategy strategy); + void UpdateStrategy(Indicator indicator); } \ No newline at end of file diff --git a/src/Managing.Application.Abstractions/Services/ITradingService.cs b/src/Managing.Application.Abstractions/Services/ITradingService.cs index 86e4b4b..a128f45 100644 --- a/src/Managing.Application.Abstractions/Services/ITradingService.cs +++ b/src/Managing.Application.Abstractions/Services/ITradingService.cs @@ -14,11 +14,11 @@ public interface ITradingService void InsertSignal(Signal signal); void InsertPosition(Position position); void UpdatePosition(Position position); - Strategy GetStrategyByName(string strategy); + Indicator GetStrategyByName(string strategy); void InsertScenario(Scenario scenario); - void InsertStrategy(Strategy strategy); + void InsertStrategy(Indicator indicator); IEnumerable GetScenarios(); - IEnumerable GetStrategies(); + IEnumerable GetStrategies(); void DeleteScenario(string name); void DeleteStrategy(string name); void DeleteScenarios(); @@ -34,7 +34,7 @@ public interface ITradingService IEnumerable GetTradersWatch(); void UpdateDeltaNeutralOpportunities(); void UpdateScenario(Scenario scenario); - void UpdateStrategy(Strategy strategy); + void UpdateStrategy(Indicator indicator); Task> GetBrokerPositions(Account account); Task InitPrivyWallet(string publicAddress); } \ No newline at end of file diff --git a/src/Managing.Application.Tests/BotsTests.cs b/src/Managing.Application.Tests/BotsTests.cs index 438b861..4fd2f87 100644 --- a/src/Managing.Application.Tests/BotsTests.cs +++ b/src/Managing.Application.Tests/BotsTests.cs @@ -61,8 +61,8 @@ namespace Managing.Application.Tests { // Arrange var scenario = new Scenario("FlippingScenario"); - var strategy = ScenarioHelpers.BuildStrategy(StrategyType.RsiDivergence, "RsiDiv", period: 14); - scenario.AddStrategy(strategy); + var strategy = ScenarioHelpers.BuildIndicator(IndicatorType.RsiDivergence, "RsiDiv", period: 14); + scenario.AddIndicator(strategy); var localCandles = FileHelpers.ReadJson>($"{ticker.ToString()}-{timeframe.ToString()}-candles.json"); @@ -113,8 +113,8 @@ namespace Managing.Application.Tests { // Arrange var scenario = new Scenario("ScalpingScenario"); - var strategy = ScenarioHelpers.BuildStrategy(StrategyType.RsiDivergence, "RsiDiv", period: 5); - scenario.AddStrategy(strategy); + var strategy = ScenarioHelpers.BuildIndicator(IndicatorType.RsiDivergence, "RsiDiv", period: 5); + scenario.AddIndicator(strategy); var config = new TradingBotConfig { @@ -154,9 +154,9 @@ namespace Managing.Application.Tests { // Arrange var scenario = new Scenario("ScalpingScenario"); - var strategy = ScenarioHelpers.BuildStrategy(StrategyType.MacdCross, "RsiDiv", fastPeriods: 12, + var strategy = ScenarioHelpers.BuildIndicator(IndicatorType.MacdCross, "RsiDiv", fastPeriods: 12, slowPeriods: 26, signalPeriods: 9); - scenario.AddStrategy(strategy); + scenario.AddIndicator(strategy); var moneyManagement = new MoneyManagement() { @@ -198,9 +198,9 @@ namespace Managing.Application.Tests } [Theory] - [InlineData(Timeframe.FifteenMinutes, -6, StrategyType.Stc, BotType.ScalpingBot)] + [InlineData(Timeframe.FifteenMinutes, -6, IndicatorType.Stc, BotType.ScalpingBot)] //[InlineData(Timeframe.FifteenMinutes, -6, Enums.StrategyType.RsiDivergenceConfirm, Enums.BotType.FlippingBot)] - public void GetBestPeriodRsiForDivergenceFlippingBot(Timeframe timeframe, int days, StrategyType strategyType, + public void GetBestPeriodRsiForDivergenceFlippingBot(Timeframe timeframe, int days, IndicatorType indicatorType, BotType botType) { var result = new List>(); @@ -213,7 +213,7 @@ namespace Managing.Application.Tests var periodRange = new List() { 2, 7 }; var stopLossRange = new List() { 0.005m, 0.05m, 0.005m }; var takeProfitRange = new List() { 0.01m, 0.1m, 0.02m }; - var fileIdentifier = $"{strategyType}-{timeframe}"; + var fileIdentifier = $"{indicatorType}-{timeframe}"; var completedTest = 0; var totalTests = GetTotalTrades(periodRange, stopLossRange, takeProfitRange) * Enum.GetNames(typeof(Ticker)).Length; @@ -232,8 +232,8 @@ namespace Managing.Application.Tests Parallel.For(periodRange[0], periodRange[1], options, i => { var scenario = new Scenario("ScalpingScenario"); - var strategy = ScenarioHelpers.BuildStrategy(strategyType, "RsiDiv", period: i); - scenario.AddStrategy(strategy); + var strategy = ScenarioHelpers.BuildIndicator(indicatorType, "RsiDiv", period: i); + scenario.AddIndicator(strategy); // -0.5 to -5 for (decimal s = stopLossRange[0]; s < stopLossRange[1]; s += stopLossRange[2]) @@ -343,9 +343,9 @@ namespace Managing.Application.Tests [Theory] - [InlineData(Timeframe.OneHour, -30, StrategyType.MacdCross, BotType.FlippingBot)] - [InlineData(Timeframe.OneHour, -30, StrategyType.MacdCross, BotType.ScalpingBot)] - public void GetBestMMForMacdFlippingBot(Timeframe timeframe, int days, StrategyType strategyType, + [InlineData(Timeframe.OneHour, -30, IndicatorType.MacdCross, BotType.FlippingBot)] + [InlineData(Timeframe.OneHour, -30, IndicatorType.MacdCross, BotType.ScalpingBot)] + public void GetBestMMForMacdFlippingBot(Timeframe timeframe, int days, IndicatorType indicatorType, BotType botType) { var result = new List>(); @@ -357,7 +357,7 @@ namespace Managing.Application.Tests var stopLossRange = new List() { 0.005m, 0.05m, 0.005m }; var takeProfitRange = new List() { 0.01m, 0.1m, 0.02m }; - var fileIdentifier = $"{strategyType}-{timeframe}-{botType}"; + var fileIdentifier = $"{indicatorType}-{timeframe}-{botType}"; var completedTest = 0; var totalTests = GetTotalTradeForStopLossTakeProfit(stopLossRange, takeProfitRange) * Enum.GetNames(typeof(Ticker)).Length; @@ -374,9 +374,9 @@ namespace Managing.Application.Tests return; var scenario = new Scenario("ScalpingScenario"); - var strategy = ScenarioHelpers.BuildStrategy(strategyType, "RsiDiv", fastPeriods: 12, + var strategy = ScenarioHelpers.BuildIndicator(indicatorType, "RsiDiv", fastPeriods: 12, slowPeriods: 26, signalPeriods: 9); - scenario.AddStrategy(strategy); + scenario.AddIndicator(strategy); // -0.5 to -5 for (decimal s = stopLossRange[0]; s < stopLossRange[1]; s += stopLossRange[2]) @@ -601,8 +601,8 @@ namespace Managing.Application.Tests Console.WriteLine("\n=== EXAMPLE SCENARIOS ==="); foreach (var scenario in scenarios.Take(3)) { - Console.WriteLine($"Scenario: {scenario.Name} ({scenario.Strategies.Count} strategies)"); - foreach (var strategy in scenario.Strategies) + Console.WriteLine($"Scenario: {scenario.Name} ({scenario.Indicators.Count} strategies)"); + foreach (var strategy in scenario.Indicators) { Console.WriteLine($" - {strategy.Name} (Type: {strategy.Type})"); } @@ -694,7 +694,7 @@ namespace Managing.Application.Tests var scenarioResult = new ScenarioBacktestResult { ScenarioName = scenario.Name, - StrategyCount = scenario.Strategies.Count, + StrategyCount = scenario.Indicators.Count, Ticker = ticker.ToString(), BotType = botType.ToString(), FinalPnl = backtestResult.FinalPnl, @@ -994,54 +994,56 @@ namespace Managing.Application.Tests // Signal strategies strategies.Add(new StrategyConfiguration { - Type = StrategyType.RsiDivergence, Name = "RSI_Divergence", ParameterSets = GetRsiDivergenceParameters() + Type = IndicatorType.RsiDivergence, Name = "RSI_Divergence", + ParameterSets = GetRsiDivergenceParameters() }); strategies.Add(new StrategyConfiguration { - Type = StrategyType.RsiDivergenceConfirm, Name = "RSI_Divergence_Confirm", + Type = IndicatorType.RsiDivergenceConfirm, Name = "RSI_Divergence_Confirm", ParameterSets = GetRsiDivergenceConfirmParameters() }); strategies.Add(new StrategyConfiguration - { Type = StrategyType.MacdCross, Name = "MACD_Cross", ParameterSets = GetMacdCrossParameters() }); + { Type = IndicatorType.MacdCross, Name = "MACD_Cross", ParameterSets = GetMacdCrossParameters() }); strategies.Add(new StrategyConfiguration - { Type = StrategyType.EmaCross, Name = "EMA_Cross", ParameterSets = GetEmaCrossParameters() }); + { Type = IndicatorType.EmaCross, Name = "EMA_Cross", ParameterSets = GetEmaCrossParameters() }); strategies.Add(new StrategyConfiguration { - Type = StrategyType.DualEmaCross, Name = "Dual_EMA_Cross", ParameterSets = GetDualEmaCrossParameters() + Type = IndicatorType.DualEmaCross, Name = "Dual_EMA_Cross", ParameterSets = GetDualEmaCrossParameters() }); strategies.Add(new StrategyConfiguration - { Type = StrategyType.SuperTrend, Name = "SuperTrend", ParameterSets = GetSuperTrendParameters() }); + { Type = IndicatorType.SuperTrend, Name = "SuperTrend", ParameterSets = GetSuperTrendParameters() }); strategies.Add(new StrategyConfiguration { - Type = StrategyType.ChandelierExit, Name = "Chandelier_Exit", + Type = IndicatorType.ChandelierExit, Name = "Chandelier_Exit", ParameterSets = GetChandelierExitParameters() }); strategies.Add(new StrategyConfiguration - { Type = StrategyType.Stc, Name = "STC", ParameterSets = GetStcParameters() }); + { Type = IndicatorType.Stc, Name = "STC", ParameterSets = GetStcParameters() }); strategies.Add(new StrategyConfiguration - { Type = StrategyType.LaggingStc, Name = "Lagging_STC", ParameterSets = GetLaggingStcParameters() }); + { Type = IndicatorType.LaggingStc, Name = "Lagging_STC", ParameterSets = GetLaggingStcParameters() }); strategies.Add(new StrategyConfiguration { - Type = StrategyType.ThreeWhiteSoldiers, Name = "Three_White_Soldiers", + Type = IndicatorType.ThreeWhiteSoldiers, Name = "Three_White_Soldiers", ParameterSets = GetThreeWhiteSoldiersParameters() }); strategies.Add(new StrategyConfiguration { - Type = StrategyType.SuperTrendCrossEma, Name = "SuperTrend_Cross_EMA", + Type = IndicatorType.SuperTrendCrossEma, Name = "SuperTrend_Cross_EMA", ParameterSets = GetSuperTrendCrossEmaParameters() }); // Trend strategies strategies.Add(new StrategyConfiguration - { Type = StrategyType.EmaTrend, Name = "EMA_Trend", ParameterSets = GetEmaTrendParameters() }); + { Type = IndicatorType.EmaTrend, Name = "EMA_Trend", ParameterSets = GetEmaTrendParameters() }); strategies.Add(new StrategyConfiguration { - Type = StrategyType.StochRsiTrend, Name = "StochRSI_Trend", ParameterSets = GetStochRsiTrendParameters() + Type = IndicatorType.StochRsiTrend, Name = "StochRSI_Trend", + ParameterSets = GetStochRsiTrendParameters() }); // Context strategies strategies.Add(new StrategyConfiguration - { Type = StrategyType.StDev, Name = "Standard_Deviation", ParameterSets = GetStDevParameters() }); + { Type = IndicatorType.StDev, Name = "Standard_Deviation", ParameterSets = GetStDevParameters() }); return strategies; } @@ -1097,7 +1099,7 @@ namespace Managing.Application.Tests foreach (var (strategyConfig, parameterSet) in strategyParams) { - var strategy = ScenarioHelpers.BuildStrategy( + var strategy = ScenarioHelpers.BuildIndicator( strategyConfig.Type, $"{strategyConfig.Name}_{parameterSet.Name}", period: parameterSet.Period, @@ -1109,7 +1111,7 @@ namespace Managing.Application.Tests smoothPeriods: parameterSet.SmoothPeriods, cyclePeriods: parameterSet.CyclePeriods); - scenario.AddStrategy(strategy); + scenario.AddIndicator(strategy); } return scenario; @@ -1449,7 +1451,7 @@ namespace Managing.Application.Tests public class StrategyConfiguration { - public StrategyType Type { get; set; } + public IndicatorType Type { get; set; } public string Name { get; set; } public List ParameterSets { get; set; } = new(); } diff --git a/src/Managing.Application.Tests/StrategyTests.cs b/src/Managing.Application.Tests/IndicatorTests.cs similarity index 93% rename from src/Managing.Application.Tests/StrategyTests.cs rename to src/Managing.Application.Tests/IndicatorTests.cs index 3c6561e..ffa838f 100644 --- a/src/Managing.Application.Tests/StrategyTests.cs +++ b/src/Managing.Application.Tests/IndicatorTests.cs @@ -8,11 +8,11 @@ using static Managing.Common.Enums; namespace Managing.Application.Tests { - public class StrategyTests + public class IndicatorTests { private readonly IExchangeService _exchangeService; - public StrategyTests() + public IndicatorTests() { _exchangeService = TradingBaseTests.GetExchangeService(); } @@ -24,7 +24,7 @@ namespace Managing.Application.Tests { var account = GetAccount(exchange); // Arrange - var rsiStrategy = new RsiDivergenceStrategy("unittest", 5); + var rsiStrategy = new RsiDivergenceIndicator("unittest", 5); var candles = _exchangeService.GetCandles(account, ticker, DateTime.Now.AddDays(-50), timeframe).Result; var resultSignal = new List(); @@ -58,7 +58,7 @@ namespace Managing.Application.Tests { // Arrange var account = GetAccount(exchange); - var rsiStrategy = new RsiDivergenceStrategy("unittest", 5); + var rsiStrategy = new RsiDivergenceIndicator("unittest", 5); var candles = _exchangeService.GetCandles(account, ticker, DateTime.Now.AddDays(-50), timeframe).Result; var resultSignal = new List(); @@ -85,7 +85,7 @@ namespace Managing.Application.Tests { // Arrange var account = GetAccount(exchange); - var rsiStrategy = new MacdCrossStrategy("unittest", 12, 26, 9); + var rsiStrategy = new MacdCrossIndicator("unittest", 12, 26, 9); var candles = await _exchangeService.GetCandles(account, ticker, DateTime.Now.AddDays(days), timeframe); var resultSignal = new List(); @@ -112,7 +112,7 @@ namespace Managing.Application.Tests { // Arrange var account = GetAccount(exchange); - var superTrendStrategy = new SuperTrendStrategy("unittest", 10, 3); + var superTrendStrategy = new SuperTrendIndicator("unittest", 10, 3); var candles = _exchangeService.GetCandles(account, ticker, DateTime.Now.AddDays(days), timeframe).Result; var resultSignal = new List(); @@ -139,7 +139,7 @@ namespace Managing.Application.Tests { // Arrange var account = GetAccount(exchange); - var chandelierExitStrategy = new ChandelierExitStrategy("unittest", 22, 3); + var chandelierExitStrategy = new ChandelierExitIndicator("unittest", 22, 3); var candles = _exchangeService.GetCandles(account, ticker, DateTime.Now.AddDays(days), timeframe, false) .Result; var resultSignal = new List(); @@ -167,7 +167,7 @@ namespace Managing.Application.Tests { // Arrange var account = GetAccount(exchange); - var emaTrendSrategy = new EmaTrendStrategy("unittest", 200); + var emaTrendSrategy = new EmaTrendIndicator("unittest", 200); var candles = _exchangeService.GetCandles(account, ticker, DateTime.Now.AddDays(days), timeframe).Result; var resultSignal = new List(); @@ -195,7 +195,7 @@ namespace Managing.Application.Tests { // Arrange var account = GetAccount(exchange); - var stochRsiStrategy = new StochRsiTrendStrategy("unittest", 14, 14, 3, 1); + var stochRsiStrategy = new StochRsiTrendIndicator("unittest", 14, 14, 3, 1); var candles = _exchangeService.GetCandles(account, ticker, DateTime.Now.AddDays(days), timeframe).Result; var resultSignal = new List(); diff --git a/src/Managing.Application/Abstractions/IScenarioService.cs b/src/Managing.Application/Abstractions/IScenarioService.cs index c15cfd4..ea95d3d 100644 --- a/src/Managing.Application/Abstractions/IScenarioService.cs +++ b/src/Managing.Application/Abstractions/IScenarioService.cs @@ -9,12 +9,12 @@ namespace Managing.Application.Abstractions { IEnumerable GetScenarios(); Scenario CreateScenario(string name, List strategies, int? loopbackPeriod = 1); - IEnumerable GetStrategies(); + IEnumerable GetStrategies(); bool DeleteStrategy(string name); bool DeleteScenario(string name); Scenario GetScenario(string name); - Strategy CreateStrategy(StrategyType type, + Indicator CreateStrategy(IndicatorType type, string name, int? period = null, int? fastPeriods = null, @@ -29,18 +29,18 @@ namespace Managing.Application.Abstractions bool DeleteScenarios(); bool UpdateScenario(string name, List strategies, int? loopbackPeriod); - bool UpdateStrategy(StrategyType strategyType, string name, int? period, int? fastPeriods, int? slowPeriods, + bool UpdateStrategy(IndicatorType indicatorType, string name, int? period, int? fastPeriods, int? slowPeriods, int? signalPeriods, double? multiplier, int? stochPeriods, int? smoothPeriods, int? cyclePeriods); IEnumerable GetScenariosByUser(User user); Scenario CreateScenarioForUser(User user, string name, List strategies, int? loopbackPeriod = 1); - IEnumerable GetStrategiesByUser(User user); - bool DeleteStrategyByUser(User user, string name); + IEnumerable GetIndicatorsByUser(User user); + bool DeleteIndicatorByUser(User user, string name); bool DeleteScenarioByUser(User user, string name); Scenario GetScenarioByUser(User user, string name); - - Strategy CreateStrategyForUser(User user, - StrategyType type, + + Indicator CreateIndicatorForUser(User user, + IndicatorType type, string name, int? period = null, int? fastPeriods = null, @@ -50,12 +50,13 @@ namespace Managing.Application.Abstractions int? stochPeriods = null, int? smoothPeriods = null, int? cyclePeriods = null); - + bool DeleteStrategiesByUser(User user); bool DeleteScenariosByUser(User user); bool UpdateScenarioByUser(User user, string name, List strategies, int? loopbackPeriod); - - bool UpdateStrategyByUser(User user, StrategyType strategyType, string name, int? period, int? fastPeriods, - int? slowPeriods, int? signalPeriods, double? multiplier, int? stochPeriods, int? smoothPeriods, int? cyclePeriods); + + bool UpdateIndicatorByUser(User user, IndicatorType indicatorType, string name, int? period, int? fastPeriods, + int? slowPeriods, int? signalPeriods, double? multiplier, int? stochPeriods, int? smoothPeriods, + int? cyclePeriods); } } \ No newline at end of file diff --git a/src/Managing.Application/Abstractions/ITradingBot.cs b/src/Managing.Application/Abstractions/ITradingBot.cs index 55866c5..a8aad6b 100644 --- a/src/Managing.Application/Abstractions/ITradingBot.cs +++ b/src/Managing.Application/Abstractions/ITradingBot.cs @@ -14,13 +14,13 @@ namespace Managing.Application.Abstractions { TradingBotConfig Config { get; set; } Account Account { get; set; } - HashSet Strategies { get; set; } + HashSet Indicators { get; set; } FixedSizeQueue OptimizedCandles { get; set; } HashSet Candles { get; set; } HashSet Signals { get; set; } List Positions { get; set; } Dictionary WalletBalances { get; set; } - Dictionary StrategiesValues { get; set; } + Dictionary IndicatorsValues { get; set; } DateTime StartupTime { get; set; } DateTime PreloadSince { get; set; } int PreloadedCandlesCount { get; set; } @@ -32,10 +32,10 @@ namespace Managing.Application.Abstractions int GetWinRate(); decimal GetProfitAndLoss(); decimal GetTotalFees(); - void LoadStrategies(IEnumerable strategies); + void LoadIndicators(IEnumerable indicators); void LoadScenario(string scenarioName); void LoadScenario(Scenario scenario); - void UpdateStrategiesValues(); + void UpdateIndicatorsValues(); Task LoadAccount(); Task OpenPositionManually(TradeDirection direction); diff --git a/src/Managing.Application/Backtesting/Backtester.cs b/src/Managing.Application/Backtesting/Backtester.cs index fce36be..e2d9ff1 100644 --- a/src/Managing.Application/Backtesting/Backtester.cs +++ b/src/Managing.Application/Backtesting/Backtester.cs @@ -30,7 +30,7 @@ namespace Managing.Application.Backtesting IExchangeService exchangeService, IBotFactory botFactory, IBacktestRepository backtestRepository, - ILogger logger, + ILogger logger, IScenarioService scenarioService, IAccountService accountService) { @@ -74,9 +74,9 @@ namespace Managing.Application.Backtesting { var account = await GetAccountFromConfig(config); var candles = GetCandles(account, config.Ticker, config.Timeframe, startDate, endDate); - + var result = await RunBacktestWithCandles(config, candles, user); - + // Set start and end dates result.StartDate = startDate; result.EndDate = endDate; @@ -115,9 +115,9 @@ namespace Managing.Application.Backtesting { // Set FlipPosition based on BotType config.FlipPosition = config.BotType == BotType.FlippingBot; - + var tradingBot = _botFactory.CreateBacktestTradingBot(config); - + // Load scenario - prefer Scenario object over ScenarioName if (config.Scenario != null) { @@ -129,9 +129,10 @@ namespace Managing.Application.Backtesting } else { - throw new ArgumentException("Either Scenario object or ScenarioName must be provided in TradingBotConfig"); + throw new ArgumentException( + "Either Scenario object or ScenarioName must be provided in TradingBotConfig"); } - + tradingBot.User = user; await tradingBot.LoadAccount(); @@ -153,9 +154,9 @@ namespace Managing.Application.Backtesting return account; } - return new Account - { - Name = config.AccountName, + return new Account + { + Name = config.AccountName, Exchange = TradingExchanges.GmxV2 }; } @@ -191,7 +192,7 @@ namespace Managing.Application.Backtesting } bot.Candles = new HashSet(candles); - bot.UpdateStrategiesValues(); + bot.UpdateIndicatorsValues(); var strategies = _scenarioService.GetStrategies(); var strategiesValues = GetStrategiesValues(strategies, candles); @@ -228,21 +229,21 @@ namespace Managing.Application.Backtesting WalletBalances = bot.WalletBalances.ToList(), Statistics = stats, OptimizedMoneyManagement = optimizedMoneyManagement, - StrategiesValues = AggregateValues(strategiesValues, bot.StrategiesValues), + StrategiesValues = AggregateValues(strategiesValues, bot.IndicatorsValues), Score = score }; return result; } - private Dictionary AggregateValues( - Dictionary strategiesValues, - Dictionary botStrategiesValues) + private Dictionary AggregateValues( + Dictionary strategiesValues, + Dictionary botStrategiesValues) { // Foreach strategy type, only retrieve the values where the strategy is not present already in the bot // Then, add the values to the bot values - var result = new Dictionary(); + var result = new Dictionary(); foreach (var strategy in strategiesValues) { // if (!botStrategiesValues.ContainsKey(strategy.Key)) @@ -259,10 +260,10 @@ namespace Managing.Application.Backtesting return result; } - private Dictionary GetStrategiesValues(IEnumerable strategies, + private Dictionary GetStrategiesValues(IEnumerable strategies, List candles) { - var strategiesValues = new Dictionary(); + var strategiesValues = new Dictionary(); var fixedCandles = new FixedSizeQueue(10000); foreach (var candle in candles) { @@ -273,7 +274,7 @@ namespace Managing.Application.Backtesting { try { - var s = ScenarioHelpers.BuildStrategy(strategy, 10000); + var s = ScenarioHelpers.BuildIndicator(strategy, 10000); s.Candles = fixedCandles; strategiesValues[strategy.Type] = s.GetStrategyValues(); } diff --git a/src/Managing.Application/Bots/TradingBot.cs b/src/Managing.Application/Bots/TradingBot.cs index 9d32198..5d91d22 100644 --- a/src/Managing.Application/Bots/TradingBot.cs +++ b/src/Managing.Application/Bots/TradingBot.cs @@ -30,13 +30,13 @@ public class TradingBot : Bot, ITradingBot public TradingBotConfig Config { get; set; } public Account Account { get; set; } - public HashSet Strategies { get; set; } + public HashSet Indicators { get; set; } public FixedSizeQueue OptimizedCandles { get; set; } public HashSet Candles { get; set; } public HashSet Signals { get; set; } public List Positions { get; set; } public Dictionary WalletBalances { get; set; } - public Dictionary StrategiesValues { get; set; } + public Dictionary IndicatorsValues { get; set; } public DateTime StartupTime { get; set; } public DateTime PreloadSince { get; set; } public int PreloadedCandlesCount { get; set; } @@ -71,13 +71,13 @@ public class TradingBot : Bot, ITradingBot Config = config; - Strategies = new HashSet(); + Indicators = new HashSet(); Signals = new HashSet(); OptimizedCandles = new FixedSizeQueue(600); Candles = new HashSet(); Positions = new List(); WalletBalances = new Dictionary(); - StrategiesValues = new Dictionary(); + IndicatorsValues = new Dictionary(); if (!Config.IsForBacktest) { @@ -141,7 +141,7 @@ public class TradingBot : Bot, ITradingBot else { Scenario = scenario; - LoadStrategies(ScenarioHelpers.GetStrategiesFromScenario(scenario)); + LoadIndicators(ScenarioHelpers.GetIndicatorsFromScenario(scenario)); } } @@ -155,15 +155,15 @@ public class TradingBot : Bot, ITradingBot else { Scenario = scenario; - LoadStrategies(ScenarioHelpers.GetStrategiesFromScenario(scenario)); + LoadIndicators(ScenarioHelpers.GetIndicatorsFromScenario(scenario)); } } - public void LoadStrategies(IEnumerable strategies) + public void LoadIndicators(IEnumerable indicators) { - foreach (var strategy in strategies) + foreach (var strategy in indicators) { - Strategies.Add(strategy); + Indicators.Add(strategy); } } @@ -205,7 +205,7 @@ public class TradingBot : Bot, ITradingBot if (!Config.IsForBacktest) { SaveBackup(); - UpdateStrategiesValues(); + UpdateIndicatorsValues(); } UpdateWalletBalances(); @@ -219,11 +219,11 @@ public class TradingBot : Bot, ITradingBot } } - public void UpdateStrategiesValues() + public void UpdateIndicatorsValues() { - foreach (var strategy in Strategies) + foreach (var strategy in Indicators) { - StrategiesValues[strategy.Type] = ((Strategy)strategy).GetStrategyValues(); + IndicatorsValues[strategy.Type] = ((Indicator)strategy).GetStrategyValues(); } } @@ -260,7 +260,7 @@ public class TradingBot : Bot, ITradingBot private async Task UpdateSignals(FixedSizeQueue candles) { - var signal = TradingBox.GetSignal(candles.ToHashSet(), Strategies, Signals, Scenario.LoopbackPeriod); + var signal = TradingBox.GetSignal(candles.ToHashSet(), Indicators, Signals, Scenario.LoopbackPeriod); if (signal == null) return; signal.User = Account.User; @@ -325,7 +325,7 @@ public class TradingBot : Bot, ITradingBot candle: positionCandle, date: position.Open.Date, exchange: Account.Exchange, - strategyType: StrategyType.Stc, // Use a valid strategy type for recreated signals + indicatorType: IndicatorType.Stc, // Use a valid strategy type for recreated signals signalType: SignalType.Signal ); @@ -1311,7 +1311,7 @@ public class TradingBot : Bot, ITradingBot // Create a fake signal for manual position opening var signal = new Signal(Config.Ticker, direction, Confidence.Low, lastCandle, lastCandle.Date, TradingExchanges.GmxV2, - StrategyType.Stc, SignalType.Signal); + IndicatorType.Stc, SignalType.Signal); signal.Status = SignalStatus.WaitingForPosition; // Ensure status is correct signal.User = Account.User; // Assign user diff --git a/src/Managing.Application/Scenarios/ScenarioService.cs b/src/Managing.Application/Scenarios/ScenarioService.cs index ffdcdd1..45c2ed6 100644 --- a/src/Managing.Application/Scenarios/ScenarioService.cs +++ b/src/Managing.Application/Scenarios/ScenarioService.cs @@ -2,11 +2,10 @@ using Managing.Application.Abstractions.Services; using Managing.Domain.Scenarios; using Managing.Domain.Strategies; +using Managing.Domain.Users; using Microsoft.Extensions.Logging; using MongoDB.Driver; using static Managing.Common.Enums; -using System.Collections.Generic; -using Managing.Domain.Users; namespace Managing.Application.Scenarios { @@ -27,7 +26,7 @@ namespace Managing.Application.Scenarios foreach (var strategy in strategies) { - scenario.AddStrategy(_tradingService.GetStrategyByName(strategy)); + scenario.AddIndicator(_tradingService.GetStrategyByName(strategy)); } try @@ -43,8 +42,8 @@ namespace Managing.Application.Scenarios return scenario; } - public Strategy CreateStrategy( - StrategyType type, + public Indicator CreateStrategy( + IndicatorType type, string name, int? period = null, int? fastPeriods = null, @@ -55,7 +54,7 @@ namespace Managing.Application.Scenarios int? smoothPeriods = null, int? cyclePeriods = null) { - var strategy = ScenarioHelpers.BuildStrategy( + var strategy = ScenarioHelpers.BuildIndicator( type, name, period, @@ -80,7 +79,7 @@ namespace Managing.Application.Scenarios return _tradingService.GetScenarioByName(name); } - public IEnumerable GetStrategies() + public IEnumerable GetStrategies() { return _tradingService.GetStrategies(); } @@ -146,10 +145,10 @@ namespace Managing.Application.Scenarios try { var scenario = _tradingService.GetScenarioByName(name); - scenario.Strategies.Clear(); + scenario.Indicators.Clear(); foreach (var strategy in strategies) { - scenario.AddStrategy(_tradingService.GetStrategyByName(strategy)); + scenario.AddIndicator(_tradingService.GetStrategyByName(strategy)); } scenario.LoopbackPeriod = loopbackPeriod ?? 1; @@ -163,14 +162,14 @@ namespace Managing.Application.Scenarios } } - public bool UpdateStrategy(StrategyType strategyType, string name, int? period, int? fastPeriods, + public bool UpdateStrategy(IndicatorType indicatorType, string name, int? period, int? fastPeriods, int? slowPeriods, int? signalPeriods, double? multiplier, int? stochPeriods, int? smoothPeriods, int? cyclePeriods) { try { var strategy = _tradingService.GetStrategyByName(name); - strategy.Type = strategyType; + strategy.Type = indicatorType; strategy.Period = period; strategy.FastPeriods = fastPeriods; strategy.SlowPeriods = slowPeriods; @@ -203,13 +202,13 @@ namespace Managing.Application.Scenarios { User = user }; - + foreach (var strategyName in strategies) { var strategy = _tradingService.GetStrategyByName(strategyName); if (strategy != null && strategy.User?.Name == user.Name) { - scenario.AddStrategy(strategy); + scenario.AddIndicator(strategy); } } @@ -217,13 +216,13 @@ namespace Managing.Application.Scenarios return scenario; } - public IEnumerable GetStrategiesByUser(User user) + public IEnumerable GetIndicatorsByUser(User user) { var strategies = _tradingService.GetStrategies(); return strategies.Where(s => s.User?.Name == user.Name); } - public bool DeleteStrategyByUser(User user, string name) + public bool DeleteIndicatorByUser(User user, string name) { var strategy = _tradingService.GetStrategyByName(name); if (strategy != null && strategy.User?.Name == user.Name) @@ -231,6 +230,7 @@ namespace Managing.Application.Scenarios _tradingService.DeleteStrategy(strategy.Name); return true; } + return false; } @@ -242,6 +242,7 @@ namespace Managing.Application.Scenarios _tradingService.DeleteScenario(scenario.Name); return true; } + return false; } @@ -251,35 +252,35 @@ namespace Managing.Application.Scenarios return scenario != null && scenario.User?.Name == user.Name ? scenario : null; } - public Strategy CreateStrategyForUser(User user, StrategyType type, string name, int? period = null, - int? fastPeriods = null, int? slowPeriods = null, int? signalPeriods = null, - double? multiplier = null, int? stochPeriods = null, int? smoothPeriods = null, + public Indicator CreateIndicatorForUser(User user, IndicatorType type, string name, int? period = null, + int? fastPeriods = null, int? slowPeriods = null, int? signalPeriods = null, + double? multiplier = null, int? stochPeriods = null, int? smoothPeriods = null, int? cyclePeriods = null) { // Create a new strategy using the existing implementation - var strategy = CreateStrategy(type, name, period, fastPeriods, slowPeriods, signalPeriods, + var strategy = CreateStrategy(type, name, period, fastPeriods, slowPeriods, signalPeriods, multiplier, stochPeriods, smoothPeriods, cyclePeriods); - + // Set the user strategy.User = user; - + // Update the strategy to save the user property _tradingService.UpdateStrategy(strategy); - + return strategy; } public bool DeleteStrategiesByUser(User user) { - try + try { - var strategies = GetStrategiesByUser(user); - + var strategies = GetIndicatorsByUser(user); + foreach (var strategy in strategies) { _tradingService.DeleteStrategy(strategy.Name); } - + return true; } catch (Exception ex) @@ -294,12 +295,12 @@ namespace Managing.Application.Scenarios try { var scenarios = GetScenariosByUser(user); - + foreach (var scenario in scenarios) { _tradingService.DeleteScenario(scenario.Name); } - + return true; } catch (Exception ex) @@ -317,7 +318,7 @@ namespace Managing.Application.Scenarios return false; } - scenario.Strategies.Clear(); + scenario.Indicators.Clear(); scenario.LoopbackPeriod = loopbackPeriod ?? 1; foreach (var strategyName in strategies) @@ -325,7 +326,7 @@ namespace Managing.Application.Scenarios var strategy = _tradingService.GetStrategyByName(strategyName); if (strategy != null && strategy.User?.Name == user.Name) { - scenario.AddStrategy(strategy); + scenario.AddIndicator(strategy); } } @@ -333,8 +334,8 @@ namespace Managing.Application.Scenarios return true; } - public bool UpdateStrategyByUser(User user, StrategyType strategyType, string name, int? period, - int? fastPeriods, int? slowPeriods, int? signalPeriods, double? multiplier, + public bool UpdateIndicatorByUser(User user, IndicatorType indicatorType, string name, int? period, + int? fastPeriods, int? slowPeriods, int? signalPeriods, double? multiplier, int? stochPeriods, int? smoothPeriods, int? cyclePeriods) { var strategy = _tradingService.GetStrategyByName(name); @@ -344,9 +345,9 @@ namespace Managing.Application.Scenarios } // Use the existing update strategy logic - var result = UpdateStrategy(strategyType, name, period, fastPeriods, slowPeriods, + var result = UpdateStrategy(indicatorType, name, period, fastPeriods, slowPeriods, signalPeriods, multiplier, stochPeriods, smoothPeriods, cyclePeriods); - + return result; } } diff --git a/src/Managing.Application/Shared/SettingsService.cs b/src/Managing.Application/Shared/SettingsService.cs index d6a5ca0..881ba0a 100644 --- a/src/Managing.Application/Shared/SettingsService.cs +++ b/src/Managing.Application/Shared/SettingsService.cs @@ -101,7 +101,7 @@ public class SettingsService : ISettingsService private void SetupStochSTCTrend() { var name = "STCTrend"; - var strategy = _scenarioService.CreateStrategy(StrategyType.Stc, + var strategy = _scenarioService.CreateStrategy(IndicatorType.Stc, name, fastPeriods: 23, slowPeriods: 50, @@ -112,7 +112,7 @@ public class SettingsService : ISettingsService private void SetupMacd() { var name = "MacdCross"; - var strategy = _scenarioService.CreateStrategy(StrategyType.MacdCross, + var strategy = _scenarioService.CreateStrategy(IndicatorType.MacdCross, name, fastPeriods: 12, slowPeriods: 26, @@ -123,7 +123,7 @@ public class SettingsService : ISettingsService private void SetupRsiDiv() { var name = "RsiDiv6"; - var strategy = _scenarioService.CreateStrategy(StrategyType.RsiDivergence, + var strategy = _scenarioService.CreateStrategy(IndicatorType.RsiDivergence, name, period: 6); _scenarioService.CreateScenario(name, new List { strategy.Name }); @@ -132,7 +132,7 @@ public class SettingsService : ISettingsService private void SetupRsiDivConfirm() { var name = "RsiDivConfirm6"; - var strategy = _scenarioService.CreateStrategy(StrategyType.RsiDivergenceConfirm, + var strategy = _scenarioService.CreateStrategy(IndicatorType.RsiDivergenceConfirm, name, period: 6); _scenarioService.CreateScenario(name, new List { strategy.Name }); @@ -141,7 +141,7 @@ public class SettingsService : ISettingsService private void SetupSuperTrend() { var name = "SuperTrend"; - var strategy = _scenarioService.CreateStrategy(StrategyType.SuperTrend, + var strategy = _scenarioService.CreateStrategy(IndicatorType.SuperTrend, name, period: 10, multiplier: 3); @@ -151,7 +151,7 @@ public class SettingsService : ISettingsService private void SetupChandelierExit() { var name = "ChandelierExit"; - var strategy = _scenarioService.CreateStrategy(StrategyType.ChandelierExit, + var strategy = _scenarioService.CreateStrategy(IndicatorType.ChandelierExit, name, period: 22, multiplier: 3); @@ -161,7 +161,7 @@ public class SettingsService : ISettingsService private void SetupStochRsiTrend() { var name = "StochRsiTrend"; - var strategy = _scenarioService.CreateStrategy(StrategyType.StochRsiTrend, + var strategy = _scenarioService.CreateStrategy(IndicatorType.StochRsiTrend, name, period: 14, stochPeriods: 14, @@ -173,7 +173,7 @@ public class SettingsService : ISettingsService private void SetupEmaTrend() { var name = "Ema200Trend"; - var strategy = _scenarioService.CreateStrategy(StrategyType.EmaTrend, + var strategy = _scenarioService.CreateStrategy(IndicatorType.EmaTrend, name, period: 200); _scenarioService.CreateScenario(name, new List { strategy.Name }); @@ -182,7 +182,7 @@ public class SettingsService : ISettingsService private void SetupEmaCross() { var name = "Ema200Cross"; - var strategy = _scenarioService.CreateStrategy(StrategyType.EmaCross, + var strategy = _scenarioService.CreateStrategy(IndicatorType.EmaCross, name, period: 200); _scenarioService.CreateScenario(name, new List { strategy.Name }); @@ -212,9 +212,9 @@ public class SettingsService : ISettingsService await _moneyManagementService.CreateOrUpdateMoneyManagement(user, defaultMoneyManagement); // Create default Strategy (StcTrend) - var defaultStrategy = _scenarioService.CreateStrategyForUser( + var defaultStrategy = _scenarioService.CreateIndicatorForUser( user, - StrategyType.Stc, + IndicatorType.Stc, "Stc", period: null, fastPeriods: 23, diff --git a/src/Managing.Application/Trading/TradingService.cs b/src/Managing.Application/Trading/TradingService.cs index 4e8ebb1..0cba462 100644 --- a/src/Managing.Application/Trading/TradingService.cs +++ b/src/Managing.Application/Trading/TradingService.cs @@ -55,12 +55,12 @@ public class TradingService : ITradingService public void DeleteStrategies() { - _tradingRepository.DeleteStrategies(); + _tradingRepository.DeleteIndicators(); } public void DeleteStrategy(string name) { - _tradingRepository.DeleteStrategy(name); + _tradingRepository.DeleteIndicator(name); } public Position GetPositionByIdentifier(string identifier) @@ -89,12 +89,12 @@ public class TradingService : ITradingService return _tradingRepository.GetScenarios(); } - public IEnumerable GetStrategies() + public IEnumerable GetStrategies() { - return _tradingRepository.GetStrategies(); + return _tradingRepository.GetIndicators(); } - public Strategy GetStrategyByName(string strategy) + public Indicator GetStrategyByName(string strategy) { return _tradingRepository.GetStrategyByName(strategy); } @@ -114,9 +114,9 @@ public class TradingService : ITradingService _tradingRepository.InsertSignal(signal); } - public void InsertStrategy(Strategy strategy) + public void InsertStrategy(Indicator indicator) { - _tradingRepository.InsertStrategy(strategy); + _tradingRepository.InsertStrategy(indicator); } public async Task ManagePosition(Account account, Position position) @@ -276,9 +276,9 @@ public class TradingService : ITradingService _tradingRepository.UpdateScenario(scenario); } - public void UpdateStrategy(Strategy strategy) + public void UpdateStrategy(Indicator indicator) { - _tradingRepository.UpdateStrategy(strategy); + _tradingRepository.UpdateStrategy(indicator); } public async Task> GetBrokerPositions(Account account) @@ -385,7 +385,8 @@ public class TradingService : ITradingService if (string.IsNullOrEmpty(publicAddress)) { _logger.LogWarning("Attempted to initialize Privy wallet with null or empty public address"); - return new PrivyInitAddressResponse { Success = false, Error = "Public address cannot be null or empty" }; + return new PrivyInitAddressResponse + { Success = false, Error = "Public address cannot be null or empty" }; } return await _evmManager.InitAddress(publicAddress); diff --git a/src/Managing.Application/Workflows/Flows/Strategies/RsiDiv.cs b/src/Managing.Application/Workflows/Flows/Strategies/RsiDiv.cs index 596d7c4..662a1aa 100644 --- a/src/Managing.Application/Workflows/Flows/Strategies/RsiDiv.cs +++ b/src/Managing.Application/Workflows/Flows/Strategies/RsiDiv.cs @@ -30,7 +30,7 @@ public class RsiDiv : FlowBase MapParameters(); var candles = JsonConvert.DeserializeObject>(input); - var strategy = new RsiDivergenceStrategy(Name, RsiDivParameters.Period); + var strategy = new RsiDivergenceIndicator(Name, RsiDivParameters.Period); strategy.UpdateCandles(candles); strategy.Run(); diff --git a/src/Managing.Common/Enums.cs b/src/Managing.Common/Enums.cs index 86131f2..0e59b8a 100644 --- a/src/Managing.Common/Enums.cs +++ b/src/Managing.Common/Enums.cs @@ -48,7 +48,7 @@ public static class Enums FlippingBot } - public enum StrategyType + public enum IndicatorType { RsiDivergence, RsiDivergenceConfirm, diff --git a/src/Managing.Domain/Backtests/Backtest.cs b/src/Managing.Domain/Backtests/Backtest.cs index dce8755..f5233fc 100644 --- a/src/Managing.Domain/Backtests/Backtest.cs +++ b/src/Managing.Domain/Backtests/Backtest.cs @@ -24,7 +24,7 @@ public class Backtest Signals = signals; Candles = candles; WalletBalances = new List>(); - StrategiesValues = new Dictionary(); + StrategiesValues = new Dictionary(); // Initialize start and end dates if candles are provided if (candles != null && candles.Count > 0) @@ -55,7 +55,7 @@ public class Backtest [Required] public List> WalletBalances { get; set; } [Required] public MoneyManagement OptimizedMoneyManagement { get; set; } [Required] public User User { get; set; } - [Required] public Dictionary StrategiesValues { get; set; } + [Required] public Dictionary StrategiesValues { get; set; } [Required] public double Score { get; set; } /// @@ -130,12 +130,12 @@ public class Backtest public string GetStringReport() { - var timeBasedInfo = Config.MaxPositionTimeHours.HasValue - ? $" | MaxTime: {Config.MaxPositionTimeHours}h" + var timeBasedInfo = Config.MaxPositionTimeHours.HasValue + ? $" | MaxTime: {Config.MaxPositionTimeHours}h" : " | MaxTime: Disabled"; - - var flipInfo = Config.FlipPosition - ? $" | Flip: {(Config.FlipOnlyWhenInProfit ? "Profit-Only" : "Always")}" + + var flipInfo = Config.FlipPosition + ? $" | Flip: {(Config.FlipOnlyWhenInProfit ? "Profit-Only" : "Always")}" : ""; return diff --git a/src/Managing.Domain/Scenarios/Scenario.cs b/src/Managing.Domain/Scenarios/Scenario.cs index c272e90..d15b475 100644 --- a/src/Managing.Domain/Scenarios/Scenario.cs +++ b/src/Managing.Domain/Scenarios/Scenario.cs @@ -8,18 +8,18 @@ namespace Managing.Domain.Scenarios public Scenario(string name, int? loopbackPeriod = 1) { Name = name; - Strategies = new List(); + Indicators = new List(); LoopbackPeriod = loopbackPeriod; } public string Name { get; set; } - public List Strategies { get; set; } + public List Indicators { get; set; } public int? LoopbackPeriod { get; set; } public User User { get; set; } - public void AddStrategy(Strategy strategy) + public void AddIndicator(Indicator indicator) { - Strategies.Add(strategy); + Indicators.Add(indicator); } } } \ No newline at end of file diff --git a/src/Managing.Domain/Scenarios/ScenarioHelpers.cs b/src/Managing.Domain/Scenarios/ScenarioHelpers.cs index 4adeae7..5796079 100644 --- a/src/Managing.Domain/Scenarios/ScenarioHelpers.cs +++ b/src/Managing.Domain/Scenarios/ScenarioHelpers.cs @@ -10,48 +10,48 @@ namespace Managing.Domain.Scenarios; public static class ScenarioHelpers { - public static IEnumerable GetStrategiesFromScenario(Scenario scenario) + public static IEnumerable GetIndicatorsFromScenario(Scenario scenario) { - var strategies = new List(); - foreach (var strategy in scenario.Strategies) + var strategies = new List(); + foreach (var strategy in scenario.Indicators) { - var result = BuildStrategy(strategy); + var result = BuildIndicator(strategy); strategies.Add(result); } return strategies; } - public static IStrategy BuildStrategy(Strategy strategy, int size = 600) + public static IIndicator BuildIndicator(Indicator indicator, int size = 600) { - IStrategy result = strategy.Type switch + IIndicator result = indicator.Type switch { - StrategyType.StDev => new StDevContext(strategy.Name, strategy.Period.Value), - StrategyType.RsiDivergence => new RsiDivergenceStrategy(strategy.Name, - strategy.Period.Value), - StrategyType.RsiDivergenceConfirm => new RsiDivergenceConfirmStrategy(strategy.Name, - strategy.Period.Value), - StrategyType.MacdCross => new MacdCrossStrategy(strategy.Name, - strategy.FastPeriods.Value, strategy.SlowPeriods.Value, strategy.SignalPeriods.Value), - StrategyType.EmaCross => new EmaCrossStrategy(strategy.Name, strategy.Period.Value), - StrategyType.DualEmaCross => new DualEmaCrossStrategy(strategy.Name, - strategy.FastPeriods.Value, strategy.SlowPeriods.Value), - StrategyType.ThreeWhiteSoldiers => new ThreeWhiteSoldiersStrategy(strategy.Name, - strategy.Period.Value), - StrategyType.SuperTrend => new SuperTrendStrategy(strategy.Name, - strategy.Period.Value, strategy.Multiplier.Value), - StrategyType.ChandelierExit => new ChandelierExitStrategy(strategy.Name, - strategy.Period.Value, strategy.Multiplier.Value), - StrategyType.EmaTrend => new EmaTrendStrategy(strategy.Name, strategy.Period.Value), - StrategyType.StochRsiTrend => new StochRsiTrendStrategy(strategy.Name, - strategy.Period.Value, strategy.StochPeriods.Value, strategy.SignalPeriods.Value, - strategy.SmoothPeriods.Value), - StrategyType.Stc => new StcStrategy(strategy.Name, strategy.CyclePeriods.Value, - strategy.FastPeriods.Value, strategy.SlowPeriods.Value), - StrategyType.LaggingStc => new LaggingSTC(strategy.Name, strategy.CyclePeriods.Value, - strategy.FastPeriods.Value, strategy.SlowPeriods.Value), - StrategyType.SuperTrendCrossEma => new SuperTrendCrossEma(strategy.Name, - strategy.Period.Value, strategy.Multiplier.Value), + IndicatorType.StDev => new StDevContext(indicator.Name, indicator.Period.Value), + IndicatorType.RsiDivergence => new RsiDivergenceIndicator(indicator.Name, + indicator.Period.Value), + IndicatorType.RsiDivergenceConfirm => new RsiDivergenceConfirmIndicator(indicator.Name, + indicator.Period.Value), + IndicatorType.MacdCross => new MacdCrossIndicator(indicator.Name, + indicator.FastPeriods.Value, indicator.SlowPeriods.Value, indicator.SignalPeriods.Value), + IndicatorType.EmaCross => new EmaCrossIndicator(indicator.Name, indicator.Period.Value), + IndicatorType.DualEmaCross => new DualEmaCrossIndicator(indicator.Name, + indicator.FastPeriods.Value, indicator.SlowPeriods.Value), + IndicatorType.ThreeWhiteSoldiers => new ThreeWhiteSoldiersIndicator(indicator.Name, + indicator.Period.Value), + IndicatorType.SuperTrend => new SuperTrendIndicator(indicator.Name, + indicator.Period.Value, indicator.Multiplier.Value), + IndicatorType.ChandelierExit => new ChandelierExitIndicator(indicator.Name, + indicator.Period.Value, indicator.Multiplier.Value), + IndicatorType.EmaTrend => new EmaTrendIndicator(indicator.Name, indicator.Period.Value), + IndicatorType.StochRsiTrend => new StochRsiTrendIndicator(indicator.Name, + indicator.Period.Value, indicator.StochPeriods.Value, indicator.SignalPeriods.Value, + indicator.SmoothPeriods.Value), + IndicatorType.Stc => new StcIndicator(indicator.Name, indicator.CyclePeriods.Value, + indicator.FastPeriods.Value, indicator.SlowPeriods.Value), + IndicatorType.LaggingStc => new LaggingSTC(indicator.Name, indicator.CyclePeriods.Value, + indicator.FastPeriods.Value, indicator.SlowPeriods.Value), + IndicatorType.SuperTrendCrossEma => new SuperTrendCrossEma(indicator.Name, + indicator.Period.Value, indicator.Multiplier.Value), _ => throw new NotImplementedException(), }; @@ -59,8 +59,8 @@ public static class ScenarioHelpers return result; } - public static Strategy BuildStrategy( - StrategyType type, + public static Indicator BuildIndicator( + IndicatorType type, string name, int? period = null, int? fastPeriods = null, @@ -71,98 +71,98 @@ public static class ScenarioHelpers int? smoothPeriods = null, int? cyclePeriods = null) { - var strategy = new Strategy(name, type); + var indicator = new Indicator(name, type); switch (type) { - case StrategyType.RsiDivergence: - case StrategyType.RsiDivergenceConfirm: - case StrategyType.EmaTrend: - case StrategyType.EmaCross: - case StrategyType.StDev: + case IndicatorType.RsiDivergence: + case IndicatorType.RsiDivergenceConfirm: + case IndicatorType.EmaTrend: + case IndicatorType.EmaCross: + case IndicatorType.StDev: if (!period.HasValue) { - throw new Exception($"Missing period for {strategy.Type} strategy type"); + throw new Exception($"Missing period for {indicator.Type} strategy type"); } else { - strategy.Period = period.Value; + indicator.Period = period.Value; } break; - case StrategyType.MacdCross: + case IndicatorType.MacdCross: if (!fastPeriods.HasValue || !slowPeriods.HasValue || !signalPeriods.HasValue) { throw new Exception( - $"Missing fastPeriods or slowPeriods or signalPeriods, for {strategy.Type} strategy type"); + $"Missing fastPeriods or slowPeriods or signalPeriods, for {indicator.Type} strategy type"); } else { - strategy.FastPeriods = fastPeriods; - strategy.SlowPeriods = slowPeriods; - strategy.SignalPeriods = signalPeriods; + indicator.FastPeriods = fastPeriods; + indicator.SlowPeriods = slowPeriods; + indicator.SignalPeriods = signalPeriods; } break; - case StrategyType.DualEmaCross: + case IndicatorType.DualEmaCross: if (!fastPeriods.HasValue || !slowPeriods.HasValue) { throw new Exception( - $"Missing fastPeriods or slowPeriods for {strategy.Type} strategy type"); + $"Missing fastPeriods or slowPeriods for {indicator.Type} strategy type"); } else { - strategy.FastPeriods = fastPeriods; - strategy.SlowPeriods = slowPeriods; + indicator.FastPeriods = fastPeriods; + indicator.SlowPeriods = slowPeriods; } break; - case StrategyType.ThreeWhiteSoldiers: + case IndicatorType.ThreeWhiteSoldiers: break; - case StrategyType.SuperTrend: - case StrategyType.SuperTrendCrossEma: - case StrategyType.ChandelierExit: + case IndicatorType.SuperTrend: + case IndicatorType.SuperTrendCrossEma: + case IndicatorType.ChandelierExit: if (!period.HasValue || !multiplier.HasValue) { - throw new Exception($"Missing period or multiplier, for {strategy.Type} strategy type"); + throw new Exception($"Missing period or multiplier, for {indicator.Type} strategy type"); } else { - strategy.Period = period; - strategy.Multiplier = multiplier; + indicator.Period = period; + indicator.Multiplier = multiplier; } break; - case StrategyType.StochRsiTrend: + case IndicatorType.StochRsiTrend: if (!period.HasValue || !stochPeriods.HasValue || !signalPeriods.HasValue || !smoothPeriods.HasValue) { throw new Exception( - $"Missing period, stochPeriods, signalPeriods, smoothPeriods for {strategy.Type} strategy type"); + $"Missing period, stochPeriods, signalPeriods, smoothPeriods for {indicator.Type} strategy type"); } else { - strategy.Period = period; - strategy.StochPeriods = stochPeriods; - strategy.SignalPeriods = signalPeriods; - strategy.SmoothPeriods = smoothPeriods; + indicator.Period = period; + indicator.StochPeriods = stochPeriods; + indicator.SignalPeriods = signalPeriods; + indicator.SmoothPeriods = smoothPeriods; } break; - case StrategyType.Stc: - case StrategyType.LaggingStc: + case IndicatorType.Stc: + case IndicatorType.LaggingStc: if (!fastPeriods.HasValue || !slowPeriods.HasValue || !cyclePeriods.HasValue) { throw new Exception( - $"Missing fastPeriods or slowPeriods or cyclePeriods, for {strategy.Type} strategy type"); + $"Missing fastPeriods or slowPeriods or cyclePeriods, for {indicator.Type} strategy type"); } else { - strategy.FastPeriods = fastPeriods; - strategy.SlowPeriods = slowPeriods; - strategy.CyclePeriods = cyclePeriods; + indicator.FastPeriods = fastPeriods; + indicator.SlowPeriods = slowPeriods; + indicator.CyclePeriods = cyclePeriods; } break; @@ -170,28 +170,28 @@ public static class ScenarioHelpers break; } - return strategy; + return indicator; } - public static SignalType GetSignalType(StrategyType type) + public static SignalType GetSignalType(IndicatorType type) { return type switch { - StrategyType.RsiDivergence => SignalType.Signal, - StrategyType.RsiDivergenceConfirm => SignalType.Signal, - StrategyType.MacdCross => SignalType.Signal, - StrategyType.EmaCross => SignalType.Signal, - StrategyType.DualEmaCross => SignalType.Signal, - StrategyType.ThreeWhiteSoldiers => SignalType.Signal, - StrategyType.SuperTrend => SignalType.Signal, - StrategyType.ChandelierExit => SignalType.Signal, - StrategyType.EmaTrend => SignalType.Trend, - StrategyType.Composite => SignalType.Signal, - StrategyType.StochRsiTrend => SignalType.Trend, - StrategyType.Stc => SignalType.Signal, - StrategyType.StDev => SignalType.Context, - StrategyType.LaggingStc => SignalType.Signal, - StrategyType.SuperTrendCrossEma => SignalType.Signal, + IndicatorType.RsiDivergence => SignalType.Signal, + IndicatorType.RsiDivergenceConfirm => SignalType.Signal, + IndicatorType.MacdCross => SignalType.Signal, + IndicatorType.EmaCross => SignalType.Signal, + IndicatorType.DualEmaCross => SignalType.Signal, + IndicatorType.ThreeWhiteSoldiers => SignalType.Signal, + IndicatorType.SuperTrend => SignalType.Signal, + IndicatorType.ChandelierExit => SignalType.Signal, + IndicatorType.EmaTrend => SignalType.Trend, + IndicatorType.Composite => SignalType.Signal, + IndicatorType.StochRsiTrend => SignalType.Trend, + IndicatorType.Stc => SignalType.Signal, + IndicatorType.StDev => SignalType.Context, + IndicatorType.LaggingStc => SignalType.Signal, + IndicatorType.SuperTrendCrossEma => SignalType.Signal, _ => throw new NotImplementedException(), }; } diff --git a/src/Managing.Domain/Shared/Helpers/TradingBox.cs b/src/Managing.Domain/Shared/Helpers/TradingBox.cs index f179d2e..6f1b721 100644 --- a/src/Managing.Domain/Shared/Helpers/TradingBox.cs +++ b/src/Managing.Domain/Shared/Helpers/TradingBox.cs @@ -10,7 +10,7 @@ namespace Managing.Domain.Shared.Helpers; /// /// Configuration for strategy combination logic /// -public class StrategyComboConfig +public class IndicatorComboConfig { /// /// Minimum percentage of trend strategies that must agree for strong trend (default: 66%) @@ -47,16 +47,16 @@ public class StrategyComboConfig public static class TradingBox { - private static readonly StrategyComboConfig _defaultConfig = new(); + private static readonly IndicatorComboConfig _defaultConfig = new(); - public static Signal GetSignal(HashSet newCandles, HashSet strategies, + public static Signal GetSignal(HashSet newCandles, HashSet strategies, HashSet previousSignal, int? loopbackPeriod = 1) { return GetSignal(newCandles, strategies, previousSignal, _defaultConfig, loopbackPeriod); } - public static Signal GetSignal(HashSet newCandles, HashSet strategies, - HashSet previousSignal, StrategyComboConfig config, int? loopbackPeriod = 1) + public static Signal GetSignal(HashSet newCandles, HashSet strategies, + HashSet previousSignal, IndicatorComboConfig config, int? loopbackPeriod = 1) { var signalOnCandles = new HashSet(); var limitedCandles = newCandles.ToList().TakeLast(600).ToList(); @@ -120,14 +120,14 @@ public static class TradingBox data.Timeframe, config); } - public static Signal ComputeSignals(HashSet strategies, HashSet signalOnCandles, Ticker ticker, + public static Signal ComputeSignals(HashSet strategies, HashSet signalOnCandles, Ticker ticker, Timeframe timeframe) { return ComputeSignals(strategies, signalOnCandles, ticker, timeframe, _defaultConfig); } - public static Signal ComputeSignals(HashSet strategies, HashSet signalOnCandles, Ticker ticker, - Timeframe timeframe, StrategyComboConfig config) + public static Signal ComputeSignals(HashSet strategies, HashSet signalOnCandles, Ticker ticker, + Timeframe timeframe, IndicatorComboConfig config) { if (strategies.Count == 1) { @@ -179,15 +179,15 @@ public static class TradingBox lastSignal?.Candle, lastSignal?.Date ?? DateTime.UtcNow, lastSignal?.Exchange ?? config.DefaultExchange, - StrategyType.Composite, + IndicatorType.Composite, SignalType.Signal); } /// /// Validates context strategies based on confidence levels indicating market condition quality /// - private static bool ValidateContextStrategies(HashSet allStrategies, List contextSignals, - StrategyComboConfig config) + private static bool ValidateContextStrategies(HashSet allStrategies, List contextSignals, + IndicatorComboConfig config) { var contextStrategiesCount = allStrategies.Count(s => s.SignalType == SignalType.Context); @@ -210,7 +210,7 @@ public static class TradingBox /// /// Evaluates trend direction using majority voting with neutral handling /// - private static TradeDirection EvaluateTrendDirection(List trendSignals, StrategyComboConfig config) + private static TradeDirection EvaluateTrendDirection(List trendSignals, IndicatorComboConfig config) { if (!trendSignals.Any()) { @@ -241,7 +241,7 @@ public static class TradingBox /// /// Evaluates signal direction using weighted majority voting /// - private static TradeDirection EvaluateSignalDirection(List signalStrategies, StrategyComboConfig config) + private static TradeDirection EvaluateSignalDirection(List signalStrategies, IndicatorComboConfig config) { if (!signalStrategies.Any()) { @@ -270,7 +270,7 @@ public static class TradingBox TradeDirection trendDirection, List signalStrategies, List trendStrategies, - StrategyComboConfig config) + IndicatorComboConfig config) { // Priority 1: If we have signal strategies, they take precedence if (signalDirection != TradeDirection.None) diff --git a/src/Managing.Domain/Strategies/Base/EmaBaseStrategy.cs b/src/Managing.Domain/Strategies/Base/EmaBaseIndicator.cs similarity index 87% rename from src/Managing.Domain/Strategies/Base/EmaBaseStrategy.cs rename to src/Managing.Domain/Strategies/Base/EmaBaseIndicator.cs index 25fae6f..db0d209 100644 --- a/src/Managing.Domain/Strategies/Base/EmaBaseStrategy.cs +++ b/src/Managing.Domain/Strategies/Base/EmaBaseIndicator.cs @@ -4,9 +4,9 @@ using Skender.Stock.Indicators; namespace Managing.Domain.Strategies.Base; -public abstract class EmaBaseStrategy : Strategy +public abstract class EmaBaseIndicator : Indicator { - protected EmaBaseStrategy(string name, Enums.StrategyType type) : base(name, type) + protected EmaBaseIndicator(string name, Enums.IndicatorType type) : base(name, type) { } diff --git a/src/Managing.Domain/Strategies/Base/StrategiesResultBase.cs b/src/Managing.Domain/Strategies/Base/IndicatorsResultBase.cs similarity index 95% rename from src/Managing.Domain/Strategies/Base/StrategiesResultBase.cs rename to src/Managing.Domain/Strategies/Base/IndicatorsResultBase.cs index 3a6b748..6d7011f 100644 --- a/src/Managing.Domain/Strategies/Base/StrategiesResultBase.cs +++ b/src/Managing.Domain/Strategies/Base/IndicatorsResultBase.cs @@ -2,7 +2,7 @@ using Skender.Stock.Indicators; namespace Managing.Domain.Strategies.Base; -public class StrategiesResultBase +public class IndicatorsResultBase { public List Ema { get; set; } public List FastEma { get; set; } diff --git a/src/Managing.Domain/Strategies/Context/StDevContext.cs b/src/Managing.Domain/Strategies/Context/StDevContext.cs index 93cbfa2..c3c2f08 100644 --- a/src/Managing.Domain/Strategies/Context/StDevContext.cs +++ b/src/Managing.Domain/Strategies/Context/StDevContext.cs @@ -7,11 +7,11 @@ using static Managing.Common.Enums; namespace Managing.Domain.Strategies.Context; -public class StDevContext : Strategy +public class StDevContext : Indicator { public List Signals { get; set; } - public StDevContext(string name, int period) : base(name, StrategyType.StDev) + public StDevContext(string name, int period) : base(name, IndicatorType.StDev) { Signals = new List(); Period = period; @@ -73,9 +73,9 @@ public class StDevContext : Strategy } } - public override StrategiesResultBase GetStrategyValues() + public override IndicatorsResultBase GetStrategyValues() { - var test = new StrategiesResultBase() + var test = new IndicatorsResultBase() { StdDev = Candles.GetStdDev(Period.Value).ToList() }; diff --git a/src/Managing.Domain/Strategies/IStrategy.cs b/src/Managing.Domain/Strategies/IIndicator.cs similarity index 82% rename from src/Managing.Domain/Strategies/IStrategy.cs rename to src/Managing.Domain/Strategies/IIndicator.cs index 4440c40..0ee4e74 100644 --- a/src/Managing.Domain/Strategies/IStrategy.cs +++ b/src/Managing.Domain/Strategies/IIndicator.cs @@ -5,10 +5,10 @@ using static Managing.Common.Enums; namespace Managing.Domain.Strategies { - public interface IStrategy + public interface IIndicator { string Name { get; set; } - StrategyType Type { get; set; } + IndicatorType Type { get; set; } SignalType SignalType { get; set; } int? Period { get; set; } int? FastPeriods { get; set; } @@ -17,7 +17,7 @@ namespace Managing.Domain.Strategies FixedSizeQueue Candles { get; set; } List Run(); - StrategiesResultBase GetStrategyValues(); + IndicatorsResultBase GetStrategyValues(); void UpdateCandles(HashSet newCandles); string GetName(); } diff --git a/src/Managing.Domain/Strategies/Strategy.cs b/src/Managing.Domain/Strategies/Indicator.cs similarity index 87% rename from src/Managing.Domain/Strategies/Strategy.cs rename to src/Managing.Domain/Strategies/Indicator.cs index f5d37c8..890b6dc 100644 --- a/src/Managing.Domain/Strategies/Strategy.cs +++ b/src/Managing.Domain/Strategies/Indicator.cs @@ -8,9 +8,9 @@ using static Managing.Common.Enums; namespace Managing.Domain.Strategies { - public class Strategy : IStrategy + public class Indicator : IIndicator { - public Strategy(string name, StrategyType type) + public Indicator(string name, IndicatorType type) { Name = name; Type = type; @@ -20,7 +20,7 @@ namespace Managing.Domain.Strategies public string Name { get; set; } [JsonIgnore] public FixedSizeQueue Candles { get; set; } - public StrategyType Type { get; set; } + public IndicatorType Type { get; set; } public SignalType SignalType { get; set; } public int MinimumHistory { get; set; } public int? Period { get; set; } @@ -38,9 +38,9 @@ namespace Managing.Domain.Strategies return new List(); } - public virtual StrategiesResultBase GetStrategyValues() + public virtual IndicatorsResultBase GetStrategyValues() { - return new StrategiesResultBase(); + return new IndicatorsResultBase(); } public void UpdateCandles(HashSet newCandles) diff --git a/src/Managing.Domain/Strategies/Signal.cs b/src/Managing.Domain/Strategies/Signal.cs index 6461d57..4ae8427 100644 --- a/src/Managing.Domain/Strategies/Signal.cs +++ b/src/Managing.Domain/Strategies/Signal.cs @@ -18,12 +18,12 @@ namespace Managing.Domain.Strategies [Required] public string Identifier { get; } [Required] public Ticker Ticker { get; } [Required] public TradingExchanges Exchange { get; set; } - [Required] public StrategyType StrategyType { get; set; } + [Required] public IndicatorType IndicatorType { get; set; } [Required] public SignalType SignalType { get; set; } public User User { get; set; } public Signal(Ticker ticker, TradeDirection direction, Confidence confidence, Candle candle, DateTime date, - TradingExchanges exchange, StrategyType strategyType, SignalType signalType, User user = null) + TradingExchanges exchange, IndicatorType indicatorType, SignalType signalType, User user = null) { Direction = direction; Confidence = confidence; @@ -32,10 +32,11 @@ namespace Managing.Domain.Strategies Ticker = ticker; Exchange = exchange; Status = SignalStatus.WaitingForPosition; - StrategyType = strategyType; + IndicatorType = indicatorType; User = user; - Identifier = $"{StrategyType}-{direction}-{ticker}-{candle?.Close.ToString(CultureInfo.InvariantCulture)}-{date:yyyyMMdd-HHmmss}"; + Identifier = + $"{IndicatorType}-{direction}-{ticker}-{candle?.Close.ToString(CultureInfo.InvariantCulture)}-{date:yyyyMMdd-HHmmss}"; SignalType = signalType; } diff --git a/src/Managing.Domain/Strategies/Signals/ChandelierExitStrategy.cs b/src/Managing.Domain/Strategies/Signals/ChandelierExitIndicator.cs similarity index 93% rename from src/Managing.Domain/Strategies/Signals/ChandelierExitStrategy.cs rename to src/Managing.Domain/Strategies/Signals/ChandelierExitIndicator.cs index 54f1ebc..20fcfa0 100644 --- a/src/Managing.Domain/Strategies/Signals/ChandelierExitStrategy.cs +++ b/src/Managing.Domain/Strategies/Signals/ChandelierExitIndicator.cs @@ -7,11 +7,12 @@ using static Managing.Common.Enums; namespace Managing.Domain.Strategies.Signals; -public class ChandelierExitStrategy : Strategy +public class ChandelierExitIndicator : Indicator { public List Signals { get; set; } - public ChandelierExitStrategy(string name, int period, double multiplier) : base(name, StrategyType.ChandelierExit) + public ChandelierExitIndicator(string name, int period, double multiplier) : base(name, + IndicatorType.ChandelierExit) { Signals = new List(); Period = period; @@ -39,9 +40,9 @@ public class ChandelierExitStrategy : Strategy } } - public override StrategiesResultBase GetStrategyValues() + public override IndicatorsResultBase GetStrategyValues() { - return new StrategiesResultBase() + return new IndicatorsResultBase() { ChandelierLong = Candles.GetChandelier(Period.Value, Multiplier.Value, ChandelierType.Long).ToList(), ChandelierShort = Candles.GetChandelier(Period.Value, Multiplier.Value, ChandelierType.Short).ToList() diff --git a/src/Managing.Domain/Strategies/Signals/DualEmaCrossStrategy.cs b/src/Managing.Domain/Strategies/Signals/DualEmaCrossIndicator.cs similarity index 93% rename from src/Managing.Domain/Strategies/Signals/DualEmaCrossStrategy.cs rename to src/Managing.Domain/Strategies/Signals/DualEmaCrossIndicator.cs index 0998ab9..0028700 100644 --- a/src/Managing.Domain/Strategies/Signals/DualEmaCrossStrategy.cs +++ b/src/Managing.Domain/Strategies/Signals/DualEmaCrossIndicator.cs @@ -7,11 +7,11 @@ using static Managing.Common.Enums; namespace Managing.Domain.Strategies.Signals; -public class DualEmaCrossStrategy : EmaBaseStrategy +public class DualEmaCrossIndicator : EmaBaseIndicator { public List Signals { get; set; } - public DualEmaCrossStrategy(string name, int fastPeriod, int slowPeriod) : base(name, StrategyType.DualEmaCross) + public DualEmaCrossIndicator(string name, int fastPeriod, int slowPeriod) : base(name, IndicatorType.DualEmaCross) { Signals = new List(); FastPeriods = fastPeriod; @@ -19,9 +19,9 @@ public class DualEmaCrossStrategy : EmaBaseStrategy MinimumHistory = Math.Max(fastPeriod, slowPeriod) * 2; } - public override StrategiesResultBase GetStrategyValues() + public override IndicatorsResultBase GetStrategyValues() { - return new StrategiesResultBase() + return new IndicatorsResultBase() { FastEma = Candles.GetEma(FastPeriods.Value).ToList(), SlowEma = Candles.GetEma(SlowPeriods.Value).ToList() diff --git a/src/Managing.Domain/Strategies/Signals/EmaCrossStrategy.cs b/src/Managing.Domain/Strategies/Signals/EmaCrossIndicator.cs similarity index 89% rename from src/Managing.Domain/Strategies/Signals/EmaCrossStrategy.cs rename to src/Managing.Domain/Strategies/Signals/EmaCrossIndicator.cs index 4ca9b32..2ba29b7 100644 --- a/src/Managing.Domain/Strategies/Signals/EmaCrossStrategy.cs +++ b/src/Managing.Domain/Strategies/Signals/EmaCrossIndicator.cs @@ -6,19 +6,19 @@ using static Managing.Common.Enums; namespace Managing.Domain.Strategies.Signals; -public class EmaCrossStrategy : EmaBaseStrategy +public class EmaCrossIndicator : EmaBaseIndicator { public List Signals { get; set; } - public EmaCrossStrategy(string name, int period) : base(name, StrategyType.EmaCross) + public EmaCrossIndicator(string name, int period) : base(name, IndicatorType.EmaCross) { Signals = new List(); Period = period; } - public override StrategiesResultBase GetStrategyValues() + public override IndicatorsResultBase GetStrategyValues() { - return new StrategiesResultBase() + return new IndicatorsResultBase() { Ema = Candles.GetEma(Period.Value).ToList() }; diff --git a/src/Managing.Domain/Strategies/Signals/LaggingSTC.cs b/src/Managing.Domain/Strategies/Signals/LaggingSTC.cs index f955300..c1b023f 100644 --- a/src/Managing.Domain/Strategies/Signals/LaggingSTC.cs +++ b/src/Managing.Domain/Strategies/Signals/LaggingSTC.cs @@ -14,12 +14,12 @@ namespace Managing.Domain.Strategies.Signals; /// 2. Long signals on STC rebound from oversold (25- → ≥25) with recent compressed volatility (max <11) /// 3. Avoids look-ahead bias through proper rolling window implementation /// -public class LaggingSTC : Strategy +public class LaggingSTC : Indicator { public List Signals { get; set; } public LaggingSTC(string name, int cyclePeriods, int fastPeriods, int slowPeriods) : base(name, - StrategyType.LaggingStc) + IndicatorType.LaggingStc) { Signals = new List(); FastPeriods = fastPeriods; @@ -89,10 +89,10 @@ public class LaggingSTC : Strategy } } - public override StrategiesResultBase GetStrategyValues() + public override IndicatorsResultBase GetStrategyValues() { var stc = Candles.GetStc(FastPeriods.Value, FastPeriods.Value, SlowPeriods.Value).ToList(); - return new StrategiesResultBase + return new IndicatorsResultBase { Stc = stc }; diff --git a/src/Managing.Domain/Strategies/Signals/MACDCrossStrategy.cs b/src/Managing.Domain/Strategies/Signals/MacdCrossIndicator.cs similarity index 91% rename from src/Managing.Domain/Strategies/Signals/MACDCrossStrategy.cs rename to src/Managing.Domain/Strategies/Signals/MacdCrossIndicator.cs index 184e80f..24f40c4 100644 --- a/src/Managing.Domain/Strategies/Signals/MACDCrossStrategy.cs +++ b/src/Managing.Domain/Strategies/Signals/MacdCrossIndicator.cs @@ -7,12 +7,12 @@ using static Managing.Common.Enums; namespace Managing.Domain.Strategies.Signals; -public class MacdCrossStrategy : Strategy +public class MacdCrossIndicator : Indicator { public List Signals { get; set; } - public MacdCrossStrategy(string name, int fastPeriods, int slowPeriods, int signalPeriods) : - base(name, StrategyType.MacdCross) + public MacdCrossIndicator(string name, int fastPeriods, int slowPeriods, int signalPeriods) : + base(name, IndicatorType.MacdCross) { Signals = new List(); FastPeriods = fastPeriods; @@ -59,9 +59,9 @@ public class MacdCrossStrategy : Strategy } } - public override StrategiesResultBase GetStrategyValues() + public override IndicatorsResultBase GetStrategyValues() { - return new StrategiesResultBase() + return new IndicatorsResultBase() { Macd = Candles.GetMacd(FastPeriods.Value, SlowPeriods.Value, SignalPeriods.Value).ToList() }; diff --git a/src/Managing.Domain/Strategies/Signals/RSIDivergenceConfirmStrategy.cs b/src/Managing.Domain/Strategies/Signals/RsiDivergenceConfirmIndicator.cs similarity index 97% rename from src/Managing.Domain/Strategies/Signals/RSIDivergenceConfirmStrategy.cs rename to src/Managing.Domain/Strategies/Signals/RsiDivergenceConfirmIndicator.cs index 04810c8..1514873 100644 --- a/src/Managing.Domain/Strategies/Signals/RSIDivergenceConfirmStrategy.cs +++ b/src/Managing.Domain/Strategies/Signals/RsiDivergenceConfirmIndicator.cs @@ -7,11 +7,11 @@ using Candle = Managing.Domain.Candles.Candle; namespace Managing.Domain.Strategies.Signals; -public class RsiDivergenceConfirmStrategy : Strategy +public class RsiDivergenceConfirmIndicator : Indicator { public List Signals { get; set; } - public RsiDivergenceConfirmStrategy(string name, int period) : base(name, StrategyType.RsiDivergenceConfirm) + public RsiDivergenceConfirmIndicator(string name, int period) : base(name, IndicatorType.RsiDivergenceConfirm) { Period = period; Signals = new List(); @@ -49,9 +49,9 @@ public class RsiDivergenceConfirmStrategy : Strategy } } - public override StrategiesResultBase GetStrategyValues() + public override IndicatorsResultBase GetStrategyValues() { - return new StrategiesResultBase() + return new IndicatorsResultBase() { Rsi = Candles.GetRsi(Period.Value).ToList() }; diff --git a/src/Managing.Domain/Strategies/Signals/RSIDivergenceStrategy.cs b/src/Managing.Domain/Strategies/Signals/RsiDivergenceIndicator.cs similarity index 96% rename from src/Managing.Domain/Strategies/Signals/RSIDivergenceStrategy.cs rename to src/Managing.Domain/Strategies/Signals/RsiDivergenceIndicator.cs index 20badfb..96c9270 100644 --- a/src/Managing.Domain/Strategies/Signals/RSIDivergenceStrategy.cs +++ b/src/Managing.Domain/Strategies/Signals/RsiDivergenceIndicator.cs @@ -7,14 +7,14 @@ using Candle = Managing.Domain.Candles.Candle; namespace Managing.Domain.Strategies.Signals; -public class RsiDivergenceStrategy : Strategy +public class RsiDivergenceIndicator : Indicator { public List Signals { get; set; } public TradeDirection Direction { get; set; } private const int UpperBand = 70; private const int LowerBand = 30; - public RsiDivergenceStrategy(string name, int period) : base(name, StrategyType.RsiDivergence) + public RsiDivergenceIndicator(string name, int period) : base(name, IndicatorType.RsiDivergence) { Period = period; Signals = new List(); @@ -52,9 +52,9 @@ public class RsiDivergenceStrategy : Strategy } } - public override StrategiesResultBase GetStrategyValues() + public override IndicatorsResultBase GetStrategyValues() { - return new StrategiesResultBase() + return new IndicatorsResultBase() { Rsi = Candles.GetRsi(Period.Value).ToList() }; diff --git a/src/Managing.Domain/Strategies/Signals/STCStrategy.cs b/src/Managing.Domain/Strategies/Signals/StcIndicator.cs similarity index 92% rename from src/Managing.Domain/Strategies/Signals/STCStrategy.cs rename to src/Managing.Domain/Strategies/Signals/StcIndicator.cs index da5e7be..686b576 100644 --- a/src/Managing.Domain/Strategies/Signals/STCStrategy.cs +++ b/src/Managing.Domain/Strategies/Signals/StcIndicator.cs @@ -7,11 +7,11 @@ using static Managing.Common.Enums; namespace Managing.Domain.Strategies.Signals; -public class StcStrategy : Strategy +public class StcIndicator : Indicator { public List Signals { get; set; } - public StcStrategy(string name, int cyclePeriods, int fastPeriods, int slowPeriods) : base(name, StrategyType.Stc) + public StcIndicator(string name, int cyclePeriods, int fastPeriods, int slowPeriods) : base(name, IndicatorType.Stc) { Signals = new List(); FastPeriods = fastPeriods; @@ -64,12 +64,12 @@ public class StcStrategy : Strategy } } - public override StrategiesResultBase GetStrategyValues() + public override IndicatorsResultBase GetStrategyValues() { if (FastPeriods != null && SlowPeriods != null) { var stc = Candles.GetStc(FastPeriods.Value, FastPeriods.Value, SlowPeriods.Value).ToList(); - return new StrategiesResultBase + return new IndicatorsResultBase { Stc = stc }; diff --git a/src/Managing.Domain/Strategies/Signals/SuperTrendCrossEma.cs b/src/Managing.Domain/Strategies/Signals/SuperTrendCrossEma.cs index df381e4..985202f 100644 --- a/src/Managing.Domain/Strategies/Signals/SuperTrendCrossEma.cs +++ b/src/Managing.Domain/Strategies/Signals/SuperTrendCrossEma.cs @@ -7,11 +7,11 @@ using static Managing.Common.Enums; namespace Managing.Domain.Strategies.Signals; -public class SuperTrendCrossEma : Strategy +public class SuperTrendCrossEma : Indicator { public List Signals { get; set; } - public SuperTrendCrossEma(string name, int period, double multiplier) : base(name, StrategyType.SuperTrendCrossEma) + public SuperTrendCrossEma(string name, int period, double multiplier) : base(name, IndicatorType.SuperTrendCrossEma) { Signals = new List(); Period = period; @@ -157,9 +157,9 @@ public class SuperTrendCrossEma : Strategy return superTrends; } - public override StrategiesResultBase GetStrategyValues() + public override IndicatorsResultBase GetStrategyValues() { - return new StrategiesResultBase() + return new IndicatorsResultBase() { SuperTrend = Candles.GetSuperTrend(Period.Value, Multiplier.Value).Where(s => s.SuperTrend.HasValue) .ToList() diff --git a/src/Managing.Domain/Strategies/Signals/SuperTrendStrategy.cs b/src/Managing.Domain/Strategies/Signals/SuperTrendIndicator.cs similarity index 93% rename from src/Managing.Domain/Strategies/Signals/SuperTrendStrategy.cs rename to src/Managing.Domain/Strategies/Signals/SuperTrendIndicator.cs index ff6bfe1..db13431 100644 --- a/src/Managing.Domain/Strategies/Signals/SuperTrendStrategy.cs +++ b/src/Managing.Domain/Strategies/Signals/SuperTrendIndicator.cs @@ -7,11 +7,11 @@ using static Managing.Common.Enums; namespace Managing.Domain.Strategies.Signals; -public class SuperTrendStrategy : Strategy +public class SuperTrendIndicator : Indicator { public List Signals { get; set; } - public SuperTrendStrategy(string name, int period, double multiplier) : base(name, StrategyType.SuperTrend) + public SuperTrendIndicator(string name, int period, double multiplier) : base(name, IndicatorType.SuperTrend) { Signals = new List(); Period = period; @@ -61,9 +61,9 @@ public class SuperTrendStrategy : Strategy } } - public override StrategiesResultBase GetStrategyValues() + public override IndicatorsResultBase GetStrategyValues() { - return new StrategiesResultBase() + return new IndicatorsResultBase() { SuperTrend = Candles.GetSuperTrend(Period.Value, Multiplier.Value).Where(s => s.SuperTrend.HasValue) .ToList() diff --git a/src/Managing.Domain/Strategies/Signals/ThreeWhiteSoldiersStrategy.cs b/src/Managing.Domain/Strategies/Signals/ThreeWhiteSoldiersIndicator.cs similarity index 85% rename from src/Managing.Domain/Strategies/Signals/ThreeWhiteSoldiersStrategy.cs rename to src/Managing.Domain/Strategies/Signals/ThreeWhiteSoldiersIndicator.cs index c03b54d..1346fe2 100644 --- a/src/Managing.Domain/Strategies/Signals/ThreeWhiteSoldiersStrategy.cs +++ b/src/Managing.Domain/Strategies/Signals/ThreeWhiteSoldiersIndicator.cs @@ -6,10 +6,10 @@ using static Managing.Common.Enums; namespace Managing.Domain.Strategies.Signals { - public class ThreeWhiteSoldiersStrategy : Strategy + public class ThreeWhiteSoldiersIndicator : Indicator { - public ThreeWhiteSoldiersStrategy(string name, int period) - : base(name, StrategyType.ThreeWhiteSoldiers) + public ThreeWhiteSoldiersIndicator(string name, int period) + : base(name, IndicatorType.ThreeWhiteSoldiers) { Period = period; } @@ -52,7 +52,7 @@ namespace Managing.Domain.Strategies.Signals } } - public override StrategiesResultBase GetStrategyValues() + public override IndicatorsResultBase GetStrategyValues() { throw new NotImplementedException(); } diff --git a/src/Managing.Domain/Strategies/Trends/EmaTrendStrategy.cs b/src/Managing.Domain/Strategies/Trends/EmaTrendIndicator.cs similarity index 88% rename from src/Managing.Domain/Strategies/Trends/EmaTrendStrategy.cs rename to src/Managing.Domain/Strategies/Trends/EmaTrendIndicator.cs index b79daaa..6c33603 100644 --- a/src/Managing.Domain/Strategies/Trends/EmaTrendStrategy.cs +++ b/src/Managing.Domain/Strategies/Trends/EmaTrendIndicator.cs @@ -6,11 +6,11 @@ using static Managing.Common.Enums; namespace Managing.Domain.Strategies.Trends; -public class EmaTrendStrategy : EmaBaseStrategy +public class EmaTrendIndicator : EmaBaseIndicator { public List Signals { get; set; } - public EmaTrendStrategy(string name, int period) : base(name, StrategyType.EmaTrend) + public EmaTrendIndicator(string name, int period) : base(name, IndicatorType.EmaTrend) { Signals = new List(); Period = period; @@ -54,9 +54,9 @@ public class EmaTrendStrategy : EmaBaseStrategy } } - public override StrategiesResultBase GetStrategyValues() + public override IndicatorsResultBase GetStrategyValues() { - return new StrategiesResultBase() + return new IndicatorsResultBase() { Ema = Candles.GetEma(Period.Value).ToList() }; diff --git a/src/Managing.Domain/Strategies/Trends/StochRsiTrendStrategy.cs b/src/Managing.Domain/Strategies/Trends/StochRsiTrendIndicator.cs similarity index 93% rename from src/Managing.Domain/Strategies/Trends/StochRsiTrendStrategy.cs rename to src/Managing.Domain/Strategies/Trends/StochRsiTrendIndicator.cs index 2db67ef..5305ec5 100644 --- a/src/Managing.Domain/Strategies/Trends/StochRsiTrendStrategy.cs +++ b/src/Managing.Domain/Strategies/Trends/StochRsiTrendIndicator.cs @@ -7,16 +7,16 @@ using static Managing.Common.Enums; namespace Managing.Domain.Strategies.Trends; -public class StochRsiTrendStrategy : Strategy +public class StochRsiTrendIndicator : Indicator { public List Signals { get; set; } - public StochRsiTrendStrategy( + public StochRsiTrendIndicator( string name, int period, int stochPeriod, int signalPeriod, - int smoothPeriods) : base(name, StrategyType.StochRsiTrend) + int smoothPeriods) : base(name, IndicatorType.StochRsiTrend) { Signals = new List(); StochPeriods = stochPeriod; @@ -65,9 +65,9 @@ public class StochRsiTrendStrategy : Strategy } } - public override StrategiesResultBase GetStrategyValues() + public override IndicatorsResultBase GetStrategyValues() { - return new StrategiesResultBase() + return new IndicatorsResultBase() { StochRsi = Candles.GetStochRsi(Period.Value, StochPeriods.Value, SignalPeriods.Value, SmoothPeriods.Value) .ToList() diff --git a/src/Managing.Infrastructure.Database/MongoDb/Collections/StrategyDto.cs b/src/Managing.Infrastructure.Database/MongoDb/Collections/IndicatorDto.cs similarity index 87% rename from src/Managing.Infrastructure.Database/MongoDb/Collections/StrategyDto.cs rename to src/Managing.Infrastructure.Database/MongoDb/Collections/IndicatorDto.cs index 1fe1e90..6d6b9c6 100644 --- a/src/Managing.Infrastructure.Database/MongoDb/Collections/StrategyDto.cs +++ b/src/Managing.Infrastructure.Database/MongoDb/Collections/IndicatorDto.cs @@ -4,10 +4,10 @@ using static Managing.Common.Enums; namespace Managing.Infrastructure.Databases.MongoDb.Collections { - [BsonCollection("Strategies")] - public class StrategyDto : Document + [BsonCollection("Indicators")] + public class IndicatorDto : Document { - public StrategyType Type { get; set; } + public IndicatorType Type { get; set; } public Timeframe Timeframe { get; set; } public string Name { get; set; } public int MinimumHistory { get; set; } @@ -22,4 +22,4 @@ namespace Managing.Infrastructure.Databases.MongoDb.Collections public SignalType SignalType { get; set; } public UserDto User { get; set; } } -} +} \ No newline at end of file diff --git a/src/Managing.Infrastructure.Database/MongoDb/Collections/ScenarioDto.cs b/src/Managing.Infrastructure.Database/MongoDb/Collections/ScenarioDto.cs index bca0d3b..b3c488f 100644 --- a/src/Managing.Infrastructure.Database/MongoDb/Collections/ScenarioDto.cs +++ b/src/Managing.Infrastructure.Database/MongoDb/Collections/ScenarioDto.cs @@ -7,7 +7,7 @@ namespace Managing.Infrastructure.Databases.MongoDb.Collections public class ScenarioDto : Document { public string Name { get; set; } - public List Strategies { get; set; } + public List Indicators { get; set; } public int LoopbackPeriod { get; set; } public UserDto User { get; set; } } diff --git a/src/Managing.Infrastructure.Database/MongoDb/Collections/SignalDto.cs b/src/Managing.Infrastructure.Database/MongoDb/Collections/SignalDto.cs index 112b036..18a21c6 100644 --- a/src/Managing.Infrastructure.Database/MongoDb/Collections/SignalDto.cs +++ b/src/Managing.Infrastructure.Database/MongoDb/Collections/SignalDto.cs @@ -15,8 +15,8 @@ namespace Managing.Infrastructure.Databases.MongoDb.Collections public Ticker Ticker { get; set; } public SignalStatus Status { get; set; } public Timeframe Timeframe { get; set; } - public StrategyType Type { get; set; } + public IndicatorType Type { get; set; } public SignalType SignalType { get; set; } public UserDto User { get; set; } } -} +} \ No newline at end of file diff --git a/src/Managing.Infrastructure.Database/MongoDb/MongoMappers.cs b/src/Managing.Infrastructure.Database/MongoDb/MongoMappers.cs index c89d1ca..e97d1b6 100644 --- a/src/Managing.Infrastructure.Database/MongoDb/MongoMappers.cs +++ b/src/Managing.Infrastructure.Database/MongoDb/MongoMappers.cs @@ -370,7 +370,7 @@ public static class MongoMappers Ticker = signal.Ticker, Status = signal.Status, Timeframe = signal.Timeframe, - Type = signal.StrategyType, + Type = signal.IndicatorType, User = signal.User != null ? Map(signal.User) : null }; } @@ -412,7 +412,7 @@ public static class MongoMappers return new ScenarioDto { Name = scenario.Name, - Strategies = Map(scenario.Strategies), + Indicators = Map(scenario.Indicators), LoopbackPeriod = scenario.LoopbackPeriod ?? 1, User = scenario.User != null ? Map(scenario.User) : null }; @@ -430,64 +430,64 @@ public static class MongoMappers var scenario = new Scenario(d.Name, d.LoopbackPeriod) { - Strategies = d.Strategies.Select(s => Map(s)).ToList(), + Indicators = d.Indicators.Select(s => Map(s)).ToList(), User = d.User != null ? Map(d.User) : null }; return scenario; } - private static List Map(List strategies) + private static List Map(List indicators) { - return strategies.ConvertAll(strategy => Map(strategy)); + return indicators.ConvertAll(strategy => Map(strategy)); } - internal static Strategy Map(StrategyDto strategyDto) + internal static Indicator Map(IndicatorDto indicatorDto) { - if (strategyDto == null) + if (indicatorDto == null) return null; - return new Strategy(strategyDto.Name, strategyDto.Type) + return new Indicator(indicatorDto.Name, indicatorDto.Type) { - SignalType = strategyDto.SignalType, - MinimumHistory = strategyDto.MinimumHistory, - Period = strategyDto.Period, - FastPeriods = strategyDto.FastPeriods, - SlowPeriods = strategyDto.SlowPeriods, - SignalPeriods = strategyDto.SignalPeriods, - Multiplier = strategyDto.Multiplier, - SmoothPeriods = strategyDto.SmoothPeriods, - StochPeriods = strategyDto.StochPeriods, - CyclePeriods = strategyDto.CyclePeriods, - User = strategyDto.User != null ? Map(strategyDto.User) : null + SignalType = indicatorDto.SignalType, + MinimumHistory = indicatorDto.MinimumHistory, + Period = indicatorDto.Period, + FastPeriods = indicatorDto.FastPeriods, + SlowPeriods = indicatorDto.SlowPeriods, + SignalPeriods = indicatorDto.SignalPeriods, + Multiplier = indicatorDto.Multiplier, + SmoothPeriods = indicatorDto.SmoothPeriods, + StochPeriods = indicatorDto.StochPeriods, + CyclePeriods = indicatorDto.CyclePeriods, + User = indicatorDto.User != null ? Map(indicatorDto.User) : null }; } - internal static StrategyDto Map(Strategy strategy) + internal static IndicatorDto Map(Indicator indicator) { - if (strategy == null) + if (indicator == null) return null; - return new StrategyDto + return new IndicatorDto { - Name = strategy.Name, - Type = strategy.Type, - SignalType = strategy.SignalType, - MinimumHistory = strategy.MinimumHistory, - Period = strategy.Period, - FastPeriods = strategy.FastPeriods, - SlowPeriods = strategy.SlowPeriods, - SignalPeriods = strategy.SignalPeriods, - Multiplier = strategy.Multiplier, - SmoothPeriods = strategy.SmoothPeriods, - StochPeriods = strategy.StochPeriods, - CyclePeriods = strategy.CyclePeriods, - User = strategy.User != null ? Map(strategy.User) : null + Name = indicator.Name, + Type = indicator.Type, + SignalType = indicator.SignalType, + MinimumHistory = indicator.MinimumHistory, + Period = indicator.Period, + FastPeriods = indicator.FastPeriods, + SlowPeriods = indicator.SlowPeriods, + SignalPeriods = indicator.SignalPeriods, + Multiplier = indicator.Multiplier, + SmoothPeriods = indicator.SmoothPeriods, + StochPeriods = indicator.StochPeriods, + CyclePeriods = indicator.CyclePeriods, + User = indicator.User != null ? Map(indicator.User) : null }; } - internal static IEnumerable Map(IEnumerable strategies) + internal static IEnumerable Map(IEnumerable indicators) { - return strategies.Select(strategy => Map(strategy)); + return indicators.Select(indicator => Map(indicator)); } #endregion @@ -567,8 +567,8 @@ public static class MongoMappers Scenario = new ScenarioDto { Name = spotlight.Scenario.Name, - Strategies = - spotlight.Scenario.Strategies.ConvertAll( + Indicators = + spotlight.Scenario.Indicators.ConvertAll( spotlightScenarioStrategy => Map(spotlightScenarioStrategy)) }, TickerSignals = spotlight.TickerSignals.ConvertAll(spotlightTickerSignal => new TickerSignalDto @@ -607,8 +607,8 @@ public static class MongoMappers { Scenario = new Scenario(name: spotlight.Scenario.Name) { - Strategies = - spotlight.Scenario.Strategies.ConvertAll( + Indicators = + spotlight.Scenario.Indicators.ConvertAll( spotlightScenarioStrategy => Map(spotlightScenarioStrategy)) }, TickerSignals = spotlight.TickerSignals.ConvertAll(spotlightTickerSignal => new TickerSignal diff --git a/src/Managing.Infrastructure.Database/TradingRepository.cs b/src/Managing.Infrastructure.Database/TradingRepository.cs index e3f07c0..ebbce76 100644 --- a/src/Managing.Infrastructure.Database/TradingRepository.cs +++ b/src/Managing.Infrastructure.Database/TradingRepository.cs @@ -16,20 +16,20 @@ public class TradingRepository : ITradingRepository private readonly IMongoRepository _scenarioRepository; private readonly IMongoRepository _signalRepository; private readonly IMongoRepository _positionRepository; - private readonly IMongoRepository _strategyRepository; + private readonly IMongoRepository _indicatorRepository; private readonly IMongoRepository _feeRepository; public TradingRepository( IMongoRepository scenarioRepository, IMongoRepository signalRepository, IMongoRepository positionRepository, - IMongoRepository strategyRepository, + IMongoRepository indicatorRepository, IMongoRepository feeRepository) { _scenarioRepository = scenarioRepository; _signalRepository = signalRepository; _positionRepository = positionRepository; - _strategyRepository = strategyRepository; + _indicatorRepository = indicatorRepository; _feeRepository = feeRepository; } @@ -44,15 +44,15 @@ public class TradingRepository : ITradingRepository _scenarioRepository.DropCollection(); } - public void DeleteStrategies() + public void DeleteIndicators() { - _strategyRepository.DropCollection(); + _indicatorRepository.DropCollection(); } - public void DeleteStrategy(string name) + public void DeleteIndicator(string name) { - var strategy = _strategyRepository.FindOne(s => s.Name == name); - _strategyRepository.DeleteById(strategy.Id.ToString()); + var strategy = _indicatorRepository.FindOne(s => s.Name == name); + _indicatorRepository.DeleteById(strategy.Id.ToString()); } public Position GetPositionByIdentifier(string identifier) @@ -87,15 +87,15 @@ public class TradingRepository : ITradingRepository return scenarios.Select(s => MongoMappers.Map(s)); } - public IEnumerable GetStrategies() + public IEnumerable GetIndicators() { - var strategies = _strategyRepository.FindAll(); - return strategies.Select(MongoMappers.Map); + var indicators = _indicatorRepository.FindAll(); + return indicators.Select(MongoMappers.Map); } - public Strategy GetStrategyByName(string name) + public Indicator GetStrategyByName(string name) { - var strategy = _strategyRepository.FindOne(s => s.Name == name); + var strategy = _indicatorRepository.FindOne(s => s.Name == name); return MongoMappers.Map(strategy); } @@ -129,17 +129,17 @@ public class TradingRepository : ITradingRepository $"Scenario with name '{scenario.Name}' already exists for user '{scenario.User?.Name}'"); } - var strategyDtos = new List(); - foreach (var strategy in scenario.Strategies) + var strategyDtos = new List(); + foreach (var strategy in scenario.Indicators) { - var dto = _strategyRepository.FindOne(s => s.Name == strategy.Name); + var dto = _indicatorRepository.FindOne(s => s.Name == strategy.Name); strategyDtos.Add(dto); } var scenarioDto = new ScenarioDto { Name = scenario.Name, - Strategies = strategyDtos, + Indicators = strategyDtos, User = scenario.User != null ? MongoMappers.Map(scenario.User) : null }; @@ -165,21 +165,21 @@ public class TradingRepository : ITradingRepository _signalRepository.InsertOne(dto); } - public void InsertStrategy(Strategy strategy) + public void InsertStrategy(Indicator indicator) { // Check if strategy already exists for the same user - var existingStrategy = _strategyRepository.FindOne(s => - s.Name == strategy.Name && - (strategy.User == null || (s.User != null && s.User.Name == strategy.User.Name))); + var existingStrategy = _indicatorRepository.FindOne(s => + s.Name == indicator.Name && + (indicator.User == null || (s.User != null && s.User.Name == indicator.User.Name))); if (existingStrategy != null) { throw new InvalidOperationException( - $"Strategy with name '{strategy.Name}' already exists for user '{strategy.User?.Name}'"); + $"Strategy with name '{indicator.Name}' already exists for user '{indicator.User?.Name}'"); } - var dto = MongoMappers.Map(strategy); - _strategyRepository.InsertOne(dto); + var dto = MongoMappers.Map(indicator); + _indicatorRepository.InsertOne(dto); } public void InsertFee(Fee fee) @@ -262,11 +262,11 @@ public class TradingRepository : ITradingRepository _scenarioRepository.Update(dto); } - public void UpdateStrategy(Strategy strategy) + public void UpdateStrategy(Indicator indicator) { - var s = _strategyRepository.FindOne(s => s.Name == strategy.Name); - var dto = MongoMappers.Map(strategy); + var s = _indicatorRepository.FindOne(s => s.Name == indicator.Name); + var dto = MongoMappers.Map(indicator); dto.Id = s.Id; - _strategyRepository.Update(dto); + _indicatorRepository.Update(dto); } } \ No newline at end of file