Skip to content

orderbook module

OrderBook

Class representing an order book in a securities exchange.

Attributes:

Name Type Description
Bid BookSide

The buy side of the order book.

Ask BookSide

The sell side of the order book.

Methods

process_order: Processes an incoming order, matching and filling as needed.

Source code in securities_exchange/orderbook.py
class OrderBook:

    """
    Class representing an order book in a securities exchange.

    Attributes:
        Bid (BookSide): The buy side of the order book.
        Ask (BookSide): The sell side of the order book.

    Methods:
        process_order: Processes an incoming order, matching and filling as needed.

    """

    def __init__(self, allow_market_queue: bool = False):
        """
        Initialize an OrderBook instance.

        Args:
            allow_market_queue (bool): Flag indicating whether market orders can be queued.
        """
        # Create instances of BookSide for buy (Bid) and sell (Ask) sides
        self.Bid = BookSide(allow_market_queue = allow_market_queue)
        self.Ask = BookSide(side = MarketSide.SELL, allow_market_queue = allow_market_queue)

    def process_order(self, order: Order, orders: OrderedDict[str, Order]):

        """
        Process an incoming order, matching and filling as needed.

        Args:
            order (Order): The incoming order to be processed.
            orders (OrderedDict): Dictionary containing all existing orders.
        """

        # Determine the sides for matching and adding based on the order's side
        if (order.side == MarketSide.BUY):
            side_for_match = self.Ask
            side_to_add = self.Bid
        else:
            side_for_match = self.Bid
            side_to_add = self.Ask

        if order.type == OrderType.MARKET:

            # Continue processing the order until it is fully filled or cannot be matched
            while (order.status != OrderStatus.FILLED and side_for_match.liquid()):
                side_for_match.match(order, orders)

        else:

            # Continue processing the order until it is fully filled or cannot be matched
            while (order.status != OrderStatus.FILLED and \
                   ((side_for_match.liquid() and side_for_match.is_be(order.price)) or (side_for_match.has_market()))):
                side_for_match.match(order, orders)

       # If the order is still not fully filled, add it to the appropriate side of the order book
        if (order.status != OrderStatus.FILLED):
            side_to_add.add(order)

__init__(self, allow_market_queue=False) special

Initialize an OrderBook instance.

Parameters:

Name Type Description Default
allow_market_queue bool

Flag indicating whether market orders can be queued.

False
Source code in securities_exchange/orderbook.py
def __init__(self, allow_market_queue: bool = False):
    """
    Initialize an OrderBook instance.

    Args:
        allow_market_queue (bool): Flag indicating whether market orders can be queued.
    """
    # Create instances of BookSide for buy (Bid) and sell (Ask) sides
    self.Bid = BookSide(allow_market_queue = allow_market_queue)
    self.Ask = BookSide(side = MarketSide.SELL, allow_market_queue = allow_market_queue)

process_order(self, order, orders)

Process an incoming order, matching and filling as needed.

Parameters:

Name Type Description Default
order Order

The incoming order to be processed.

required
orders OrderedDict

Dictionary containing all existing orders.

required
Source code in securities_exchange/orderbook.py
def process_order(self, order: Order, orders: OrderedDict[str, Order]):

    """
    Process an incoming order, matching and filling as needed.

    Args:
        order (Order): The incoming order to be processed.
        orders (OrderedDict): Dictionary containing all existing orders.
    """

    # Determine the sides for matching and adding based on the order's side
    if (order.side == MarketSide.BUY):
        side_for_match = self.Ask
        side_to_add = self.Bid
    else:
        side_for_match = self.Bid
        side_to_add = self.Ask

    if order.type == OrderType.MARKET:

        # Continue processing the order until it is fully filled or cannot be matched
        while (order.status != OrderStatus.FILLED and side_for_match.liquid()):
            side_for_match.match(order, orders)

    else:

        # Continue processing the order until it is fully filled or cannot be matched
        while (order.status != OrderStatus.FILLED and \
               ((side_for_match.liquid() and side_for_match.is_be(order.price)) or (side_for_match.has_market()))):
            side_for_match.match(order, orders)

   # If the order is still not fully filled, add it to the appropriate side of the order book
    if (order.status != OrderStatus.FILLED):
        side_to_add.add(order)