Example #1
0
    def insert_buy(self, quantity, price):
        """
            Insert buy order in the order book and execute orders if it's possible.
        :param quantity: int
            The amount to buy
        :param price: double
            The unit price to buy
        :return: None
        """

        buy_order = Order(quantity, price, type_of_order='buy')

        if quantity != 0:
            self._buy_orders.append(buy_order)
            self._buy_orders.sort()
            self._buy_orders.reverse()
            print('--- Insert {order} on {book}'.format(
                order=buy_order.__str__(), book=self._name))

        while len(self._sell_orders) != 0 and self._sell_orders[0].get_price(
        ) <= buy_order.get_price() and buy_order.get_qty() > 0:

            # Case quantity sell order > first buy order in our book
            if buy_order.get_qty() > self._sell_orders[0].get_qty():
                deal = Deal(self._sell_orders[0].get_qty(),
                            self._sell_orders[0].get_price(), self._name)
                self._execute_deals.append(deal)

                new_qty = buy_order.get_qty() - self._sell_orders[0].get_qty()

                # Fill the first buy order
                self._sell_orders.remove(self._sell_orders[0])

                buy_order.set_qty(new_qty)
                print(deal.__str__())

            # Case quantity sell order < first buy order in our book
            else:
                deal = Deal(buy_order.get_qty(),
                            self._sell_orders[0].get_price(), self._name)
                self._execute_deals.append(deal)

                # Update of the new quantity
                self._sell_orders[0].set_qty(self._sell_orders[0].get_qty() -
                                             buy_order.get_qty())

                buy_order.set_qty(0)

                self._buy_orders.remove(self._buy_orders[0])

                if self._sell_orders[0].get_qty() == 0:
                    self._sell_orders.remove(self._sell_orders[0])

                print(deal.__str__())

        print(self.get_status())

        return None