package com.activequant.trading.orderbook; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import com.activequant.domainmodel.exceptions.IncompleteOrderInstructions; import com.activequant.domainmodel.exceptions.UnsupportedOrderType; import com.activequant.domainmodel.orderbook.ChangeTypeEnum; import com.activequant.domainmodel.orderbook.MarketState; import com.activequant.domainmodel.orderbook.OrderBookChange; import com.activequant.domainmodel.orderbook.TransactionEvent; import com.activequant.domainmodel.streaming.BBOEvent; import com.activequant.domainmodel.trade.order.LimitOrder; import com.activequant.domainmodel.trade.order.OrderSide; import com.activequant.interfaces.trading.IOrderBookListener; import com.activequant.interfaces.trading.IOrderTracker; import com.activequant.trading.virtual.LimitOrderBook; import com.activequant.trading.virtual.VirtualExchange; import com.activequant.transport.memory.InMemoryTransportFactory; import com.activequant.utils.UniqueTimeStampGenerator; public class VirtualExchangeTest extends TestCase { /** * @return the suite of tests being tested */ public static Test suite() { return new TestSuite(VirtualExchangeTest.class); } OrderBookChange orderBookChange = null; TransactionEvent transactionEvent = null; MarketState marketState = null; public void testAddingAndSorting1() throws UnsupportedOrderType, IncompleteOrderInstructions { // orderBookChange = null; transactionEvent = null; marketState = null; // VirtualExchange ve = new VirtualExchange(new InMemoryTransportFactory()); LimitOrder lo = new LimitOrder(); lo.setOrderSide(OrderSide.BUY); lo.setLimitPrice(100.0); lo.setQuantity(100.0); lo.setTradInstId("TESTINST"); IOrderTracker iot = ve.prepareOrder(lo); iot.submit(); String tradInstId = "TESTINST"; LimitOrderBook lob = ve.getOrderBook(tradInstId); IOrderBookListener iobl = new IOrderBookListener() { @Override public void transactionEvent(TransactionEvent te) { transactionEvent = te; } @Override public void orderBookChange(OrderBookChange obc) { orderBookChange = obc; } @Override public void marketStateChange(MarketState newState) { marketState = newState; } }; lob.attachOrderBookListener(iobl); UniqueTimeStampGenerator gen = new UniqueTimeStampGenerator(); BBOEvent n = new BBOEvent(tradInstId, tradInstId, gen.now(), 99.0, 100.0, 101.0, 100.0); ve.processStreamEvent(n); // // assertEquals(2, lob.buySide().size()); assertEquals(1, lob.sellSide().size()); // assertEquals(100.0, lob.buySide().get(0).getLimitPrice()); assertEquals(100.0, lob.buySide().get(0).getQuantity()); assertEquals(101.0, lob.sellSide().get(0).getLimitPrice()); assertEquals(100.0, lob.sellSide().get(0).getQuantity()); n = new BBOEvent(tradInstId, tradInstId, gen.now(), 99.0, 100.0, 100.0, 100.0); ve.processStreamEvent(n); assertEquals(1, lob.buySide().size()); assertEquals(0, lob.sellSide().size()); assertNotNull(orderBookChange); assertEquals(ChangeTypeEnum.UPDATED, orderBookChange.getChangeType()); // assertEquals(99.0, lob.buySide().get(0).getLimitPrice()); assertEquals(100.0, lob.buySide().get(0).getQuantity()); // run the matcher. } public void testPositionKeeping(){ // VirtualExchange ve = new VirtualExchange(new InMemoryTransportFactory()); ve.updatePortfolio("A", 100.0, 100.0, OrderSide.BUY.getSide()); assertEquals(100.0, ve.getClientPortfolio().getPosition("A")); assertEquals(100.0, ve.getClientPortfolio().getOpenPrice("A")); ve.updatePortfolio("A", 100.0, 100.0, OrderSide.SELL.getSide()); assertEquals(0.0, ve.getClientPortfolio().getPosition("A")); assertEquals(0.0, ve.getClientPortfolio().getOpenPrice("A")); ve.updatePortfolio("A", 100.0, 100.0, OrderSide.BUY.getSide()); assertEquals(100.0, ve.getClientPortfolio().getPosition("A")); assertEquals(100.0, ve.getClientPortfolio().getOpenPrice("A")); ve.updatePortfolio("A", 100.0, 100.0, OrderSide.BUY.getSide()); assertEquals(200.0, ve.getClientPortfolio().getPosition("A")); assertEquals(100.0, ve.getClientPortfolio().getOpenPrice("A")); ve.updatePortfolio("A", 200.0, 200.0, OrderSide.BUY.getSide()); assertEquals(400.0, ve.getClientPortfolio().getPosition("A")); assertEquals(150.0, ve.getClientPortfolio().getOpenPrice("A")); // now we have 400 at an every price of 150. let's sell 200 at 100. // we should have 200 at an average price of 150. ve.updatePortfolio("A", 150.0, 200.0, OrderSide.SELL.getSide()); assertEquals(200.0, ve.getClientPortfolio().getPosition("A")); assertEquals(150.0, ve.getClientPortfolio().getOpenPrice("A")); // now let's cross the side. // now we have 400 at an every price of 150. let's sell 200 at 100. // we should have 200 at an average price of 150. ve.updatePortfolio("A", 100.0, 400.0, OrderSide.SELL.getSide()); assertEquals(-200.0, ve.getClientPortfolio().getPosition("A")); assertEquals(100.0, ve.getClientPortfolio().getOpenPrice("A")); ve.updatePortfolio("A", 100.0, 200.0, OrderSide.SELL.getSide()); assertEquals(-400.0, ve.getClientPortfolio().getPosition("A")); assertEquals(100.0, ve.getClientPortfolio().getOpenPrice("A")); ve.updatePortfolio("A", 200.0, 400.0, OrderSide.SELL.getSide()); assertEquals(-800.0, ve.getClientPortfolio().getPosition("A")); assertEquals(150.0, ve.getClientPortfolio().getOpenPrice("A")); ve.updatePortfolio("A", 100.0, 800.0, OrderSide.BUY.getSide()); assertEquals(0.0, ve.getClientPortfolio().getPosition("A")); assertEquals(0.0, ve.getClientPortfolio().getOpenPrice("A")); } }