package fauxExchange; class LimitLimitRule implements Rule { /** Processes this rule to make a trade */ public Trade processRule (OrderBook ob, Order lastOrder) throws TradeClosedException { //System.out.println("Matching on the Limit-Limit Rule"); //System.out.print("=="); // ob.outputBook(null); lastOrder.print(null); java.util.Iterator orderIterator; Order matchedOrder; Trade aTrade = null; if (lastOrder instanceof SellOrder){ orderIterator = ob.getBuyOrders(); } else{ orderIterator = ob.getSellOrders(); } matchedOrder = (Order) orderIterator.next(); if ((lastOrder instanceof SellOrder && (matchedOrder.getPrice() >= lastOrder.getPrice()) ) || (lastOrder instanceof BuyOrder && (matchedOrder.getPrice() <= lastOrder.getPrice()) )){ 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; } }