/* * 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.internal.ats; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.eclipsetrader.core.ats.BarFactoryEvent; import org.eclipsetrader.core.ats.IBarFactoryListener; import org.eclipsetrader.core.ats.IStrategy; import org.eclipsetrader.core.ats.ITradingSystemContext; import org.eclipsetrader.core.feed.Bar; import org.eclipsetrader.core.feed.BarOpen; import org.eclipsetrader.core.feed.IBar; import org.eclipsetrader.core.feed.IBarOpen; import org.eclipsetrader.core.feed.IBook; import org.eclipsetrader.core.feed.ILastClose; import org.eclipsetrader.core.feed.IPricingEnvironment; import org.eclipsetrader.core.feed.IPricingListener; import org.eclipsetrader.core.feed.IQuote; import org.eclipsetrader.core.feed.ITodayOHL; import org.eclipsetrader.core.feed.ITrade; import org.eclipsetrader.core.feed.PricingDelta; import org.eclipsetrader.core.feed.PricingEnvironment; import org.eclipsetrader.core.feed.PricingEvent; import org.eclipsetrader.core.feed.TimeSpan; import org.eclipsetrader.core.instruments.ISecurity; import org.eclipsetrader.core.markets.IMarket; import org.eclipsetrader.core.markets.IMarketDay; import org.eclipsetrader.core.markets.IMarketService; import org.eclipsetrader.core.markets.MarketPricingEnvironment; import org.eclipsetrader.core.trading.IAccount; import org.eclipsetrader.core.trading.IBroker; public class TradingSystemContext implements ITradingSystemContext { private final IMarketService marketService; private final IBroker broker; private final IAccount account; private final PricingEnvironment pricingEnvironment; private Integer backfillSize; private final MarketPricingEnvironment marketPricingEnvironment; private final BarFactory barFactory; private boolean needsDailyBars; private Log logger = LogFactory.getLog(getClass()); public IBarFactoryListener barFactoryListener = new IBarFactoryListener() { @Override public void barOpen(BarFactoryEvent event) { BarOpen barOpen = new BarOpen(event.date, event.timeSpan, event.open); logger.info(barOpen); pricingEnvironment.setBarOpen(event.security, barOpen); } @Override public void barClose(BarFactoryEvent event) { Bar bar = new Bar(event.date, event.timeSpan, event.open, event.high, event.low, event.close, event.volume); logger.info(bar); pricingEnvironment.setBar(event.security, bar); } }; private final IPricingListener pricingListener = new IPricingListener() { @Override public void pricingUpdate(PricingEvent event) { IMarket market = marketService.getMarketForSecurity(event.getSecurity()); if (market != null) { IMarketDay day = market.getToday(); if (day != null && !day.isOpen()) { return; } } for (PricingDelta delta : event.getDelta()) { if (delta.getNewValue() instanceof ITrade) { pricingEnvironment.setTrade(event.getSecurity(), (ITrade) delta.getNewValue()); } if (delta.getNewValue() instanceof IQuote) { pricingEnvironment.setQuote(event.getSecurity(), (IQuote) delta.getNewValue()); } if (delta.getNewValue() instanceof ITodayOHL) { pricingEnvironment.setTodayOHL(event.getSecurity(), (ITodayOHL) delta.getNewValue()); } if (delta.getNewValue() instanceof ILastClose) { pricingEnvironment.setLastClose(event.getSecurity(), (ILastClose) delta.getNewValue()); } if (delta.getNewValue() instanceof IBook) { pricingEnvironment.setBook(event.getSecurity(), (IBook) delta.getNewValue()); } if (needsDailyBars) { if (delta.getNewValue() instanceof IBarOpen) { IBarOpen bar = (IBarOpen) delta.getNewValue(); if (bar.getTimeSpan().getUnits() == TimeSpan.Units.Days && bar.getTimeSpan().getLength() == 1) { pricingEnvironment.setBarOpen(event.getSecurity(), bar); } } if (delta.getNewValue() instanceof IBar) { IBar bar = (IBar) delta.getNewValue(); if (bar.getTimeSpan().getUnits() == TimeSpan.Units.Days && bar.getTimeSpan().getLength() == 1) { pricingEnvironment.setBar(event.getSecurity(), bar); } } } } barFactory.pricingUpdate(event); } }; public TradingSystemContext(IMarketService marketService, IStrategy strategy, IBroker broker, IAccount account) { this.marketService = marketService; this.broker = broker; this.account = account; pricingEnvironment = new PricingEnvironment(); marketPricingEnvironment = new MarketPricingEnvironment(marketService); marketPricingEnvironment.addSecurities(strategy.getInstruments()); marketPricingEnvironment.addPricingListener(pricingListener); barFactory = new BarFactory(); for (ISecurity security : strategy.getInstruments()) { for (TimeSpan timeSpan : strategy.getBarsTimeSpan()) { if (timeSpan.getUnits() == TimeSpan.Units.Days && timeSpan.getLength() == 1) { needsDailyBars = true; continue; } if (timeSpan.getUnits() == TimeSpan.Units.Minutes) { barFactory.add(security, timeSpan); } } } barFactory.addBarFactoryListener(barFactoryListener); } /* (non-Javadoc) * @see org.eclipsetrader.core.ats.ITradingSystemContext#getBroker() */ @Override public IBroker getBroker() { return broker; } /* (non-Javadoc) * @see org.eclipsetrader.core.ats.ITradingSystemContext#getAccount() */ @Override public IAccount getAccount() { return account; } /* (non-Javadoc) * @see org.eclipsetrader.core.ats.ITradingSystemContext#getPricingEnvironment() */ @Override public IPricingEnvironment getPricingEnvironment() { return pricingEnvironment; } /* (non-Javadoc) * @see org.eclipsetrader.core.ats.ITradingSystemContext#dispose() */ @Override public void dispose() { barFactory.dispose(); marketPricingEnvironment.dispose(); } public void setInitialBackfillSize(Integer backfillSize) { this.backfillSize = backfillSize; } /* (non-Javadoc) * @see org.eclipsetrader.core.ats.ITradingSystemContext#getInitialBackfillSize() */ @Override public int getInitialBackfillSize() { return backfillSize != null ? backfillSize.intValue() : 0; } }