diff --git a/crates/fidc-core/src/portfolio.rs b/crates/fidc-core/src/portfolio.rs index 5419e6f..e5a1659 100644 --- a/crates/fidc-core/src/portfolio.rs +++ b/crates/fidc-core/src/portfolio.rs @@ -323,6 +323,13 @@ impl Position { .to_f64() } + pub fn unrealized_average_price_pnl(&self) -> f64 { + if self.quantity == 0 || !self.average_price.is_finite() || self.average_price <= 0.0 { + return 0.0; + } + (self.last_price - self.average_price) * self.quantity as f64 + } + pub fn pnl(&self) -> f64 { self.realized_pnl.to_f64() + self.unrealized_pnl() } @@ -1180,7 +1187,7 @@ impl PortfolioState { } else { 0.0 }, - unrealized_pnl: position.unrealized_entry_pnl(), + unrealized_pnl: position.unrealized_average_price_pnl(), realized_pnl: position.realized_entry_pnl(), pnl: position.entry_pnl(), trading_pnl: position.trading_pnl, @@ -1441,6 +1448,7 @@ mod tests { assert!((position.average_price - 7.5).abs() < 1e-12); assert!((position.average_cost - 7.55).abs() < 1e-12); assert!((position.average_entry_price().unwrap() - 5.0).abs() < 1e-12); + assert!((position.unrealized_average_price_pnl() + 150.0).abs() < 1e-12); assert!((realized + 405.0).abs() < 1e-12); assert!((position.unrealized_pnl() - 95.0).abs() < 1e-12); assert!((position.pnl() + 310.0).abs() < 1e-12);