package fauxExchange; import java.util.Iterator; class MarketLimitRule implements Rule { /** * Processes a rule in the attempt to find a trade */ public Trade processRule (OrderBook ob, Order lastOrder) throws TradeClosedException { //System.out.println("Matching on the Market-Limit Rule"); // lastOrder.print(null); Iterator orderIterator; Order matchedOrder; Trade aTrade; if (lastOrder instanceof SellOrder){ orderIterator = ob.getBuyOrders(); } else{ orderIterator = ob.getSellOrders(); } matchedOrder = (Order) orderIterator.next(); int size = matchedOrder.getSize(); double price = matchedOrder.getPrice(); if (matchedOrder.getSize() > lastOrder.getSize()){ size = lastOrder.getSize(); } matchedOrder.setSize(matchedOrder.getSize() - size); lastOrder.setSize(lastOrder.getSize() - size); if (matchedOrder.getSize() == 0) ob.deleteOrder(matchedOrder); if (lastOrder.getSize() == 0) ob.deleteOrder(lastOrder); aTrade = new Trade(matchedOrder, lastOrder, price, size); //System.out.print("POTENTIAL:"); // aTrade.print(null); ob.setLastPrice(price); return aTrade; } /** * This method checks whether a given order book condition applies * to this rule */ public boolean fitsCriteria (OrderBook ob, Order o){ boolean result = false; if (o.isMarket()){ java.util.Iterator iter = null; if (o instanceof BuyOrder){ iter = ob.getSellOrders(); }else if (o instanceof SellOrder){ iter = ob.getBuyOrders(); }else{ throw new IllegalArgumentException(); } if (iter.hasNext()){ Order tmp = (Order)iter.next(); if (!tmp.isMarket()){ result = true; } }else{ result = false; } } return result; } }