diff --git a/README.md b/README.md index 4c48993..b016755 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ A Python library for interacting with the Schwab API, providing simple access to ## Prerequisites 1. You need to have a Schwab brokerage account. -2. Become an Individual Developer via the [Schwab Developer Portal](https://beta-developer.schwab.com/). +2. Become an Individual Developer via the [Schwab Developer Portal](https://developer.schwab.com/). 3. Create an individual developer app and wait until its status is "Ready for use". ## Installation diff --git a/pyschwab/trading.py b/pyschwab/trading.py index 06e6a5b..07f1408 100644 --- a/pyschwab/trading.py +++ b/pyschwab/trading.py @@ -233,7 +233,7 @@ def _convert_order(self, order: Dict[str, Any] | Order) -> Dict[str, Any]: raise ValueError("Order must be a dictionary or Order object.") return remove_none_values(order_dict) - def get_transactions(self, start_time: datetime=None, end_time: datetime=None, symbol: str=None, types: TransactionType=TransactionType.TRADE) -> List[Transaction]: + def get_transactions(self, start_time: datetime=None, end_time: datetime=None, symbol: str=None, types: TransactionType=None) -> List[Transaction]: account_hash = self._get_account_hash() now = datetime.now() start = time_to_str(start_time or now - timedelta(days=30)) diff --git a/pyschwab/trading_models.py b/pyschwab/trading_models.py index 7b22831..8c00768 100644 --- a/pyschwab/trading_models.py +++ b/pyschwab/trading_models.py @@ -4,7 +4,7 @@ from .types import ActivityType, AssetType, ComplexOrderStrategyType, ExecutionType, MarketSession, OptionActionType, \ OptionAssetType, OrderDuration, OrderInstruction, OrderStatus, OrderStrategyType, OrderType, \ - PositionEffect, QuantityType, RequestedDestination + PositionEffect, QuantityType, RequestedDestination, TransactionStatus, TransactionType from .utils import camel_to_snake, dataclass_to_dict, to_time @@ -43,13 +43,15 @@ class Deliverable: status: str symbol: str instrument_id: int - closing_price: float - type: str + closing_price: float = None + type: str = None + description: str = None @classmethod def from_dict(cls, data: Dict[str, Any]) -> 'Deliverable': if data is None: return None + converted_data = {camel_to_snake(key): value for key, value in data.items()} converted_data['asset_type'] = OptionAssetType.from_str(converted_data['asset_type']) return cls(**converted_data) @@ -217,6 +219,11 @@ class Balance: short_market_value: float = 0.0 buying_power_non_marginable_trade: float = 0.0 sma: float = 0.0 + cash_available_for_withdrawal: float = 0.0 + cash_debit_call_value: float = 0.0 + unsettled_cash: float = 0.0 + cash_call: float = 0.0 + long_non_marginable_market_value: float = 0.0 @classmethod def from_dict(cls, data: Dict[str, Any]): @@ -297,6 +304,7 @@ class OrderActivity: quantity: int order_remaining_quantity: int execution_legs: List[ExecutionLeg] + activity_id: int = None @classmethod def from_dict(cls, data: Dict[str, Any]) -> 'OrderActivity': @@ -438,8 +446,8 @@ def from_dict(cls, data: Dict[str, Any]) -> 'User': class Transaction: activity_id: int time: datetime - type: str - status: str + type: TransactionType + status: TransactionStatus net_amount: float account_number: str sub_account: str @@ -450,12 +458,14 @@ class Transaction: trade_date: datetime = None settlement_date: datetime = None description: str = None - activity_type: str = None + activity_type: ActivityType = None @classmethod def from_dict(cls, data: Dict[str, Any]) -> 'Transaction': converted_data = {camel_to_snake(key): value for key, value in data.items()} converted_data['user'] = User.from_dict(converted_data.get('user', None)) + converted_data['type'] = TransactionType.from_str(converted_data['type']) + converted_data['status'] = TransactionStatus.from_str(converted_data['status']) for dt_key in ['time', 'trade_date', 'settlement_date']: dt = converted_data.get(dt_key, None) if dt: diff --git a/pyschwab/types.py b/pyschwab/types.py index a35d478..94ea712 100644 --- a/pyschwab/types.py +++ b/pyschwab/types.py @@ -333,6 +333,13 @@ class RequestedDestination(AutoName): AUTO = auto() +class TransactionStatus(AutoName): + VALID = auto() + INVALID = auto() + PENDING = auto() + UNKNOWN = auto() + + class TransactionType(AutoName): TRADE = auto() RECEIVE_AND_DELIVER = auto() @@ -384,8 +391,11 @@ class OptionStrategy(AutoName): class ActivityType(AutoName): + ACTIVITY_CORRECTION = auto() EXECUTION = auto() ORDER_ACTION = auto() + TRANSFER = auto() + UNKNOWN = auto() class ExecutionType(AutoName):