Push merge conflict

This commit is contained in:
2025-07-04 11:02:53 +07:00
parent 88f195c0ca
commit 59c5de7df7
27 changed files with 1133 additions and 1118 deletions

View File

@@ -1,7 +1,6 @@
using Exilion.TradingAtomics;
using Managing.Infrastructure.Databases.MongoDb.Attributes;
using Managing.Infrastructure.Databases.MongoDb.Configurations;
using static Managing.Common.Enums;
namespace Managing.Infrastructure.Databases.MongoDb.Collections
{
@@ -12,6 +11,7 @@ namespace Managing.Infrastructure.Databases.MongoDb.Collections
public int WinRate { get; set; }
public decimal GrowthPercentage { get; set; }
public decimal HodlPercentage { get; set; }
public TradingBotConfigDto Config { get; set; }
public List<PositionDto> Positions { get; set; }
public List<SignalDto> Signals { get; set; }
public List<CandleDto> Candles { get; set; }
@@ -22,17 +22,5 @@ namespace Managing.Infrastructure.Databases.MongoDb.Collections
public UserDto User { get; set; }
public PerformanceMetrics Statistics { get; set; }
public double Score { get; set; }
// TradingBotConfig properties
public string AccountName { get; set; }
public Ticker Ticker { get; set; }
public string ScenarioName { get; set; }
public Timeframe Timeframe { get; set; }
public bool IsForWatchingOnly { get; set; }
public decimal BotTradingBalance { get; set; }
public BotType BotType { get; set; }
public bool IsForBacktest { get; set; }
public int CooldownPeriod { get; set; }
public int MaxLossStreak { get; set; }
}
}
}

View File

