From 8d1eaafebb5f78be1549e66db8b1236de5ca6441 Mon Sep 17 00:00:00 2001 From: Thigazhezhilan J Date: Tue, 7 Apr 2026 09:51:52 +0530 Subject: [PATCH] Exclude sold positions from portfolio value --- backend/app/routers/broker.py | 9 +++++++-- backend/app/services/groww_service.py | 16 ++++++++++++++-- backend/app/services/zerodha_service.py | 4 ++-- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/backend/app/routers/broker.py b/backend/app/routers/broker.py index a077b38..4adc7f5 100644 --- a/backend/app/routers/broker.py +++ b/backend/app/routers/broker.py @@ -211,10 +211,15 @@ def _normalize_enrich_groww_item(access_token: str, item: dict, normalizer) -> d default=0.0, ) normalized["close_price"] = normalized["last_price"] - normalized["holding_value"] = normalized.get("effective_quantity", 0) * normalized["last_price"] + exposure_quantity = _first_number( + normalized.get("net_quantity"), + normalized.get("effective_quantity"), + default=0.0, + ) + normalized["holding_value"] = max(exposure_quantity, 0.0) * normalized["last_price"] normalized["display_pnl"] = _first_number( normalized.get("display_pnl"), - normalized.get("effective_quantity", 0) + exposure_quantity * (normalized["last_price"] - normalized.get("average_price", 0)), default=0.0, ) diff --git a/backend/app/services/groww_service.py b/backend/app/services/groww_service.py index a556c3b..d361651 100644 --- a/backend/app/services/groww_service.py +++ b/backend/app/services/groww_service.py @@ -362,10 +362,22 @@ def normalize_holding(item: dict | None) -> dict: def normalize_position(item: dict | None) -> dict: entry = normalize_holding(item) - quantity = abs(_first_float(entry.get("effective_quantity"), entry.get("quantity"), default=0.0)) + signed_quantity = _first_float( + entry.get("net_quantity"), + entry.get("effective_quantity"), + entry.get("quantity"), + default=0.0, + ) + quantity = abs(signed_quantity) entry["settled_quantity"] = quantity entry["effective_quantity"] = quantity entry["quantity"] = quantity - entry["holding_value"] = quantity * _first_float(entry.get("last_price"), default=0.0) + entry["net_quantity"] = signed_quantity + entry["display_pnl"] = _first_float( + entry.get("display_pnl"), + default=signed_quantity + * (_first_float(entry.get("last_price"), default=0.0) - _first_float(entry.get("average_price"), default=0.0)), + ) + entry["holding_value"] = max(signed_quantity, 0.0) * _first_float(entry.get("last_price"), default=0.0) entry["product"] = _first_text(entry.get("product"), entry.get("product_type"), default="CNC").upper() return entry diff --git a/backend/app/services/zerodha_service.py b/backend/app/services/zerodha_service.py index 990115b..ecb87dc 100644 --- a/backend/app/services/zerodha_service.py +++ b/backend/app/services/zerodha_service.py @@ -310,7 +310,7 @@ def normalize_position(item: dict | None) -> dict: quantity = abs(signed_quantity) average_price = position_average_price(entry) last_price = position_last_price(entry) - pnl = _first_float(entry.get("pnl"), default=quantity * (last_price - average_price)) + pnl = _first_float(entry.get("pnl"), default=signed_quantity * (last_price - average_price)) entry["settled_quantity"] = quantity entry["t1_quantity"] = 0.0 entry["effective_quantity"] = quantity @@ -320,7 +320,7 @@ def normalize_position(item: dict | None) -> dict: entry["last_price"] = last_price entry["close_price"] = last_price entry["display_pnl"] = pnl - entry["holding_value"] = quantity * last_price + entry["holding_value"] = max(signed_quantity, 0.0) * last_price return entry