diff --git a/src/order_matching/matching_engine.py b/src/order_matching/matching_engine.py index 32f1d11..f9104ae 100644 --- a/src/order_matching/matching_engine.py +++ b/src/order_matching/matching_engine.py @@ -46,7 +46,7 @@ def __init__(self, seed: int | None = None) -> None: self._faker = get_faker(seed=seed) self._queue = Orders() self.unprocessed_orders = OrderBook() - self._timestamp: datetime + self._timestamp: datetime | None = None def match(self, timestamp: datetime, orders: Orders | None = None) -> ExecutedTrades: """Match incoming orders in price-time priority. @@ -73,7 +73,9 @@ def match(self, timestamp: datetime, orders: Orders | None = None) -> ExecutedTr def _get_expired_orders(self) -> Orders: orders: list[Order] = list() - for timestamp in filter(lambda t: t <= self._timestamp, self.unprocessed_orders.orders_by_expiration.keys()): + assert self._timestamp is not None + current_timestamp = self._timestamp + for timestamp in filter(lambda t: t <= current_timestamp, self.unprocessed_orders.orders_by_expiration.keys()): orders.extend(self.unprocessed_orders.orders_by_expiration[timestamp]) for order in orders: order.status = Status.CANCEL @@ -116,6 +118,7 @@ def _execute_trades_for_one_price(self, incoming_order: Order, price: float) -> return ExecutedTrades(trades=trades) def _execute_trade(self, incoming_order: Order, book_order: Order) -> Trade: + assert self._timestamp is not None trade = Trade( side=incoming_order.side, price=book_order.price, diff --git a/src/order_matching/orders.py b/src/order_matching/orders.py index d37eb53..156b454 100644 --- a/src/order_matching/orders.py +++ b/src/order_matching/orders.py @@ -1,7 +1,7 @@ from __future__ import annotations from dataclasses import asdict -from typing import Generator, Iterator, Sequence, cast +from typing import Iterator, Sequence, cast import pandas as pd from pandera.typing.pandas import DataFrame @@ -102,8 +102,8 @@ def __eq__(self, other: object) -> bool: def __iter__(self) -> Iterator[Order]: return iter(self.orders) - def __next__(self) -> Generator[Order, None, None]: - yield next(self.__iter__()) + def __next__(self) -> Order: + return next(self.__iter__()) def __len__(self) -> int: return len(self.orders)