/* * 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.ArrayList; import java.util.Collections; import java.util.Date; import java.util.Iterator; import java.util.List; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipsetrader.core.ats.IScriptStrategy; import org.eclipsetrader.core.feed.Bar; import org.eclipsetrader.core.feed.BarOpen; import org.eclipsetrader.core.feed.IHistory; import org.eclipsetrader.core.feed.IOHLC; import org.eclipsetrader.core.feed.PricingEnvironment; import org.eclipsetrader.core.feed.TimeSpan; import org.eclipsetrader.core.feed.Trade; import org.eclipsetrader.core.instruments.ISecurity; import org.eclipsetrader.core.internal.ats.TradingSystem; import org.eclipsetrader.core.repositories.IRepositoryService; public class SimulationRunner { private final IRepositoryService repositoryService; private final IScriptStrategy strategy; private Date begin; private Date end; private SimulationReport report; private class BarData implements Comparable<BarData> { ISecurity security; TimeSpan timeSpan; IOHLC bar; public BarData(ISecurity security, TimeSpan timeSpan, IOHLC bar) { this.security = security; this.timeSpan = timeSpan; this.bar = bar; } @Override public int compareTo(BarData o) { return bar.getDate().compareTo(o.bar.getDate()); } } public SimulationRunner(IRepositoryService repositoryService, IScriptStrategy strategy, Date begin, Date end) { this.repositoryService = repositoryService; this.strategy = strategy; this.begin = begin; this.end = end; } public void runWithProgress(IProgressMonitor monitor) throws Exception { TimeSpan[] barsTimeSpan = strategy.getBarsTimeSpan(); if (barsTimeSpan == null || barsTimeSpan.length == 0) { barsTimeSpan = new TimeSpan[] { TimeSpan.days(1) }; } List<BarData> dataSet = new ArrayList<BarData>(); for (ISecurity security : strategy.getInstruments()) { if (monitor.isCanceled()) { return; } IHistory history = repositoryService.getHistoryFor(security); for (TimeSpan timeSpan : barsTimeSpan) { IHistory subHistory = history.getSubset(begin, end, timeSpan); for (IOHLC ohlc : subHistory.getOHLC()) { dataSet.add(new BarData(security, timeSpan, ohlc)); } } } Collections.sort(dataSet); PricingEnvironment pricingEnvironment = new PricingEnvironment(); Broker broker = new Broker(pricingEnvironment); broker.connect(); Account account = new Account(); SimulationContext context = new SimulationContext(broker, account, pricingEnvironment); report = new SimulationReport(strategy, context, begin, end); TradingSystem tradingSystem = new TradingSystem(strategy); tradingSystem.start(context); for (Iterator<BarData> iter = dataSet.iterator(); iter.hasNext() && !monitor.isCanceled();) { BarData data = iter.next(); pricingEnvironment.setTrade(data.security, new Trade(data.bar.getDate(), data.bar.getOpen(), 0L, 0L)); pricingEnvironment.setBarOpen(data.security, new BarOpen(data.bar.getDate(), data.timeSpan, data.bar.getOpen())); pricingEnvironment.setTrade(data.security, new Trade(data.bar.getDate(), data.bar.getClose(), 0L, 0L)); pricingEnvironment.setBar(data.security, new Bar(data.bar.getDate(), data.timeSpan, data.bar.getOpen(), data.bar.getHigh(), data.bar.getLow(), data.bar.getClose(), data.bar.getVolume())); } tradingSystem.stop(); broker.disconnect(); context.dispose(); } public SimulationReport getReport() { return report; } }