using System; namespace NT8.Core.Execution { /// /// Execution metrics for a single order execution /// public class ExecutionMetrics { /// /// Order ID for the executed order /// public string OrderId { get; set; } /// /// Time when order intent was formed /// public DateTime IntentTime { get; set; } /// /// Time when order was submitted to market /// public DateTime SubmitTime { get; set; } /// /// Time when order was filled /// public DateTime FillTime { get; set; } /// /// Intended price when order was placed /// public decimal IntendedPrice { get; set; } /// /// Actual fill price /// public decimal FillPrice { get; set; } /// /// Price slippage (fill price - intended price) /// public decimal Slippage { get; set; } /// /// Type of slippage (positive/negative/zero) /// public SlippageType SlippageType { get; set; } /// /// Time between submit and fill /// public TimeSpan SubmitLatency { get; set; } /// /// Time between fill and intent /// public TimeSpan FillLatency { get; set; } /// /// Overall execution quality rating /// public ExecutionQuality Quality { get; set; } /// /// Constructor for ExecutionMetrics /// /// Order ID /// Intent formation time /// Submission time /// Fill time /// Intended price /// Actual fill price /// Price slippage /// Type of slippage /// Submission latency /// Fill latency /// Execution quality public ExecutionMetrics( string orderId, DateTime intentTime, DateTime submitTime, DateTime fillTime, decimal intendedPrice, decimal fillPrice, decimal slippage, SlippageType slippageType, TimeSpan submitLatency, TimeSpan fillLatency, ExecutionQuality quality) { if (string.IsNullOrEmpty(orderId)) throw new ArgumentNullException("orderId"); OrderId = orderId; IntentTime = intentTime; SubmitTime = submitTime; FillTime = fillTime; IntendedPrice = intendedPrice; FillPrice = fillPrice; Slippage = slippage; SlippageType = slippageType; SubmitLatency = submitLatency; FillLatency = fillLatency; Quality = quality; } } /// /// Information about price slippage /// public class SlippageInfo { /// /// Order ID associated with the slippage /// public string OrderId { get; set; } /// /// Intended price /// public decimal IntendedPrice { get; set; } /// /// Actual fill price /// public decimal ActualPrice { get; set; } /// /// Calculated slippage (actual - intended) /// public decimal Slippage { get; set; } /// /// Slippage expressed in ticks /// public int SlippageInTicks { get; set; } /// /// Percentage slippage relative to intended price /// public decimal SlippagePercentage { get; set; } /// /// Type of slippage (positive/negative/zero) /// public SlippageType Type { get; set; } /// /// Constructor for SlippageInfo /// /// Order ID /// Intended price /// Actual fill price /// Slippage in ticks /// Size of one tick public SlippageInfo( string orderId, decimal intendedPrice, decimal actualPrice, int slippageInTicks, decimal tickSize) { if (string.IsNullOrEmpty(orderId)) throw new ArgumentNullException("orderId"); if (tickSize <= 0) throw new ArgumentException("Tick size must be positive", "tickSize"); OrderId = orderId; IntendedPrice = intendedPrice; ActualPrice = actualPrice; Slippage = actualPrice - intendedPrice; SlippageInTicks = slippageInTicks; SlippagePercentage = tickSize > 0 ? (Slippage / IntendedPrice) * 100 : 0; Type = Slippage > 0 ? SlippageType.Positive : Slippage < 0 ? SlippageType.Negative : SlippageType.Zero; } } /// /// Timing information for execution /// public class ExecutionTiming { /// /// Time when order was created internally /// public DateTime CreateTime { get; set; } /// /// Time when order was submitted to market /// public DateTime SubmitTime { get; set; } /// /// Time when order was acknowledged by market /// public DateTime AckTime { get; set; } /// /// Time when order was filled /// public DateTime FillTime { get; set; } /// /// Latency from create to submit /// public TimeSpan CreateToSubmitLatency { get; set; } /// /// Latency from submit to acknowledge /// public TimeSpan SubmitToAckLatency { get; set; } /// /// Latency from acknowledge to fill /// public TimeSpan AckToFillLatency { get; set; } /// /// Total execution latency /// public TimeSpan TotalLatency { get; set; } /// /// Constructor for ExecutionTiming /// /// Creation time /// Submission time /// Acknowledgment time /// Fill time public ExecutionTiming( DateTime createTime, DateTime submitTime, DateTime ackTime, DateTime fillTime) { CreateTime = createTime; SubmitTime = submitTime; AckTime = ackTime; FillTime = fillTime; CreateToSubmitLatency = SubmitTime - CreateTime; SubmitToAckLatency = AckTime - SubmitTime; AckToFillLatency = FillTime - AckTime; TotalLatency = FillTime - CreateTime; } } /// /// Enum representing execution quality levels /// public enum ExecutionQuality { /// /// Excellent execution with minimal slippage /// Excellent = 0, /// /// Good execution with acceptable slippage /// Good = 1, /// /// Fair execution with moderate slippage /// Fair = 2, /// /// Poor execution with significant slippage /// Poor = 3 } /// /// Enum representing type of slippage /// public enum SlippageType { /// /// Positive slippage (better than expected) /// Positive = 0, /// /// Negative slippage (worse than expected) /// Negative = 1, /// /// No slippage (as expected) /// Zero = 2 } }