/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.sesame.deliverableswapfuture; import java.util.Map; import java.util.Set; import org.threeten.bp.LocalDate; import com.opengamma.financial.analytics.conversion.DeliverableSwapFutureTradeConverter; import com.opengamma.financial.analytics.conversion.FixedIncomeConverterDataProvider; import com.opengamma.financial.analytics.timeseries.HistoricalTimeSeriesBundle; import com.opengamma.financial.security.future.DeliverableSwapFutureSecurity; import com.opengamma.sesame.CurveLabellingFn; import com.opengamma.sesame.CurveMatrixLabeller; import com.opengamma.sesame.DiscountingMulticurveCombinerFn; import com.opengamma.sesame.Environment; import com.opengamma.sesame.FixingsFn; import com.opengamma.sesame.MulticurveBundle; import com.opengamma.sesame.trade.DeliverableSwapFutureTrade; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.result.Result; /** * Default factory for deliverable swap future calculators that provides the converter used to convert the security to an * OG-Analytics representation. */ public class DeliverableSwapFutureDiscountingCalculatorFactory implements DeliverableSwapFutureCalculatorFactory { /** * Converter for a deliverable swap future trade */ private final DeliverableSwapFutureTradeConverter _deliverableSwapFutureTradeConverter; /** * Definition to derivative converter */ private final FixedIncomeConverterDataProvider _definitionToDerivativeConverter; /** * Function used to generate a combined multicurve bundle suitable * for use with a particular security. */ private final DiscountingMulticurveCombinerFn _discountingMultiCurveCombinerFn; /** * Function for fixings */ private final FixingsFn _fixingsFn; /** * Curve labelling function */ private final CurveLabellingFn _curveLabellingFn; private static final Result<HistoricalTimeSeriesBundle> EMPTY_BUNDLE = Result.success(new HistoricalTimeSeriesBundle()); /** * Constructs a discounting calculator factory for deliverable swap futures. * * @param deliverableSwapFutureTradeConverter the converter used to convert the OG-Financial deliverable swap future to * the OG-Analytic definition. * @param definitionToDerivativeConverter the converter used to convert the definition to a derivative. * @param discountingMultiCurveCombinerFn the multicurve function. * @param fixingsFn function for looking up security fixings * @param curveLabellingFn function that provides curve labels */ public DeliverableSwapFutureDiscountingCalculatorFactory(DeliverableSwapFutureTradeConverter deliverableSwapFutureTradeConverter, FixedIncomeConverterDataProvider definitionToDerivativeConverter, DiscountingMulticurveCombinerFn discountingMultiCurveCombinerFn, FixingsFn fixingsFn, CurveLabellingFn curveLabellingFn) { _deliverableSwapFutureTradeConverter = ArgumentChecker.notNull(deliverableSwapFutureTradeConverter, "deliverableSwapFutureTradeConverter"); _definitionToDerivativeConverter = ArgumentChecker.notNull(definitionToDerivativeConverter, "definitionToDerivativeConverter"); _discountingMultiCurveCombinerFn = ArgumentChecker.notNull(discountingMultiCurveCombinerFn, "discountingMultiCurveCombinerFn"); _fixingsFn = ArgumentChecker.notNull(fixingsFn, "fixingsFn"); _curveLabellingFn = ArgumentChecker.notNull(curveLabellingFn, "curveLabellingFn"); } @Override public Result<DeliverableSwapFutureCalculator> createCalculator(Environment env, DeliverableSwapFutureTrade trade) { Result<MulticurveBundle> bundleResult = _discountingMultiCurveCombinerFn.getMulticurveBundle(env, trade); Result<HistoricalTimeSeriesBundle> fixings = getTimeSeries(env, trade); if (Result.anyFailures(bundleResult, fixings)) { return Result.failure(bundleResult, fixings); } else { MulticurveBundle multicurveBundle = bundleResult.getValue(); Set<String> curveNames = multicurveBundle.getCurveBuildingBlockBundle().getData().keySet(); Result<Map<String, CurveMatrixLabeller>> curveLabellers = _curveLabellingFn.getCurveLabellers(curveNames); if (curveLabellers.isSuccess()) { DeliverableSwapFutureCalculator calculator = new DeliverableSwapFutureDiscountingCalculator( trade, multicurveBundle.getMulticurveProvider(), _deliverableSwapFutureTradeConverter, env.getValuationTime(), _definitionToDerivativeConverter, fixings.getValue(), curveLabellers.getValue()); return Result.success(calculator); } else { return Result.failure(curveLabellers); } } } /** * Is a time series of margin prices required. Not required if valued on trade date * * @param valuationDate the valuation date * @param trade the trade date * @return true if required, else false */ private static boolean requiresTimeSeries(LocalDate valuationDate, DeliverableSwapFutureTrade trade) { return !valuationDate.equals(trade.getTrade().getTradeDate()); } private Result<HistoricalTimeSeriesBundle> getTimeSeries(Environment env, DeliverableSwapFutureTrade trade) { if (requiresTimeSeries(env.getValuationDate(), trade)) { return _fixingsFn.getFixingsForSecurity(env, trade.getSecurity()); } else { return EMPTY_BUNDLE; } } }