package jtrade.test.integration; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertTrue; import java.io.File; import java.util.ArrayList; import java.util.List; import jtrade.Symbol; import jtrade.SymbolFactory; import jtrade.marketfeed.Bar; import jtrade.marketfeed.BarListener; import jtrade.marketfeed.IBMarketFeed; import jtrade.marketfeed.MarketListener; import jtrade.marketfeed.Tick; import jtrade.marketfeed.TickListener; import jtrade.test.TestDurationWrapper; import jtrade.util.Configurable; import org.joda.time.DateTime; import org.testng.SkipException; import org.testng.annotations.BeforeClass; import org.testng.annotations.Listeners; import org.testng.annotations.Test; @Listeners({ TestDurationWrapper.class }) public class TestIBMarketFeed { File dataDir; Symbol symbol; int barSizeSeconds; @BeforeClass public void setUp() { dataDir = new File("./test/ib"); //symbol = new Symbol("EUR-IDEALPRO-USD-CASH"); //symbol = new Symbol("COMP-NASDAQ-USD-INDEX"); //symbol = new Symbol("AAPL-SMART-USD-STOCK"); symbol = SymbolFactory.getESFutureSymbol(new DateTime()); barSizeSeconds = 60; Configurable.configure("jtrade.marketfeed.AbstractMarketFeed#DATA_DIR", dataDir); Configurable.configure("jtrade.marketfeed.IBMarketFeed#SERVER_HOSTS", "localhost:4000"); Configurable.configure("jtrade.marketfeed.IBMarketFeed#CLIENT_ID", 99999); } @Test() public void testIBMarketFeedTickListener() throws Exception { final List<Tick> ticks = new ArrayList<Tick>(); IBMarketFeed marketFeed = new IBMarketFeed(); try { marketFeed.connect(); marketFeed.addTickListener(symbol, new TickListener() { @Override public void onTick(Tick tick) { ticks.add(tick); } }, false, null); marketFeed.addTickListener(new TickListener() { @Override public void onTick(Tick tick) { ticks.add(tick); } }); assertEquals(marketFeed.isConnected(), true); long start = System.currentTimeMillis(); try { while (marketFeed.isConnected() && ticks.isEmpty()) { Thread.sleep(10); if (System.currentTimeMillis() - start > 70000) { throw new SkipException("Test timed out waiting for marketdata"); } } } catch (InterruptedException e) { } assertEquals(ticks.get(0), ticks.get(1)); assertEquals(ticks.get(ticks.size() - 1), marketFeed.getLastTick(symbol)); assertEquals(symbol, ticks.get(0).getSymbol()); assertTrue(ticks.get(0).getAsk() > 0); assertTrue(ticks.get(0).getAskSize() > 0); assertTrue(ticks.get(0).getBid() > 0); assertTrue(ticks.get(0).getBidSize() > 0); marketFeed.removeAllListeners(); } finally { marketFeed.disconnect(); } } @Test() public void testIBMarketFeedBarListener() throws Exception { final List<Bar> bars = new ArrayList<Bar>(); IBMarketFeed marketFeed = new IBMarketFeed(); try { marketFeed.connect(); marketFeed.addBarListener(symbol, new BarListener() { @Override public void onBar(Bar bar) { bars.add(bar); } }, barSizeSeconds, null); marketFeed.addBarListener(new BarListener() { @Override public void onBar(Bar bar) { bars.add(bar); } }); assertEquals(marketFeed.isConnected(), true); long start = System.currentTimeMillis(); try { while (marketFeed.isConnected() && bars.isEmpty()) { Thread.sleep(10); if (System.currentTimeMillis() - start > 70000) { throw new SkipException("Test timed out waiting for marketdata"); } } } catch (InterruptedException e) { } assertEquals(2, bars.size()); assertEquals(bars.get(0), bars.get(1)); assertEquals(bars.get(0), marketFeed.getLastBar(symbol)); assertEquals(symbol, bars.get(0).getSymbol()); assertEquals(barSizeSeconds, bars.get(0).getBarSize().getStandardSeconds()); assertTrue(bars.get(0).getOpen() > 0); assertTrue(bars.get(0).getHigh() > 0); assertTrue(bars.get(0).getLow() > 0); assertTrue(bars.get(0).getClose() > 0); marketFeed.removeAllListeners(); } finally { marketFeed.disconnect(); } } @Test() public void testIBMarketFeedMarketListener() throws Exception { DateTime now = new DateTime(); final List<DateTime> dates = new ArrayList<DateTime>(); IBMarketFeed marketFeed = new IBMarketFeed(); try { assertEquals(marketFeed.isConnected(), false); assertEquals(dataDir.getCanonicalPath(), marketFeed.getDataDir().getCanonicalPath()); marketFeed.connect(); marketFeed.disconnect(); assertEquals(marketFeed.isConnected(), false); marketFeed.connect(); marketFeed.addMarketListener(new MarketListener() { @Override public void onMinute(DateTime dateTime) { dates.add(dateTime); } @Override public void onHour(DateTime dateTime) { dates.add(dateTime); } @Override public void onDay(DateTime dateTime) { dates.add(dateTime); } }); assertEquals(marketFeed.isConnected(), true); try { while (marketFeed.isConnected() && dates.size() >= 2) { Thread.sleep(10); } } catch (InterruptedException e) { } assertEquals(now.getDayOfYear(), dates.get(0).getDayOfYear()); assertEquals(now.getMinuteOfDay(), dates.get(0).getMinuteOfDay()); assertEquals(now.getMinuteOfDay() + 1, dates.get(1).getMinuteOfDay()); marketFeed.removeAllListeners(); } catch (Exception e) { marketFeed.disconnect(); } } }