"""Portfolio domain models.""" from __future__ import annotations from dataclasses import dataclass, field from datetime import datetime from typing import Any, Protocol, runtime_checkable @dataclass class StrategySet: id: str strategy_name: str strategy_config: str created_at: datetime | None = None @dataclass class Portfolio: portfolio_id: str broker: str status: str symbol: str strategy_name: str strategy_params: dict[str, Any] = field(default_factory=dict) cash_balance: float = 0.0 asset_quantity: float = 0.0 price: float = 0.0 profit_buffer: float = 0.0 current_strategy_set_id: str | None = None created_at: datetime | None = None updated_at: datetime | None = None last_trade_at: datetime | None = None @dataclass class LedgerEntry: portfolio_id: str recorded_at: datetime action: str price: float quantity: float cash_balance_after: float asset_quantity_after: float total_value_after: float fee_amount: float = 0.0 tax_amount: float = 0.0 profit_buffer_after: float = 0.0 strategy_set_id: str = "legacy" note: str = "" @runtime_checkable class LiveAssetSource(Protocol): def get_asset_quantity(self, symbol: str) -> float: ...