From dc5758c3311aabccd548ecafcb6ba928a624cc75 Mon Sep 17 00:00:00 2001 From: Faysal Aberkane Date: Fri, 24 Jan 2025 12:39:02 +0000 Subject: [PATCH] Fix realized pnl bug in Portfolio --- nautilus_core/portfolio/src/portfolio.rs | 2 +- nautilus_trader/portfolio/portfolio.pyx | 2 +- tests/unit_tests/portfolio/test_portfolio.py | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/nautilus_core/portfolio/src/portfolio.rs b/nautilus_core/portfolio/src/portfolio.rs index 8e61285c23ea..ffb36799f51a 100644 --- a/nautilus_core/portfolio/src/portfolio.rs +++ b/nautilus_core/portfolio/src/portfolio.rs @@ -1053,7 +1053,7 @@ impl Portfolio { continue; // Nothing to calculate } - if position.side == PositionSide::Flat { + if position.realized_pnl.is_none() { continue; // Nothing to calculate } diff --git a/nautilus_trader/portfolio/portfolio.pyx b/nautilus_trader/portfolio/portfolio.pyx index e3c5adc5bb9e..23d62932bb9f 100644 --- a/nautilus_trader/portfolio/portfolio.pyx +++ b/nautilus_trader/portfolio/portfolio.pyx @@ -1220,7 +1220,7 @@ cdef class Portfolio(PortfolioFacade): if position.instrument_id != instrument_id: continue # Nothing to calculate - if position.side == PositionSide.FLAT: + if position.realized_pnl is None: continue # Nothing to calculate pnl = position.realized_pnl.as_f64_c() diff --git a/tests/unit_tests/portfolio/test_portfolio.py b/tests/unit_tests/portfolio/test_portfolio.py index cd00d458ed61..8b9876785314 100644 --- a/tests/unit_tests/portfolio/test_portfolio.py +++ b/tests/unit_tests/portfolio/test_portfolio.py @@ -1282,11 +1282,11 @@ def test_closing_position_updates_portfolio(self): # Assert assert self.portfolio.net_exposures(SIM) == {} assert self.portfolio.unrealized_pnls(SIM) == {} - assert self.portfolio.realized_pnls(SIM) == {USD: Money(0, USD)} + assert self.portfolio.realized_pnls(SIM) == {USD: Money(6, USD)} assert self.portfolio.margins_maint(SIM) == {} assert self.portfolio.net_exposure(AUDUSD_SIM.id) == Money(0, USD) assert self.portfolio.unrealized_pnl(AUDUSD_SIM.id) == Money(0, USD) - assert self.portfolio.realized_pnl(AUDUSD_SIM.id) == Money(0, USD) + assert self.portfolio.realized_pnl(AUDUSD_SIM.id) == Money(6, USD) assert self.portfolio.net_position(AUDUSD_SIM.id) == Decimal(0) assert not self.portfolio.is_net_long(AUDUSD_SIM.id) assert not self.portfolio.is_net_short(AUDUSD_SIM.id) @@ -1421,7 +1421,7 @@ def test_several_positions_with_different_instruments_updates_portfolio(self): # Assert assert self.portfolio.unrealized_pnls(SIM) == {USD: Money(-38998.00, USD)} - assert self.portfolio.realized_pnls(SIM) == {USD: Money(-4.00, USD)} + assert self.portfolio.realized_pnls(SIM) == {USD: Money(92.00, USD)} assert self.portfolio.net_exposures(SIM) == {USD: Money(161002.00, USD)} assert self.portfolio.net_exposure(AUDUSD_SIM.id) == Money(161002.00, USD) assert self.portfolio.unrealized_pnl(AUDUSD_SIM.id) == Money(-38998.00, USD)