对齐持仓未实现盈亏口径
This commit is contained in:
@@ -323,6 +323,13 @@ impl Position {
|
|||||||
.to_f64()
|
.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 {
|
pub fn pnl(&self) -> f64 {
|
||||||
self.realized_pnl.to_f64() + self.unrealized_pnl()
|
self.realized_pnl.to_f64() + self.unrealized_pnl()
|
||||||
}
|
}
|
||||||
@@ -1180,7 +1187,7 @@ impl PortfolioState {
|
|||||||
} else {
|
} else {
|
||||||
0.0
|
0.0
|
||||||
},
|
},
|
||||||
unrealized_pnl: position.unrealized_entry_pnl(),
|
unrealized_pnl: position.unrealized_average_price_pnl(),
|
||||||
realized_pnl: position.realized_entry_pnl(),
|
realized_pnl: position.realized_entry_pnl(),
|
||||||
pnl: position.entry_pnl(),
|
pnl: position.entry_pnl(),
|
||||||
trading_pnl: position.trading_pnl,
|
trading_pnl: position.trading_pnl,
|
||||||
@@ -1441,6 +1448,7 @@ mod tests {
|
|||||||
assert!((position.average_price - 7.5).abs() < 1e-12);
|
assert!((position.average_price - 7.5).abs() < 1e-12);
|
||||||
assert!((position.average_cost - 7.55).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.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!((realized + 405.0).abs() < 1e-12);
|
||||||
assert!((position.unrealized_pnl() - 95.0).abs() < 1e-12);
|
assert!((position.unrealized_pnl() - 95.0).abs() < 1e-12);
|
||||||
assert!((position.pnl() + 310.0).abs() < 1e-12);
|
assert!((position.pnl() + 310.0).abs() < 1e-12);
|
||||||
|
|||||||
Reference in New Issue
Block a user