From c3f88ebf12f5bfcc51ccbe3c654e06ce671002c4 Mon Sep 17 00:00:00 2001 From: boris Date: Mon, 7 Sep 2026 06:26:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9=E9=BD=90=E6=8C=81=E4=BB=93=E6=9C=AA?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E7=9B=88=E4=BA=8F=E5=8F=A3=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/fidc-core/src/portfolio.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) 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);