/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.sesame; import org.threeten.bp.LocalDate; import com.google.common.base.Function; import com.opengamma.analytics.financial.schedule.HolidayDateRemovalFunction; import com.opengamma.analytics.financial.schedule.Schedule; import com.opengamma.analytics.financial.schedule.TimeSeriesSamplingFunction; import com.opengamma.financial.convention.calendar.Calendar; import com.opengamma.financial.convention.calendar.MondayToFridayCalendar; import com.opengamma.financial.currency.CurrencyPair; import com.opengamma.sesame.marketdata.HistoricalMarketDataFn; import com.opengamma.timeseries.date.localdate.LocalDateDoubleTimeSeries; import com.opengamma.util.result.Result; import com.opengamma.util.time.LocalDateRange; /** * Function implementation that provides an FX return series for currency pairs. */ public class DefaultFXReturnSeriesFn implements FXReturnSeriesFn { /** Removes weekends */ private static final HolidayDateRemovalFunction HOLIDAY_REMOVER = HolidayDateRemovalFunction.getInstance(); /** A weekend calendar */ private static final Calendar WEEKEND_CALENDAR = new MondayToFridayCalendar("Weekend"); /** * The market data function. */ private final HistoricalMarketDataFn _historicalMarketDataFn; /** * The time-series converter. */ private final TimeSeriesReturnConverter _timeSeriesConverter; /** * The time-series sampling function. */ private final TimeSeriesSamplingFunction _timeSeriesSamplingFunction; /** * The schedule. */ private final Schedule _scheduleCalculator; public DefaultFXReturnSeriesFn(HistoricalMarketDataFn historicalMarketDataFn, TimeSeriesReturnConverter timeSeriesConverter, TimeSeriesSamplingFunction timeSeriesSamplingFunction, Schedule schedule) { _historicalMarketDataFn = historicalMarketDataFn; _timeSeriesConverter = timeSeriesConverter; _timeSeriesSamplingFunction = timeSeriesSamplingFunction; _scheduleCalculator = schedule; } //------------------------------------------------------------------------- @Override public Result<LocalDateDoubleTimeSeries> calculateReturnSeries(Environment env, LocalDateRange dateRange, CurrencyPair currencyPair) { return _historicalMarketDataFn.getFxRates(env, currencyPair, dateRange).flatMap( new Function<LocalDateDoubleTimeSeries, Result<LocalDateDoubleTimeSeries>>() { @Override public Result<LocalDateDoubleTimeSeries> apply(LocalDateDoubleTimeSeries input) { return Result.success(_timeSeriesConverter.convert(input)); } }); } @Override //TODO [SSM-243] this doesn't really apply specifically to FX. move elsewhere? public LocalDateDoubleTimeSeries calculateReturnSeries(Environment env, LocalDateDoubleTimeSeries timeSeries) { // todo - is faffing about with include start / end required? final LocalDate[] dates = HOLIDAY_REMOVER.getStrippedSchedule( _scheduleCalculator.getSchedule(timeSeries.getEarliestTime(), timeSeries.getLatestTime(), true, false), WEEKEND_CALENDAR); LocalDateDoubleTimeSeries sampledTimeSeries = _timeSeriesSamplingFunction.getSampledTimeSeries(timeSeries, dates); // todo - clip the time-series to the range originally asked for? return _timeSeriesConverter.convert(sampledTimeSeries); } }