/*
* 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.feed;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
import junit.framework.TestCase;
public class BarGeneratorTest extends TestCase {
public void testSetBarCloseTime() throws Exception {
BarGenerator generator = new BarGenerator(TimeSpan.minutes(1));
generator.addTrade(new Trade(new Date(0), 1.0, 100L, 1000L));
assertEquals(new Date(60 * 1000), generator.dateClose);
}
public void testSetInitialValues() throws Exception {
BarGenerator generator = new BarGenerator(TimeSpan.minutes(1));
generator.addTrade(new Trade(new Date(0), 1.0, 100L, 1000L));
assertEquals(1.0, generator.open);
assertEquals(1.0, generator.high);
assertEquals(1.0, generator.low);
assertEquals(1.0, generator.close);
assertEquals(new Long(100), generator.volume);
}
public void testSetHighestValue() throws Exception {
BarGenerator generator = new BarGenerator(TimeSpan.minutes(1));
generator.addTrade(new Trade(new Date(0), 1.0, 100L, 1000L));
generator.addTrade(new Trade(new Date(0), 1.1, 100L, 1000L));
assertEquals(1.1, generator.high);
assertEquals(1.0, generator.low);
}
public void testSetLowestValue() throws Exception {
BarGenerator generator = new BarGenerator(TimeSpan.minutes(1));
generator.addTrade(new Trade(new Date(0), 1.0, 100L, 1000L));
generator.addTrade(new Trade(new Date(0), 0.9, 100L, 1000L));
assertEquals(1.0, generator.high);
assertEquals(0.9, generator.low);
}
public void testSetCloseToLatestTrade() throws Exception {
BarGenerator generator = new BarGenerator(TimeSpan.minutes(1));
generator.addTrade(new Trade(new Date(0), 1.0, 100L, 1000L));
generator.addTrade(new Trade(new Date(0), 1.1, 100L, 1000L));
generator.addTrade(new Trade(new Date(0), 0.9, 100L, 1000L));
assertEquals(0.9, generator.close);
}
public void testSetOpenToFirstTrade() throws Exception {
BarGenerator generator = new BarGenerator(TimeSpan.minutes(1));
generator.addTrade(new Trade(new Date(0), 1.0, 100L, 1000L));
generator.addTrade(new Trade(new Date(0), 1.1, 100L, 1000L));
generator.addTrade(new Trade(new Date(0), 0.9, 100L, 1000L));
assertEquals(1.0, generator.open);
}
public void testAddTradeGeneratesBarOpen() throws Exception {
BarGenerator generator = new BarGenerator(TimeSpan.minutes(1));
final List<Object> events = new ArrayList<Object>();
generator.addObserver(new Observer() {
@Override
public void update(Observable o, Object arg) {
events.add(arg);
}
});
generator.addTrade(new Trade(new Date(0 * 1000), 1.0, 100L, 1000L));
IBarOpen barOpen = (IBarOpen) events.get(0);
assertEquals(new Date(0), barOpen.getDate());
assertEquals(TimeSpan.minutes(1), barOpen.getTimeSpan());
assertEquals(1.0, barOpen.getOpen());
}
public void testAddTradeGeneratesBar() throws Exception {
BarGenerator generator = new BarGenerator(TimeSpan.minutes(1));
generator.addTrade(new Trade(new Date(0 * 1000), 1.0, 100L, 1000L));
generator.addTrade(new Trade(new Date(30 * 1000), 1.1, 100L, 1000L));
generator.addTrade(new Trade(new Date(59 * 1000), 0.9, 100L, 1000L));
final List<Object> events = new ArrayList<Object>();
generator.addObserver(new Observer() {
@Override
public void update(Observable o, Object arg) {
events.add(arg);
}
});
generator.addTrade(new Trade(new Date(60 * 1000), 1.0, 100L, 1000L));
IBar bar = (IBar) events.get(0);
assertEquals(new Date(0), bar.getDate());
assertEquals(TimeSpan.minutes(1), bar.getTimeSpan());
assertEquals(1.0, bar.getOpen());
assertEquals(1.1, bar.getHigh());
assertEquals(0.9, bar.getLow());
assertEquals(0.9, bar.getClose());
assertEquals(new Long(300), bar.getVolume());
}
public void testDontGenerateBarOnAggregatedTrades() throws Exception {
BarGenerator generator = new BarGenerator(TimeSpan.minutes(1));
generator.addTrade(new Trade(new Date(0 * 1000), 1.0, 100L, 1000L));
final List<Object> events = new ArrayList<Object>();
generator.addObserver(new Observer() {
@Override
public void update(Observable o, Object arg) {
events.add(arg);
}
});
generator.addTrade(new Trade(new Date(30 * 1000), 1.1, 100L, 1000L));
generator.addTrade(new Trade(new Date(59 * 1000), 0.9, 100L, 1000L));
assertEquals(0, events.size());
}
public void testForceBarClose() throws Exception {
BarGenerator generator = new BarGenerator(TimeSpan.minutes(1));
generator.addTrade(new Trade(new Date(0), 1.0, 100L, 1000L));
generator.addTrade(new Trade(new Date(0), 1.1, 100L, 1000L));
generator.addTrade(new Trade(new Date(0), 0.9, 100L, 1000L));
final List<Object> events = new ArrayList<Object>();
generator.addObserver(new Observer() {
@Override
public void update(Observable o, Object arg) {
events.add(arg);
}
});
generator.forceBarClose();
IBar bar = (IBar) events.get(0);
assertEquals(new Date(0), bar.getDate());
assertEquals(TimeSpan.minutes(1), bar.getTimeSpan());
assertEquals(1.0, bar.getOpen());
assertEquals(1.1, bar.getHigh());
assertEquals(0.9, bar.getLow());
assertEquals(0.9, bar.getClose());
assertEquals(new Long(300), bar.getVolume());
}
public void testBarNotExpired() throws Exception {
BarGenerator generator = new BarGenerator(TimeSpan.minutes(1));
generator.addTrade(new Trade(new Date(), 1.0, 100L, 1000L));
assertFalse(generator.isBarExpired());
}
public void testBarExpired() throws Exception {
BarGenerator generator = new BarGenerator(TimeSpan.minutes(1));
generator.addTrade(new Trade(new Date(new Date().getTime() - 60 * 1000), 1.0, 100L, 1000L));
assertTrue(generator.isBarExpired());
}
public void testIgnoreTradeWithNullDate() throws Exception {
BarGenerator generator = new BarGenerator(TimeSpan.minutes(1));
generator.addTrade(new Trade(null, 1.0, 100L, 1000L));
assertNull(generator.open);
assertNull(generator.high);
assertNull(generator.low);
assertNull(generator.close);
assertNull(generator.volume);
}
}