using System;
using System.Collections.Generic;
using System.Text.Json.Serialization;
using FinlyticCore.Dtos.TechnicalAnalysis;
namespace FinlyticCore.Dtos.Simulation;
///
/// Per-run overrides for 's tunable indicator parameters, keyed by
/// "{StrategyKey}.{ParameterName}" (e.g. "MeanReversion.RsiOversold") - see
/// TechnicalContext.ParameterOverrides. /empty means "use that strategy's own
/// hardcoded defaults". Deliberately scoped to backtesting only - live scanning never applies these.
///
public record BacktestRequestDto(
string Isin,
string Symbol,
string StrategyKey,
string Timeframe,
DateTime StartDateUtc,
DateTime EndDateUtc,
decimal StartingCapital = 10000m,
decimal RiskPerTradePercent = 1.0m, // 1% Risiko pro Trade
bool IncludeFeesAndSlippage = true,
bool SimulateKnockOutDerivatives = false,
decimal? TargetLeverage = 5.0m,
Dictionary? StrategyParameters = null
);
public record BacktestTradeDto(
Guid TradeId,
DateTime EntryTimeUtc,
DateTime ExitTimeUtc,
SignalDirection Direction,
decimal EntryPrice,
decimal ExitPrice,
decimal Quantity,
decimal InitialStopLoss,
decimal RealizedPnlEur,
decimal ReturnPercent,
decimal RMultiple,
string ExitReason, // "TP1_Hit", "TP2_Hit", "BreakEven", "TrailingStop", "KnockedOut", "TimeExpired"
decimal MaxAdverseExcursionPercent, // MAE: Maximaler zwischenzeitlicher Buchverlust
decimal MaxFavorableExcursionPercent // MFE: Maximaler zwischenzeitlicher Buchgewinn
);
public record EquityPointDto(
DateTime TimestampUtc,
decimal PortfolioValue,
decimal DrawdownPercent
);
public record BacktestReportDto(
Guid RunId,
string Isin,
string Symbol,
string StrategyKey,
string Timeframe,
DateTime StartDateUtc,
DateTime EndDateUtc,
int TotalTrades,
int WinningTrades,
int LosingTrades,
decimal WinRatePercent,
decimal ProfitFactor,
decimal MaxDrawdownPercent,
decimal TotalReturnPercent,
decimal ExpectancyEur,
decimal SharpeRatio,
decimal AverageRiskRewardRatio,
TimeSpan AverageHoldingDuration,
List Trades,
List EquityCurve
);
public record StrategyAssetReliabilityDto(
string Isin,
string StrategyKey,
decimal ReliabilityScore, // 0 - 100
decimal WinRatePercent,
decimal ProfitFactor,
int SampleTradeCount,
bool IsStrategyApprovedForAsset,
string RecommendedAction // "BOOST_SCORE", "NEUTRAL", "VETO_DISABLE"
);
public record GetReliabilityRequest(
string Isin,
string StrategyKey,
string Timeframe = "15m"
);
///
/// Filters for MqttTopics.Channels.SimGetBacktestHistory. is optional -
/// returns every strategy's runs for the ISIN, so the Web UI can show "all history for
/// this asset" and let the user narrow down from there.
///
public record GetBacktestHistoryRequest(
string Isin,
string? StrategyKey = null,
int Limit = 20
);
///
/// One row of the backtest history list - a lightweight summary (no Trades/EquityCurve) mapped
/// 1:1 from a persisted SimulationRunEntity, so listing many runs for an asset stays cheap. Fetch the
/// full for one specific run via SimGetBacktestRunDetail when the user
/// drills into it.
///
public record BacktestHistoryEntryDto(
Guid RunId,
string Isin,
string Symbol,
string StrategyKey,
string Timeframe,
DateTime StartDateUtc,
DateTime EndDateUtc,
int TotalTrades,
decimal WinRatePercent,
decimal ProfitFactor,
decimal MaxDrawdownPercent,
decimal TotalReturnPercent,
decimal SharpeRatio,
DateTime CreatedAtUtc
);
/// Looks up one specific past backtest run's full report by its RunId (MqttTopics.Channels.SimGetBacktestRunDetail).
public record GetBacktestRunDetailRequest(Guid RunId);
/// Looks up a saved parameter profile for one (Isin, StrategyKey) pair (MqttTopics.Channels.SimGetStrategyParameters).
public record GetStrategyParametersRequest(string Isin, string StrategyKey);
/// Upserts a saved parameter profile for one (Isin, StrategyKey) pair (MqttTopics.Channels.SimSaveStrategyParameters).
public record SaveStrategyParametersRequest(string Isin, string StrategyKey, Dictionary Parameters);
///
/// A saved set of tunable indicator parameter overrides for one (Isin, StrategyKey) pair, keyed by
/// "{StrategyKey}.{ParameterName}" (matching TechnicalContext.ParameterOverrides 1:1) - see
/// SimulationStrategyParameterEntity.
///
public record StrategyParameterProfileDto(
string Isin,
string StrategyKey,
Dictionary Parameters,
DateTime UpdatedAtUtc
);