package fauxExchange; import java.util.Iterator; class MarketMarketRule implements Rule { public Trade processRule(OrderBook ob, Order lastOrder) throws TradeClosedException { //System.out.println("Matching on the Market-Market Rule"); // lastOrder.print(null); Iterator orderIterator = null; Order tempOrder = null, matchedOrder = null; Trade aTrade = null; if (lastOrder instanceof SellOrder){ orderIterator = ob.getBuyOrders(); } else{ orderIterator = ob.getSellOrders(); } matchedOrder = (Order)orderIterator.next(); tempOrder = matchedOrder; int size = matchedOrder.getSize(); double price = ob.getLastPrice(); while(orderIterator.hasNext()){ tempOrder = (Order)orderIterator.next(); if(!tempOrder.isMarket()){ if ((lastOrder instanceof SellOrder && tempOrder.getPrice() > ob.getLastPrice()) || (lastOrder instanceof BuyOrder && tempOrder.getPrice() < ob.getLastPrice())){ price = tempOrder.getPrice(); break; } } }// end while if (matchedOrder.getSize() > lastOrder.getSize()){ size = lastOrder.getSize(); } aTrade = new Trade(lastOrder, matchedOrder, price, size); lastOrder.setSize(lastOrder.getSize() - size); matchedOrder.setSize(matchedOrder.getSize() - size); if (lastOrder.getSize() == 0) ob.deleteOrder(lastOrder); if (matchedOrder.getSize() == 0) ob.deleteOrder(matchedOrder); ob.setLastPrice(price); return aTrade; }// end ProcessRule /** * This method checks to see if a certain OrderBook-Order situation 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; } }//end MarketMarketRule