package fauxExchange; class LimitMarketRule implements Rule { /** * This method processes the rule */ public Trade processRule(OrderBook ob, Order lastOrder) throws TradeClosedException { //System.out.println("Matching on the Limit-Market Rule"); // lastOrder.print(null); java.util.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; //initialize price to the lastOrder's price double price = lastOrder.getPrice(); int size = matchedOrder.getSize(); while(orderIterator.hasNext()){ tempOrder = (Order)orderIterator.next(); if(!tempOrder.isMarket()){ if ((lastOrder instanceof SellOrder && (tempOrder.getPrice() > lastOrder.getPrice())) || (lastOrder instanceof BuyOrder && (tempOrder.getPrice() < lastOrder.getPrice()))){ price = tempOrder.getPrice(); break; // leave the while loop } } }// end while 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 (lastOrder, matchedOrder, price, size); ob.setLastPrice(price); return aTrade; }// end ProcessRule /** * 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; } }//end MarketMarketRule