trading/shared/broker/base.py

87 lines
2.3 KiB
Python

"""Abstract base class for brokerage integrations.
All broker implementations must inherit from ``BaseBroker`` and provide
concrete implementations for order management, position tracking, and
account information retrieval. This abstraction layer allows the trading
bot to swap brokerages (Alpaca, Interactive Brokers, Tradier, ...) without
changing strategy or execution logic.
"""
from abc import ABC, abstractmethod
from shared.schemas.trading import AccountInfo, OrderRequest, OrderResult, PositionInfo
class BaseBroker(ABC):
"""Interface that every brokerage adapter must implement."""
@abstractmethod
async def submit_order(self, order: OrderRequest) -> OrderResult:
"""Submit a new order to the brokerage.
Parameters
----------
order:
The order details including ticker, side, quantity, and order type.
Returns
-------
OrderResult
Result containing the order ID, status, and fill information.
"""
...
@abstractmethod
async def cancel_order(self, order_id: str) -> bool:
"""Cancel an open order.
Parameters
----------
order_id:
The brokerage-assigned order identifier.
Returns
-------
bool
``True`` if the cancellation was accepted, ``False`` otherwise.
"""
...
@abstractmethod
async def get_positions(self) -> list[PositionInfo]:
"""Return all currently open positions.
Returns
-------
list[PositionInfo]
One entry per open position with quantity, average entry, current
price, and unrealized P&L.
"""
...
@abstractmethod
async def get_account(self) -> AccountInfo:
"""Return account-level summary information.
Returns
-------
AccountInfo
Equity, cash, buying power, and total portfolio value.
"""
...
@abstractmethod
async def get_order_status(self, order_id: str) -> OrderResult:
"""Fetch the current status of an existing order.
Parameters
----------
order_id:
The brokerage-assigned order identifier.
Returns
-------
OrderResult
Current state of the order including fill price if applicable.
"""
...