/*
* 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.core.ats.simulation;
import java.util.Currency;
import junit.framework.TestCase;
import org.easymock.EasyMock;
import org.eclipsetrader.core.instruments.ISecurity;
import org.eclipsetrader.core.instruments.Stock;
import org.eclipsetrader.core.trading.IOrderSide;
import org.eclipsetrader.core.trading.IOrderType;
import org.eclipsetrader.core.trading.IPositionListener;
import org.eclipsetrader.core.trading.Order;
import org.eclipsetrader.core.trading.PositionEvent;
public class AccountTest extends TestCase {
ISecurity security;
/* (non-Javadoc)
* @see junit.framework.TestCase#setUp()
*/
@Override
protected void setUp() throws Exception {
security = new Stock("TEST", null, Currency.getInstance("EUR"));
}
public void testAddTradeTransactionWithoutExpenseScheme() throws Exception {
Order order = new Order(null, IOrderType.Market, IOrderSide.Buy, security, 1000L, 1.5);
OrderMonitor monitor = new OrderMonitor(null, order);
monitor.setFilledQuantity(1000L);
monitor.setAveragePrice(1.5);
monitor.setTransaction(new Transaction(monitor, null));
Account account = new Account();
account.processCompletedOrder(monitor);
assertEquals(1, account.getTransactions().length);
assertEquals(1500.0, account.getTransactions()[0].getAmount().getAmount());
}
public void testAddPositionToPortfolio() throws Exception {
Order order = new Order(null, IOrderType.Market, IOrderSide.Buy, security, 1000L, 1.5);
OrderMonitor monitor = new OrderMonitor(null, order);
monitor.setFilledQuantity(1000L);
monitor.setAveragePrice(1.5);
monitor.setTransaction(new Transaction(monitor, null));
Account account = new Account();
account.processCompletedOrder(monitor);
assertEquals(1, account.getPositions().length);
assertEquals(new Long(1000), account.getPositions()[0].getQuantity());
assertEquals(1.5, account.getPositions()[0].getPrice());
}
public void testNotifyPositionOpened() throws Exception {
Order order = new Order(null, IOrderType.Market, IOrderSide.Buy, security, 1000L, 1.5);
OrderMonitor monitor = new OrderMonitor(null, order);
monitor.setFilledQuantity(1000L);
monitor.setAveragePrice(1.5);
monitor.setTransaction(new Transaction(monitor, null));
IPositionListener listener = EasyMock.createMock(IPositionListener.class);
listener.positionOpened(EasyMock.isA(PositionEvent.class));
EasyMock.replay(listener);
Account account = new Account();
account.addPositionListener(listener);
account.processCompletedOrder(monitor);
EasyMock.verify(listener);
}
public void testClosePosition() throws Exception {
OrderMonitor monitor = new OrderMonitor(null, new Order(null, IOrderType.Market, IOrderSide.Buy, security, 1000L, 1.5));
monitor.setFilledQuantity(1000L);
monitor.setAveragePrice(1.5);
Account account = new Account();
account.processCompletedOrder(monitor);
OrderMonitor monitor2 = new OrderMonitor(null, new Order(null, IOrderType.Market, IOrderSide.Sell, security, 1000L, 1.5));
monitor2.setFilledQuantity(1000L);
monitor2.setAveragePrice(1.5);
account.processCompletedOrder(monitor2);
assertEquals(0, account.getPositions().length);
}
public void testNotifyPositionClosed() throws Exception {
OrderMonitor monitor = new OrderMonitor(null, new Order(null, IOrderType.Market, IOrderSide.Buy, security, 1000L, 1.5));
monitor.setFilledQuantity(1000L);
monitor.setAveragePrice(1.5);
Account account = new Account();
account.processCompletedOrder(monitor);
OrderMonitor monitor2 = new OrderMonitor(null, new Order(null, IOrderType.Market, IOrderSide.Sell, security, 1000L, 1.5));
monitor2.setFilledQuantity(1000L);
monitor2.setAveragePrice(1.5);
IPositionListener listener = EasyMock.createMock(IPositionListener.class);
listener.positionClosed(EasyMock.isA(PositionEvent.class));
EasyMock.replay(listener);
account.addPositionListener(listener);
account.processCompletedOrder(monitor2);
EasyMock.verify(listener);
}
public void testAddShortPositionToPortfolio() throws Exception {
Order order = new Order(null, IOrderType.Market, IOrderSide.Sell, security, 1000L, 1.5);
OrderMonitor monitor = new OrderMonitor(null, order);
monitor.setFilledQuantity(1000L);
monitor.setAveragePrice(1.5);
monitor.setTransaction(new Transaction(monitor, null));
Account account = new Account();
account.processCompletedOrder(monitor);
assertEquals(1, account.getPositions().length);
assertEquals(new Long(-1000), account.getPositions()[0].getQuantity());
assertEquals(1.5, account.getPositions()[0].getPrice());
}
public void testAddToExistingPosition() throws Exception {
Order order1 = new Order(null, IOrderType.Market, IOrderSide.Buy, security, 1000L, 1.5);
OrderMonitor monitor1 = new OrderMonitor(null, order1);
monitor1.setFilledQuantity(1000L);
monitor1.setAveragePrice(1.5);
monitor1.setTransaction(new Transaction(monitor1, null));
Order order2 = new Order(null, IOrderType.Market, IOrderSide.Buy, security, 1000L, 1.7);
OrderMonitor monitor2 = new OrderMonitor(null, order2);
monitor2.setFilledQuantity(1000L);
monitor2.setAveragePrice(1.7);
monitor2.setTransaction(new Transaction(monitor2, null));
Account account = new Account();
account.processCompletedOrder(monitor1);
account.processCompletedOrder(monitor2);
assertEquals(1, account.getPositions().length);
assertEquals(new Long(2000), account.getPositions()[0].getQuantity());
assertEquals(1.6, account.getPositions()[0].getPrice());
}
}