module Rex class Matcher def match(order_book) trades = [] highest_buy_order = order_book.highest_buy_order lowest_sell_order = order_book.lowest_sell_order return trades if highest_buy_order.nil? || lowest_sell_order.nil? while highest_buy_order.price >= lowest_sell_order.price max_quantity = [highest_buy_order.remaining_quantity, lowest_sell_order.remaining_quantity].min highest_buy_order.remaining_quantity -= max_quantity lowest_sell_order.remaining_quantity -= max_quantity trades << Trade.new( id: order_book.next_trade_id, buy_order: highest_buy_order, sell_order: lowest_sell_order, quantity: max_quantity, price: lowest_sell_order.price ) remove_if_filled(highest_buy_order, order_book) remove_if_filled(lowest_sell_order, order_book) # Go for the next run highest_buy_order = order_book.highest_buy_order lowest_sell_order = order_book.lowest_sell_order return trades if highest_buy_order.nil? || lowest_sell_order.nil? end trades end private def remove_if_filled(order, order_book) return unless order.filled? order_book.remove_order(order.id) end end end