/* * Copyright (c) 2004-2011 Marco Maccaferri and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Marco Maccaferri - initial API and implementation */ package org.eclipsetrader.internal.brokers.paper; import java.util.Date; import junit.framework.TestCase; import org.easymock.classextension.EasyMock; import org.eclipsetrader.core.feed.FeedIdentifier; import org.eclipsetrader.core.feed.Quote; import org.eclipsetrader.core.feed.Trade; import org.eclipsetrader.core.instruments.ISecurity; import org.eclipsetrader.core.instruments.Security; import org.eclipsetrader.core.markets.IMarketService; import org.eclipsetrader.core.markets.MarketPricingEnvironment; import org.eclipsetrader.core.repositories.IRepositoryService; import org.eclipsetrader.core.trading.IOrderMonitor; import org.eclipsetrader.core.trading.IOrderSide; import org.eclipsetrader.core.trading.IOrderStatus; import org.eclipsetrader.core.trading.IOrderType; import org.eclipsetrader.core.trading.ITransaction; import org.eclipsetrader.core.trading.Order; public class PaperBrokerTest extends TestCase { ISecurity security; MarketPricingEnvironment pricingEnvironment; IMarketService marketService; IRepositoryService repositoryService; /* (non-Javadoc) * @see junit.framework.TestCase#setUp() */ @Override protected void setUp() throws Exception { security = new Security("TEST", null); marketService = EasyMock.createNiceMock(IMarketService.class); repositoryService = EasyMock.createNiceMock(IRepositoryService.class); pricingEnvironment = EasyMock.createNiceMock(MarketPricingEnvironment.class); org.easymock.EasyMock.expect(pricingEnvironment.getQuote(security)).andStubReturn(new Quote(10.0, 11.0)); EasyMock.replay(marketService, repositoryService, pricingEnvironment); } public void testPrepareOrder() throws Exception { PaperBroker broker = new PaperBroker("test", "Test Broker", marketService, repositoryService); IOrderMonitor monitor = broker.prepareOrder(new Order(null, IOrderSide.Buy, new Security("Test", new FeedIdentifier("TEST", null)), 100L)); assertNull(monitor.getId()); assertEquals(IOrderStatus.New, monitor.getStatus()); } public void testSubmitPreparedOrder() throws Exception { PaperBroker broker = new PaperBroker("test", "Test Broker", marketService, repositoryService); IOrderMonitor monitor = broker.prepareOrder(new Order(null, IOrderSide.Buy, new Security("Test", new FeedIdentifier("TEST", null)), 100L)); monitor.submit(); assertNotNull(monitor.getId()); assertEquals(IOrderStatus.PendingNew, monitor.getStatus()); } public void testProcessMarketOrder() throws Exception { PaperBroker broker = new PaperBroker("test", "Test Broker", marketService, repositoryService); Security security = new Security("Test", new FeedIdentifier("TEST", null)); IOrderMonitor monitor = broker.prepareOrder(new Order(null, IOrderSide.Buy, security, 100L)); monitor.submit(); broker.processTrade(security, new Trade(new Date(), 10.0, 100L, null)); assertEquals(new Long(100), monitor.getFilledQuantity()); assertEquals(new Double(10.0), monitor.getAveragePrice()); assertEquals(IOrderStatus.Filled, monitor.getStatus()); } public void testProcessLimitOrder() throws Exception { PaperBroker broker = new PaperBroker("test", "Test Broker", marketService, repositoryService); Security security = new Security("Test", new FeedIdentifier("TEST", null)); IOrderMonitor monitor = broker.prepareOrder(new Order(null, IOrderType.Limit, IOrderSide.Buy, security, 100L, 10.0, null)); monitor.submit(); broker.processTrade(security, new Trade(new Date(), 11.0, 100L, null)); assertNull(monitor.getFilledQuantity()); assertNull(monitor.getAveragePrice()); assertEquals(IOrderStatus.PendingNew, monitor.getStatus()); broker.processTrade(security, new Trade(new Date(), 10.0, 100L, null)); assertEquals(new Long(100), monitor.getFilledQuantity()); assertEquals(new Double(10.0), monitor.getAveragePrice()); assertEquals(IOrderStatus.Filled, monitor.getStatus()); } public void testProcessPartialFill() throws Exception { PaperBroker broker = new PaperBroker("test", "Test Broker", marketService, repositoryService); Security security = new Security("Test", new FeedIdentifier("TEST", null)); IOrderMonitor monitor = broker.prepareOrder(new Order(null, IOrderSide.Buy, security, 100L)); monitor.submit(); broker.processTrade(security, new Trade(new Date(), 10.0, 50L, null)); assertEquals(new Long(50), monitor.getFilledQuantity()); assertEquals(new Double(10.0), monitor.getAveragePrice()); assertEquals(IOrderStatus.Partial, monitor.getStatus()); } public void testProcessTradeWithoutSize() throws Exception { PaperBroker broker = new PaperBroker("test", "Test Broker", marketService, repositoryService); Security security = new Security("Test", new FeedIdentifier("TEST", null)); IOrderMonitor monitor = broker.prepareOrder(new Order(null, IOrderSide.Buy, security, 100L)); monitor.submit(); broker.processTrade(security, new Trade(new Date(), 10.0, null, null)); assertEquals(new Long(100), monitor.getFilledQuantity()); assertEquals(new Double(10.0), monitor.getAveragePrice()); assertEquals(IOrderStatus.Filled, monitor.getStatus()); } public void testIgnoreTradeWithUnknownSecurity() throws Exception { PaperBroker broker = new PaperBroker("test", "Test Broker", marketService, repositoryService); Security security = new Security("Test", new FeedIdentifier("TEST", null)); IOrderMonitor monitor = broker.prepareOrder(new Order(null, IOrderSide.Buy, security, 100L)); monitor.submit(); broker.processTrade(new Security("Test2", new FeedIdentifier("TEST2", null)), new Trade(new Date(), 10.0, 100L, null)); assertNull(monitor.getFilledQuantity()); assertNull(monitor.getAveragePrice()); assertEquals(IOrderStatus.PendingNew, monitor.getStatus()); } public void testAveragePrice() throws Exception { PaperBroker broker = new PaperBroker("test", "Test Broker", marketService, repositoryService); Security security = new Security("Test", new FeedIdentifier("TEST", null)); IOrderMonitor monitor = broker.prepareOrder(new Order(null, IOrderSide.Buy, security, 100L)); monitor.submit(); broker.processTrade(security, new Trade(new Date(), 11.0, 50L, null)); broker.processTrade(security, new Trade(new Date(), 10.0, 150L, null)); assertEquals(new Long(100), monitor.getFilledQuantity()); assertEquals(new Double(10.5), monitor.getAveragePrice()); assertEquals(IOrderStatus.Filled, monitor.getStatus()); } public void testBuyAtBetterPrice() throws Exception { PaperBroker broker = new PaperBroker("test", "Test Broker", marketService, repositoryService); Security security = new Security("Test", new FeedIdentifier("TEST", null)); IOrderMonitor monitor = broker.prepareOrder(new Order(null, IOrderType.Limit, IOrderSide.Buy, security, 100L, 10.0, null)); monitor.submit(); broker.processTrade(security, new Trade(new Date(), 9.0, 200L, null)); assertEquals(new Long(100), monitor.getFilledQuantity()); assertEquals(new Double(9.0), monitor.getAveragePrice()); assertEquals(IOrderStatus.Filled, monitor.getStatus()); } public void testSellAtBetterPrice() throws Exception { PaperBroker broker = new PaperBroker("test", "Test Broker", marketService, repositoryService); Security security = new Security("Test", new FeedIdentifier("TEST", null)); IOrderMonitor monitor = broker.prepareOrder(new Order(null, IOrderType.Limit, IOrderSide.Sell, security, 100L, 10.0, null)); monitor.submit(); broker.processTrade(security, new Trade(new Date(), 11.0, 200L, null)); assertEquals(new Long(100), monitor.getFilledQuantity()); assertEquals(new Double(11.0), monitor.getAveragePrice()); assertEquals(IOrderStatus.Filled, monitor.getStatus()); } public void testAddBuyTransaction() throws Exception { PaperBroker broker = new PaperBroker("test", "Test Broker", marketService, repositoryService); Security security = new Security("Test", new FeedIdentifier("TEST", null)); IOrderMonitor monitor = broker.prepareOrder(new Order(null, IOrderSide.Buy, security, 100L)); monitor.submit(); broker.processTrade(security, new Trade(new Date(), 10.0, 100L, null)); ITransaction transaction = ((OrderMonitor) monitor).getTransactions()[0]; assertEquals(100 * 10.0, transaction.getAmount().getAmount()); } public void testAddSellTransaction() throws Exception { PaperBroker broker = new PaperBroker("test", "Test Broker", marketService, repositoryService); Security security = new Security("Test", new FeedIdentifier("TEST", null)); IOrderMonitor monitor = broker.prepareOrder(new Order(null, IOrderSide.Sell, security, 100L)); monitor.submit(); broker.processTrade(security, new Trade(new Date(), 10.0, 100L, null)); ITransaction transaction = ((OrderMonitor) monitor).getTransactions()[0]; assertEquals(-100 * 10.0, transaction.getAmount().getAmount()); } }