in business-model/src/main/java/com/google/cloud/orderbook/Matcher.java [152:205]
private List<OrderBookEvent> match(Order o) {
if (!isActive) {
return Arrays.asList();
}
ArrayList<OrderBookEvent> matches = new ArrayList<>();
// Get the right iterator to match against
Iterator<Map.Entry<OrderKey, Order>> it;
if (o.getSide() == Side.BUY) {
it = askOrderList.entrySet().iterator();
} else {
it = bidOrderList.entrySet().iterator();
}
// Keep finding orders
while (o.getQuantityRemaining() > 0 && it.hasNext()) {
Map.Entry<OrderKey, Order> entry = it.next();
// Stop if the price doesn't match
if (o.getSide() == Side.BUY) {
if (o.getPrice() < entry.getKey().price) {
break;
}
} else {
if (o.getPrice() > entry.getKey().price) {
break;
}
}
// Calculate the fill amount
long fillQty = Math.min(o.getQuantityRemaining(),
entry.getValue().getQuantityRemaining());
// Reduce quantity on each order
entry.getValue().fillOrder(fillQty);
o.fillOrder(fillQty);
// Create an execution event (passive side only)
matches.add(buildEvent(Type.EXECUTED, entry.getValue())
.setQuantityFilled(fillQty)
.setMatchNumber(matchId)
.build());
matchId++;
// Remove order if fully matched
if (entry.getValue().getQuantityRemaining() == 0) {
it.remove();
}
}
return matches;
}