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
}
}