/**
* Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.sesame.fedfundsfuture;
import com.opengamma.analytics.financial.provider.description.interestrate.MulticurveProviderDiscount;
import com.opengamma.financial.analytics.conversion.FederalFundsFutureTradeConverter;
import com.opengamma.financial.analytics.conversion.FixedIncomeConverterDataProvider;
import com.opengamma.financial.analytics.timeseries.HistoricalTimeSeriesBundle;
import com.opengamma.financial.security.FinancialSecurity;
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.FedFundsFutureTrade;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.result.Result;
/**
* Discounting calculator factory for federal funds futures.
*/
public class FedFundsFutureDiscountingCalculatorFactory implements FedFundsFutureCalculatorFactory {
private final FederalFundsFutureTradeConverter _converter;
private final FixedIncomeConverterDataProvider _definitionToDerivativeConverter;
private final DiscountingMulticurveCombinerFn _discountingMulticurveCombinerFn;
private final FixingsFn _fixingsFn;
/**
* Constructs a factory that creates discounting calculators for federal funds futures.
*
* @param converter the converter used to convert the OG-Financial federal funds future to the OG-Analytics definition.
* @param definitionToDerivativeConverter the converter used to convert the definition to derivative.
* @param discountingMulticurveCombinerFn the multicurve function.
* @param fixingsFn the historical time series function, not null.
*/
public FedFundsFutureDiscountingCalculatorFactory(FederalFundsFutureTradeConverter converter,
FixedIncomeConverterDataProvider definitionToDerivativeConverter,
DiscountingMulticurveCombinerFn discountingMulticurveCombinerFn,
FixingsFn fixingsFn) {
_converter = ArgumentChecker.notNull(converter, "converter");
_definitionToDerivativeConverter =
ArgumentChecker.notNull(definitionToDerivativeConverter, "definitionToDerivativeConverter");
_discountingMulticurveCombinerFn =
ArgumentChecker.notNull(discountingMulticurveCombinerFn, "discountingMulticurveCombinerFn");
_fixingsFn = ArgumentChecker.notNull(fixingsFn, "htsFn");
}
@Override
public Result<FedFundsFutureCalculator> createCalculator(Environment env, FedFundsFutureTrade trade) {
FinancialSecurity security = trade.getSecurity();
Result<MulticurveBundle> bundleResult = _discountingMulticurveCombinerFn.getMulticurveBundle(env, trade);
Result<HistoricalTimeSeriesBundle> fixingsResult = _fixingsFn.getFixingsForSecurity(env, security);
if (Result.allSuccessful(bundleResult, fixingsResult)) {
MulticurveProviderDiscount bundle = bundleResult.getValue().getMulticurveProvider();
HistoricalTimeSeriesBundle fixings = fixingsResult.getValue();
FedFundsFutureCalculator calculator = new FedFundsFutureDiscountingCalculator(trade, bundle, _converter, env.getValuationTime(), _definitionToDerivativeConverter, fixings);
return Result.success(calculator);
} else {
return Result.failure(bundleResult, fixingsResult);
}
}
}