using System.Collections.Generic;
using System.Text.Json.Serialization;
namespace FinlyticCore.Dtos.TechnicalAnalysis;
///
/// Individual take-profit tier in a staged scale-out exit plan.
///
public record TakeProfitStage(
[property: JsonPropertyName("stageNumber")] int StageNumber,
[property: JsonPropertyName("targetPrice")] decimal TargetPrice,
[property: JsonPropertyName("percentToClose")] decimal PercentToClose,
[property: JsonPropertyName("rMultiple")] decimal RMultiple,
[property: JsonPropertyName("description")] string Description
);
///
/// Break-even trigger rule for locking in free-rolls.
///
public record BreakEvenRule(
[property: JsonPropertyName("enabled")] bool Enabled,
[property: JsonPropertyName("triggerPrice")] decimal TriggerPrice,
[property: JsonPropertyName("offsetToCoverFees")] decimal OffsetToCoverFees
);
///
/// Trailing stop management rule for trend following.
///
public record TrailingStopRule(
[property: JsonPropertyName("type")] TrailingStopType Type,
[property: JsonPropertyName("multiplier")] decimal Multiplier,
[property: JsonPropertyName("activationPrice")] decimal ActivationPrice,
[property: JsonPropertyName("indicatorKey")] string IndicatorKey
);
///
/// Indicator or structural reversal condition that triggers an early trade exit.
///
public record ReversalCondition(
[property: JsonPropertyName("ruleDescription")] string RuleDescription,
[property: JsonPropertyName("indicatorTrigger")] string IndicatorTrigger
);
///
/// Composable, complete exit plan decoupling entry strategy logic from execution management.
///
public record ExitPlan(
[property: JsonPropertyName("strategyType")] ExitStrategyType StrategyType,
[property: JsonPropertyName("initialStopLoss")] decimal InitialStopLoss,
[property: JsonPropertyName("takeProfitStages")] List TakeProfitStages,
[property: JsonPropertyName("breakEvenRule")] BreakEvenRule? BreakEvenRule = null,
[property: JsonPropertyName("trailingStopRule")] TrailingStopRule? TrailingStopRule = null,
[property: JsonPropertyName("reversalCondition")] ReversalCondition? ReversalCondition = null,
[property: JsonPropertyName("maxHoldingBars")] int? MaxHoldingBars = null
);