Source code for lime_trader.models.accounts

from datetime import date, datetime, timedelta, timezone
import enum
from _decimal import Decimal
from functools import partial

from dataclasses import field, dataclass

from lime_trader.models.trading import TimeInForce, OrderType


[docs] class MarginType(enum.Enum): CASH = "cash" MARGIN_X1 = "marginx1" MARGIN_X2 = "marginx2" DAY_TRADER = "daytrader"
[docs] class RestrictionLevel(enum.Enum): NONE = "none" RESTRICTED = "restricted" DISABLED = "disabled" CLOSED = "closed"
[docs] class SecurityType(enum.Enum): COMMON_STOCK = "common_stock" PREFERRED_STOCK = "preferred_stock" OPTION = "option" STRATEGY = "strategy"
[docs] class TradeSide(enum.Enum): BUY = "buy" SELL = "sell"
[docs] class AccountFeedActionType(enum.Enum): SUBSCRIBE_BALANCE = "subscribeBalance" SUBSCRIBE_POSITIONS = "subscribePositions" SUBSCRIBE_ORDERS = "subscribeOrders" SUBSCRIBE_TRADES = "subscribeTrades" UNSUBSCRIBE_BALANCE = "unsubscribeBalance" UNSUBSCRIBE_POSITIONS = "unsubscribePositions" UNSUBSCRIBE_ORDERS = "unsubscribeOrders" UNSUBSCRIBE_TRADES = "unsubscribeTrades"
[docs] class AccountFeedType(enum.Enum): POSITION = "p" BALANCE = "b" ORDER = "o" TRADE = "t" ERROR = "e"
[docs] @dataclass(frozen=True) class AccountDetails: """Represents account details and balances Attributes: account_number: Account number trade_platform: Trading platform this account is traded on margin_type: Margin type restriction: Restriction level effective on the account daytrades_count: Day trades counter account_value_total: Total account liquidation value cash: Account debit balance when negative, credit balance when positive day_trading_buying_power: Day trading buying power for marginable securities margin_buying_power: Buying power for marginable securities non_margin_buying_power: Buying power for non-marginable securities position_market_value: Sum of all positions current market values. The value is negative for short positions unsettled_cash: Unsettled cash for cash accounts cash_to_withdraw: Cash available to withdraw from the account restriction_reason: Optional description explaining why the account is restricted """ account_number: str trade_platform: str margin_type: MarginType restriction: RestrictionLevel daytrades_count: int account_value_total: Decimal cash: Decimal day_trading_buying_power: Decimal margin_buying_power: Decimal non_margin_buying_power: Decimal position_market_value: Decimal unsettled_cash: Decimal cash_to_withdraw: Decimal restriction_reason: str | None = None
[docs] @dataclass(frozen=True) class Leg: """Represents leg in the multi-leg strategy Attributes: symbol: The leg security symbol quantity: Signed number of shares or option contracts for the leg average_open_price: The leg cost basis current_price: The leg current price security_type: The leg asset type """ symbol: str average_open_price: Decimal current_price: Decimal quantity: int security_type: SecurityType
[docs] @dataclass(frozen=True) class AccountPosition: """Represents single account position Attributes: symbol: Security symbol quantity: Signed number of shares or option contracts. Negative for short positions average_open_price: Average historical cost basis current_price: Current price security_type: Asset type legs: Legs of the multi-leg strategy """ symbol: str quantity: int average_open_price: Decimal current_price: Decimal security_type: SecurityType legs: list[Leg] | None = None
[docs] @dataclass(frozen=True) class AccountPositions: """List of account positions Attributes: account: Account number positions: Account positions """ account: str positions: list[AccountPosition]
[docs] @dataclass(frozen=True) class AccountTrade: """Represents single account trade Attributes: symbol: Security symbol timestamp: Timestamp of the trade quantity: Number of shares or option contracts, negative for sells, positive for buys price: Trade price amount: Trade amount, which is the quantity multiplied by the lot size and price side: Trade side trade_id: The trade id """ symbol: str timestamp: datetime quantity: int price: Decimal amount: Decimal side: TradeSide trade_id: str
[docs] @dataclass(frozen=True) class AccountTradesPage: """Page of account trades Attributes: trades: List of trades in page count: Total count of trades """ trades: list[AccountTrade] count: int
[docs] @dataclass(frozen=True) class Route: """Route available for account Attributes: exchange: Route name to use when placing order time_in_force: List of order duration instructions supported by a route order_type: List of order types supported by a route """ exchange: str time_in_force: list[TimeInForce] order_type: list[OrderType]
[docs] @dataclass(frozen=True) class TransactionCash: """Describes the cash side of the transaction Attributes: gross_amount: Dollar amount not including fees, can be positive or negative net_amount: Net dollar amount including fees charged for the transaction, can be positive or negative """ gross_amount: Decimal net_amount: Decimal
[docs] @dataclass(frozen=True) class TransactionAsset: """Describes the asset side of the transaction Attributes: symbol: Asset symbol symbol_description: Company name for stocks or human-readable name for options quantity: Transaction quantity, can be positive or negative price: Price for each unit """ symbol: str symbol_description: str quantity: int price: Decimal
[docs] @dataclass(frozen=True) class TransactionFee: """Represents transaction fee Attributes: name: Name of the fee. amount: Fee amount """ name: str amount: Decimal
[docs] @dataclass(frozen=True) class AccountTransaction: """Single account transaction Attributes: id: Internal transaction id, globally unique, and it is not necessarily sequentially incremented type: Transaction type description: Human-readable transaction description date: Date of transaction cash: Describes the cash side of the transaction fees: List of fees charged by the transaction asset: Structure describing the asset side of the transaction """ id: str type: str description: str date: date cash: TransactionCash fees: list[TransactionFee] asset: TransactionAsset | None = None
[docs] @dataclass(frozen=True) class AccountTransactionsPage: """Page of account transactions Attributes: transactions: List of transactions in page count: Total count of transactions """ transactions: list[AccountTransaction] count: int
[docs] @dataclass(frozen=True) class Token: """Represents access token Attributes: scope: The scopes this token grants access to token_type: Bearer means that access token should be put to the Authorization header of every web request access_token: Access token expires_in: Expiration lifetime in seconds date_created: Date when token was created. Used to determine expiry date """ scope: str token_type: str access_token: str expires_in: int date_created: datetime = field(default_factory=partial(datetime.now, tz=timezone.utc))
[docs] def expiry_date(self, tz: timezone = timezone.utc) -> datetime: """ Returns expiry date in a specific timezone Args: tz: Timezone in which to return expiry date. Default is UTC Returns: Datetime when token expires """ return self.date_created.astimezone(tz) + timedelta(seconds=self.expires_in)
[docs] def expires_in_delta(self) -> timedelta: """ Gets difference between expiry date and current date Returns: Difference between expiry date and current date """ return self.expiry_date() - datetime.now(tz=timezone.utc)
[docs] @dataclass(frozen=True) class Credentials: """Credentials used for API authentication Attributes: username: Username password: Password client_id: Client id issued to the service client_secret: Client secret issued to the service grant_type: OAuth authorization flow to use """ username: str password: str client_id: str client_secret: str grant_type: str
[docs] @dataclass(frozen=True) class AccountFeedAction: """Action that is sent to account feed websocket Attributes: action: Type of action account: Account number """ action: AccountFeedActionType account: str
[docs] @dataclass(frozen=True) class AccountFeedError: """Error during streaming account data Attributes: t: Type of account feed, always "e" code: Error code description: Error description """ t: AccountFeedType code: str description: str