rex/lib/rex/matcher.rb
Tim Kächele 5862368498 Rename amount to quantity
More idiomatic naming for the order quantities.
2023-10-29 20:07:39 +01:00

43 lines
1.3 KiB
Ruby

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