/* * 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.Currency; import java.util.Locale; import junit.framework.TestCase; import org.eclipsetrader.core.trading.IOrderSide; import org.eclipsetrader.core.trading.IOrderType; import org.eclipsetrader.core.trading.Order; import org.eclipsetrader.internal.brokers.paper.schemes.SimpleFixedScheme; import org.eclipsetrader.internal.brokers.paper.transactions.StockTransaction; public class AccountTest extends TestCase { public void testAddTradeTransactionWithoutExpenseScheme() throws Exception { Order order = new Order(null, IOrderType.Market, IOrderSide.Buy, null, 1000L, 1.5); OrderMonitor monitor = new OrderMonitor(null, order); monitor.setFilledQuantity(1000L); monitor.setAveragePrice(1.5); monitor.addTransaction(new StockTransaction(null, 1000L, 1.5)); Account account = new Account(); account.processCompletedOrder(monitor); assertEquals(1, account.getTransactions().length); assertEquals(1500.0, account.getTransactions()[0].getAmount().getAmount()); } public void testAddBuyTransactionWithExpenseScheme() throws Exception { Order order = new Order(null, IOrderType.Market, IOrderSide.Buy, null, 1000L, 1.5); OrderMonitor monitor = new OrderMonitor(null, order); monitor.setFilledQuantity(1000L); monitor.setAveragePrice(1.5); monitor.addTransaction(new StockTransaction(null, 1000L, 1.5)); Account account = new Account(); account.setExpenseScheme(new SimpleFixedScheme()); account.processCompletedOrder(monitor); assertEquals(1, account.getTransactions().length); assertEquals(1509.95, account.getTransactions()[0].getAmount().getAmount()); } public void testAddSellTransactionWithExpenseScheme() throws Exception { Order order = new Order(null, IOrderType.Market, IOrderSide.Sell, null, 1000L, 1.5); OrderMonitor monitor = new OrderMonitor(null, order); monitor.setFilledQuantity(1000L); monitor.setAveragePrice(1.5); monitor.addTransaction(new StockTransaction(null, 1000L, 1.5)); Account account = new Account(); account.setExpenseScheme(new SimpleFixedScheme()); account.processCompletedOrder(monitor); assertEquals(1, account.getTransactions().length); assertEquals(1509.95, account.getTransactions()[0].getAmount().getAmount()); } public void testAddPositionToPortfolio() throws Exception { Order order = new Order(null, IOrderType.Market, IOrderSide.Buy, null, 1000L, 1.5); OrderMonitor monitor = new OrderMonitor(null, order); monitor.setFilledQuantity(1000L); monitor.setAveragePrice(1.5); monitor.addTransaction(new StockTransaction(null, 1000L, 1.5)); 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 testClosePosition() throws Exception { OrderMonitor monitor = new OrderMonitor(null, new Order(null, IOrderType.Market, IOrderSide.Buy, null, 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, null, 1000L, 1.5)); monitor2.setFilledQuantity(1000L); monitor2.setAveragePrice(1.5); account.processCompletedOrder(monitor2); assertEquals(0, account.getPositions().length); } public void testAddShortPositionToPortfolio() throws Exception { Order order = new Order(null, IOrderType.Market, IOrderSide.Sell, null, 1000L, 1.5); OrderMonitor monitor = new OrderMonitor(null, order); monitor.setFilledQuantity(1000L); monitor.setAveragePrice(1.5); monitor.addTransaction(new StockTransaction(null, 1000L, 1.5)); 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, null, 1000L, 1.5); OrderMonitor monitor1 = new OrderMonitor(null, order1); monitor1.setFilledQuantity(1000L); monitor1.setAveragePrice(1.5); monitor1.addTransaction(new StockTransaction(null, 1000L, 1.5)); Order order2 = new Order(null, IOrderType.Market, IOrderSide.Buy, null, 1000L, 1.7); OrderMonitor monitor2 = new OrderMonitor(null, order2); monitor2.setFilledQuantity(1000L); monitor2.setAveragePrice(1.7); monitor2.addTransaction(new StockTransaction(null, 1000L, 1.7)); 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()); } public void testBuyUpdateBalance() throws Exception { Order order = new Order(null, IOrderType.Market, IOrderSide.Buy, null, 1000L, 1.5); OrderMonitor monitor = new OrderMonitor(null, order); monitor.setFilledQuantity(1000L); monitor.setAveragePrice(1.5); monitor.addTransaction(new StockTransaction(null, 1000L, 1.5)); Account account = new Account(); account.setCurrency(Currency.getInstance(Locale.getDefault())); account.setBalance(10000.0); account.setExpenseScheme(new SimpleFixedScheme()); account.processCompletedOrder(monitor); assertEquals(10000.0 - 1500.0 - 9.95, account.getBalance().getAmount()); } public void testSellUpdateBalance() throws Exception { Order order = new Order(null, IOrderType.Market, IOrderSide.Sell, null, 1000L, 1.5); OrderMonitor monitor = new OrderMonitor(null, order); monitor.setFilledQuantity(1000L); monitor.setAveragePrice(1.5); monitor.addTransaction(new StockTransaction(null, -1000L, 1.5)); Account account = new Account(); account.setCurrency(Currency.getInstance(Locale.getDefault())); account.setBalance(10000.0); account.setExpenseScheme(new SimpleFixedScheme()); account.processCompletedOrder(monitor); assertEquals(10000.0 + 1500.0 - 9.95, account.getBalance().getAmount()); } }