Source code for finance_enums.trading

"""Trading-intent helpers built from the order/position enum families.

A :class:`TransactionIntent` bundles the canonical (side, position effect,
position type) tuple for the four basic equity transactions.
"""

from __future__ import annotations

from dataclasses import dataclass

from ._finance_enums import int_enums as _int_enums

__all__ = [
    "TransactionIntent",
    "transaction_intent",
    "transaction_intent_records",
]

Side = _int_enums.Side
PositionEffect = _int_enums.PositionEffect
PositionType = _int_enums.PositionType


[docs] @dataclass(frozen=True) class TransactionIntent: name: str side: Side position_effect: PositionEffect position_type: PositionType
_TRANSACTION_INTENT_RECORDS = ( TransactionIntent("open_long", Side.Buy, PositionEffect.Open, PositionType.Long), TransactionIntent("close_long", Side.Sell, PositionEffect.Close, PositionType.Long), TransactionIntent("open_short", Side.Sell, PositionEffect.Open, PositionType.Short), TransactionIntent("cover_short", Side.Buy, PositionEffect.Close, PositionType.Short), ) _TRANSACTION_INTENT_BY_NAME = {record.name: record for record in _TRANSACTION_INTENT_RECORDS} def _normalize_transaction_intent_name(value: str) -> str: return str(value).strip().lower().replace("-", "_").replace(" ", "_")
[docs] def transaction_intent_records() -> list[TransactionIntent]: return list(_TRANSACTION_INTENT_RECORDS)
[docs] def transaction_intent(intent: TransactionIntent | str) -> TransactionIntent: if isinstance(intent, TransactionIntent): return intent normalized = _normalize_transaction_intent_name(intent) try: return _TRANSACTION_INTENT_BY_NAME[normalized] except KeyError as exc: raise ValueError(f"unknown transaction intent: {intent!r}") from exc