Files

146 lines
5.0 KiB
C#

using System;
using System.Collections.Generic;
using System.Text.Json.Serialization;
using FinlyticCore.Dtos.TechnicalAnalysis;
namespace FinlyticCore.Dtos.Simulation;
/// <param name="StrategyParameters">
/// Per-run overrides for <paramref name="StrategyKey"/>'s tunable indicator parameters, keyed by
/// <c>"{StrategyKey}.{ParameterName}"</c> (e.g. <c>"MeanReversion.RsiOversold"</c>) - see
/// <c>TechnicalContext.ParameterOverrides</c>. <see langword="null"/>/empty means "use that strategy's own
/// hardcoded defaults". Deliberately scoped to backtesting only - live scanning never applies these.
/// </param>
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<string, decimal>? 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<BacktestTradeDto> Trades,
List<EquityPointDto> 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"
);
/// <summary>
/// Filters for <c>MqttTopics.Channels.SimGetBacktestHistory</c>. <see cref="StrategyKey"/> is optional -
/// <see langword="null"/> 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.
/// </summary>
public record GetBacktestHistoryRequest(
string Isin,
string? StrategyKey = null,
int Limit = 20
);
/// <summary>
/// One row of the backtest history list - a lightweight summary (no <c>Trades</c>/<c>EquityCurve</c>) mapped
/// 1:1 from a persisted <c>SimulationRunEntity</c>, so listing many runs for an asset stays cheap. Fetch the
/// full <see cref="BacktestReportDto"/> for one specific run via <c>SimGetBacktestRunDetail</c> when the user
/// drills into it.
/// </summary>
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
);
/// <summary>Looks up one specific past backtest run's full report by its RunId (<c>MqttTopics.Channels.SimGetBacktestRunDetail</c>).</summary>
public record GetBacktestRunDetailRequest(Guid RunId);
/// <summary>Looks up a saved parameter profile for one (Isin, StrategyKey) pair (<c>MqttTopics.Channels.SimGetStrategyParameters</c>).</summary>
public record GetStrategyParametersRequest(string Isin, string StrategyKey);
/// <summary>Upserts a saved parameter profile for one (Isin, StrategyKey) pair (<c>MqttTopics.Channels.SimSaveStrategyParameters</c>).</summary>
public record SaveStrategyParametersRequest(string Isin, string StrategyKey, Dictionary<string, decimal> Parameters);
/// <summary>
/// A saved set of tunable indicator parameter overrides for one (Isin, StrategyKey) pair, keyed by
/// <c>"{StrategyKey}.{ParameterName}"</c> (matching <c>TechnicalContext.ParameterOverrides</c> 1:1) - see
/// <c>SimulationStrategyParameterEntity</c>.
/// </summary>
public record StrategyParameterProfileDto(
string Isin,
string StrategyKey,
Dictionary<string, decimal> Parameters,
DateTime UpdatedAtUtc
);