@@ -4,6 +4,7 @@ using Managing.Domain.Backtests;
using Managing.Domain.Bots;
using Managing.Domain.Candles;
using Managing.Domain.MoneyManagements;
using Managing.Domain.Risk;
using Managing.Domain.Scenarios;
using Managing.Domain.Statistics;
using Managing.Domain.Strategies;
@@ -132,20 +133,7 @@ public static class MongoMappers
if (b == null)
return null;
var config = new TradingBotConfig
{
AccountName = b.AccountName,
Ticker = b.Ticker,
ScenarioName = b.ScenarioName,
Timeframe = b.Timeframe,
IsForWatchingOnly = b.IsForWatchingOnly,
BotTradingBalance = b.BotTradingBalance,
BotType = b.BotType,
IsForBacktest = b.IsForBacktest,
CooldownPeriod = b.CooldownPeriod,
MaxLossStreak = b.MaxLossStreak,
MoneyManagement = Map(b.MoneyManagement)
};
var config = Map(b.Config);
var bTest = new Backtest(
config,
@@ -181,6 +169,7 @@ public static class MongoMappers
WinRate = result.WinRate,
GrowthPercentage = result.GrowthPercentage,
HodlPercentage = result.HodlPercentage,
Config = Map(result.Config),
Positions = Map(result.Positions),
Signals = result.Signals.Select(s => Map(s)).ToList(),
Candles = result.Candles.Select(c => Map(c)).ToList(),
@@ -191,16 +180,6 @@ public static class MongoMappers
StartDate = result.StartDate,
EndDate = result.EndDate,
Score = result.Score,
AccountName = result.Config.AccountName,
Ticker = result.Config.Ticker,
ScenarioName = result.Config.ScenarioName,
Timeframe = result.Config.Timeframe,
IsForWatchingOnly = result.Config.IsForWatchingOnly,
BotTradingBalance = result.Config.BotTradingBalance,
BotType = result.Config.BotType,
IsForBacktest = result.Config.IsForBacktest,
CooldownPeriod = result.Config.CooldownPeriod,
MaxLossStreak = result.Config.MaxLossStreak
};
}
@@ -933,4 +912,122 @@ public static class MongoMappers
}
#endregion
#region TradingBotConfig
public static TradingBotConfigDto Map(TradingBotConfig config)
{
if (config == null)
return null;
return new TradingBotConfigDto
{
AccountName = config.AccountName,
MoneyManagement = Map(config.MoneyManagement),
Ticker = config.Ticker,
Timeframe = config.Timeframe,
IsForWatchingOnly = config.IsForWatchingOnly,
BotTradingBalance = config.BotTradingBalance,
IsForBacktest = config.IsForBacktest,
CooldownPeriod = config.CooldownPeriod,
MaxLossStreak = config.MaxLossStreak,
FlipPosition = config.FlipPosition,
Name = config.Name,
RiskManagement = Map(config.RiskManagement),
Scenario = Map(config.Scenario),
ScenarioName = config.ScenarioName,
MaxPositionTimeHours = config.MaxPositionTimeHours,
CloseEarlyWhenProfitable = config.CloseEarlyWhenProfitable,
FlipOnlyWhenInProfit = config.FlipOnlyWhenInProfit,
UseSynthApi = config.UseSynthApi,
UseForPositionSizing = config.UseForPositionSizing,
UseForSignalFiltering = config.UseForSignalFiltering,
UseForDynamicStopLoss = config.UseForDynamicStopLoss
};
}
public static TradingBotConfig Map(TradingBotConfigDto dto)
{
if (dto == null)
return null;
return new TradingBotConfig
{
AccountName = dto.AccountName,
MoneyManagement = Map(dto.MoneyManagement),
Ticker = dto.Ticker,
Timeframe = dto.Timeframe,
IsForWatchingOnly = dto.IsForWatchingOnly,
BotTradingBalance = dto.BotTradingBalance,
IsForBacktest = dto.IsForBacktest,
CooldownPeriod = dto.CooldownPeriod,
MaxLossStreak = dto.MaxLossStreak,
FlipPosition = dto.FlipPosition,
Name = dto.Name,
RiskManagement = Map(dto.RiskManagement),
Scenario = Map(dto.Scenario),
ScenarioName = dto.ScenarioName,
MaxPositionTimeHours = dto.MaxPositionTimeHours,
CloseEarlyWhenProfitable = dto.CloseEarlyWhenProfitable,
FlipOnlyWhenInProfit = dto.FlipOnlyWhenInProfit,
UseSynthApi = dto.UseSynthApi,
UseForPositionSizing = dto.UseForPositionSizing,
UseForSignalFiltering = dto.UseForSignalFiltering,
UseForDynamicStopLoss = dto.UseForDynamicStopLoss
};
}
#endregion
#region RiskManagement
public static RiskManagementDto Map(RiskManagement riskManagement)
{
if (riskManagement == null)
return null;
return new RiskManagementDto
{
AdverseProbabilityThreshold = riskManagement.AdverseProbabilityThreshold,
FavorableProbabilityThreshold = riskManagement.FavorableProbabilityThreshold,
RiskAversion = riskManagement.RiskAversion,
KellyMinimumThreshold = riskManagement.KellyMinimumThreshold,
KellyMaximumCap = riskManagement.KellyMaximumCap,
MaxLiquidationProbability = riskManagement.MaxLiquidationProbability,
SignalValidationTimeHorizonHours = riskManagement.SignalValidationTimeHorizonHours,
PositionMonitoringTimeHorizonHours = riskManagement.PositionMonitoringTimeHorizonHours,
PositionWarningThreshold = riskManagement.PositionWarningThreshold,
PositionAutoCloseThreshold = riskManagement.PositionAutoCloseThreshold,
KellyFractionalMultiplier = riskManagement.KellyFractionalMultiplier,
RiskTolerance = riskManagement.RiskTolerance,
UseExpectedUtility = riskManagement.UseExpectedUtility,
UseKellyCriterion = riskManagement.UseKellyCriterion
};
}
public static RiskManagement Map(RiskManagementDto dto)
{
if (dto == null)
return null;
return new RiskManagement
{
AdverseProbabilityThreshold = dto.AdverseProbabilityThreshold,
FavorableProbabilityThreshold = dto.FavorableProbabilityThreshold,
RiskAversion = dto.RiskAversion,
KellyMinimumThreshold = dto.KellyMinimumThreshold,
KellyMaximumCap = dto.KellyMaximumCap,
MaxLiquidationProbability = dto.MaxLiquidationProbability,
SignalValidationTimeHorizonHours = dto.SignalValidationTimeHorizonHours,
PositionMonitoringTimeHorizonHours = dto.PositionMonitoringTimeHorizonHours,
PositionWarningThreshold = dto.PositionWarningThreshold,
PositionAutoCloseThreshold = dto.PositionAutoCloseThreshold,
KellyFractionalMultiplier = dto.KellyFractionalMultiplier,
RiskTolerance = dto.RiskTolerance,
UseExpectedUtility = dto.UseExpectedUtility,
UseKellyCriterion = dto.UseKellyCriterion
};
}
#endregion
}