investfly.models.portfolio.OptionPositionGroup

SDK model for a multi-leg option position group as exposed to user strategy code.

@dataclass
class OptionContractSnapshot:

Per-leg view derived from a live open position matched to a persisted group leg.

Java persists only grouping keys. Price, quantity, contract unit, expiry, and option-right fields come from the currently-open broker/paper position and option symbol parsing.

OptionContractSnapshot( role: investfly.models.portfolio.OptionLegRole, actionAtOpen: investfly.models.portfolio.OptionLegAction, securityType: investfly.models.marketdata.SecurityType = OPTION, symbol: Optional[str] = None, quantity: Optional[float] = None, priceAtOpen: Optional[float] = None, contractUnits: Optional[int] = None, occSymbol: Optional[str] = None, underlyingSymbol: Optional[str] = None, optionType: Optional[investfly.models.marketdata.OptionType] = None, strikePrice: Optional[float] = None, expiry: Optional[datetime.date] = None, contracts: Optional[int] = None, openedAt: Optional[datetime.datetime] = None)
symbol: Optional[str] = None
quantity: Optional[float] = None
priceAtOpen: Optional[float] = None
contractUnits: Optional[int] = None
occSymbol: Optional[str] = None
underlyingSymbol: Optional[str] = None
optionType: Optional[investfly.models.marketdata.OptionType] = None
strikePrice: Optional[float] = None
expiry: Optional[datetime.date] = None
contracts: Optional[int] = None
openedAt: Optional[datetime.datetime] = None
@staticmethod
def fromDict( d: Dict[str, Any]) -> OptionContractSnapshot:
@dataclass
class OptionPositionGroup:

Group-level view used by strategy code (live + backtest).

Exit decisions (closeBeforeDte, profit/loss-based exits) are evaluated per-group rather than per-leg. The runtime fills legs from Java's reconciled open-position-group endpoint, not raw overlay table rows. Legs may include the underlying stock/ETF for buy-write structures that were opened atomically.

OptionPositionGroup( groupId: int, template: investfly.models.portfolio.OptionStrategyTemplate, underlyingSymbol: str, contracts: Optional[int], netCreditAtOpen: Optional[float], openedAt: datetime.datetime, legs: List[OptionContractSnapshot] = <factory>)
groupId: int
underlyingSymbol: str
contracts: Optional[int]
netCreditAtOpen: Optional[float]
openedAt: datetime.datetime
def daysToEarliestExpiry(self, asOf: Optional[datetime.date] = None) -> Optional[int]:
@staticmethod
def fromDict( d: Dict[str, Any]) -> OptionPositionGroup: