/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.sesame.fxforward; import org.threeten.bp.ZonedDateTime; import com.opengamma.analytics.financial.instrument.InstrumentDefinition; import com.opengamma.analytics.financial.interestrate.InstrumentDerivative; import com.opengamma.analytics.financial.interestrate.InstrumentDerivativeVisitor; import com.opengamma.analytics.financial.provider.calculator.discounting.PresentValueCurveSensitivityDiscountingCalculator; import com.opengamma.analytics.financial.provider.calculator.discounting.PresentValueDiscountingCalculator; import com.opengamma.analytics.financial.provider.calculator.generic.MarketQuoteSensitivityBlockCalculator; import com.opengamma.analytics.financial.provider.curve.CurveBuildingBlockBundle; import com.opengamma.analytics.financial.provider.description.interestrate.MulticurveProviderDiscount; import com.opengamma.analytics.financial.provider.description.interestrate.ParameterProviderInterface; import com.opengamma.analytics.financial.provider.sensitivity.multicurve.MultipleCurrencyMulticurveSensitivity; import com.opengamma.analytics.financial.provider.sensitivity.multicurve.MultipleCurrencyParameterSensitivity; import com.opengamma.analytics.financial.provider.sensitivity.parameter.ParameterSensitivityParameterCalculator; import com.opengamma.financial.analytics.CurrencyLabelledMatrix1D; import com.opengamma.financial.analytics.conversion.FixedIncomeConverterDataProvider; import com.opengamma.financial.analytics.model.forex.FXUtils; import com.opengamma.financial.analytics.timeseries.HistoricalTimeSeriesBundle; import com.opengamma.financial.security.FinancialSecurityVisitor; import com.opengamma.financial.security.fx.FXForwardSecurity; import com.opengamma.sesame.Environment; import com.opengamma.util.money.MultipleCurrencyAmount; /** * A calculation class for a specific FxForward security. On construction it is provided * with all the analytics objects it needs to produce its results. */ public class FXForwardCalculator { private static final HistoricalTimeSeriesBundle EMPTY_TIME_SERIES_BUNDLE = new HistoricalTimeSeriesBundle(); /** The curve sensitivity calculator */ private static final InstrumentDerivativeVisitor<ParameterProviderInterface, MultipleCurrencyMulticurveSensitivity> PVCSDC = PresentValueCurveSensitivityDiscountingCalculator.getInstance(); /** The parameter sensitivity calculator */ private static final ParameterSensitivityParameterCalculator<ParameterProviderInterface> PSC = new ParameterSensitivityParameterCalculator<>(PVCSDC); /** The market quote sensitivity calculator */ private static final MarketQuoteSensitivityBlockCalculator<ParameterProviderInterface> SENSITIVITY_CALCULATOR = new MarketQuoteSensitivityBlockCalculator<>(PSC); /** The analytics present value calculator */ private static final InstrumentDerivativeVisitor<ParameterProviderInterface, MultipleCurrencyAmount> PV_CALCULATOR = PresentValueDiscountingCalculator.getInstance(); private final FXForwardSecurity _security; private final MulticurveProviderDiscount _discountingMulticurveBundle; private final CurveBuildingBlockBundle _jacobianBundle; private final FixedIncomeConverterDataProvider _definitionToDerivativeConverter; private final InstrumentDefinition<?> _instrumentDefinition; public FXForwardCalculator(FXForwardSecurity security, MulticurveProviderDiscount discountingMulticurveBundle, CurveBuildingBlockBundle jacobianBundle, FinancialSecurityVisitor<InstrumentDefinition<?>> securityConverter, FixedIncomeConverterDataProvider definitionToDerivativeConverter) { _security = security; _jacobianBundle = jacobianBundle; _discountingMulticurveBundle = discountingMulticurveBundle; _definitionToDerivativeConverter = definitionToDerivativeConverter; _instrumentDefinition = _security.accept(securityConverter); } /** * Calculate the present value of the FX Forward. * * @return the present value, not null */ public CurrencyLabelledMatrix1D calculatePV(Environment env) { return FXUtils.getMultipleCurrencyAmountAsMatrix(calculateCurrencyExposure(env)); } public MultipleCurrencyAmount calculateCurrencyExposure(Environment env) { InstrumentDerivative derivative = generateInstrumentDerivative(env); return derivative.accept(PV_CALCULATOR, _discountingMulticurveBundle); } // Note that this is one possible implementation (corresponds to DiscountingBCSFunction), we will // need to support others (e.g. FXForwardPointsBCSFunction) public MultipleCurrencyParameterSensitivity generateBlockCurveSensitivities(Environment env) { return SENSITIVITY_CALCULATOR.fromInstrument(generateInstrumentDerivative(env), _discountingMulticurveBundle, _jacobianBundle); } // todo - if this class is thrown away after each cycle then we can use a field rather than this method private InstrumentDerivative generateInstrumentDerivative(Environment env) { ZonedDateTime valuationTime = env.getValuationTime(); // Note that no time series are needed for FX Forward, so pass in an empty bundle return _definitionToDerivativeConverter.convert( _security, _instrumentDefinition, valuationTime, EMPTY_TIME_SERIES_BUNDLE); } }