/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.provider.calculator.discounting; import com.opengamma.analytics.financial.interestrate.InstrumentDerivativeVisitorAdapter; import com.opengamma.analytics.financial.interestrate.annuity.derivative.Annuity; import com.opengamma.analytics.financial.interestrate.annuity.derivative.AnnuityCouponFixed; import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponONArithmeticAverage; import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponONArithmeticAverageSpread; import com.opengamma.analytics.financial.interestrate.payments.derivative.Payment; import com.opengamma.analytics.financial.interestrate.payments.provider.CouponONArithmeticAverageDiscountingMethod; import com.opengamma.analytics.financial.interestrate.payments.provider.CouponONArithmeticAverageSpreadDiscountingMethod; import com.opengamma.analytics.financial.interestrate.swap.derivative.Swap; import com.opengamma.analytics.financial.interestrate.swap.derivative.SwapFixedCoupon; import com.opengamma.analytics.financial.provider.description.interestrate.ParameterProviderInterface; import com.opengamma.analytics.financial.provider.sensitivity.multicurve.MultipleCurrencyMulticurveSensitivity; import com.opengamma.util.ArgumentChecker; /** * Calculator of the present value curve sensitivity as multiple currency interest rate curve sensitivity. * This calculator contains "second best" approaches (hence the 2 in the name). * In general the methods used here would not be used in production. */ public final class PresentValueCurveSensitivityDiscounting2Calculator extends InstrumentDerivativeVisitorAdapter<ParameterProviderInterface, MultipleCurrencyMulticurveSensitivity> { /** * The unique instance of the calculator. */ private static final PresentValueCurveSensitivityDiscounting2Calculator INSTANCE = new PresentValueCurveSensitivityDiscounting2Calculator(); /** * Gets the calculator instance. * @return The calculator. */ public static PresentValueCurveSensitivityDiscounting2Calculator getInstance() { return INSTANCE; } /** * Constructor. */ private PresentValueCurveSensitivityDiscounting2Calculator() { } /** The methods used by the different instruments. */ private static final CouponONArithmeticAverageDiscountingMethod METHOD_CPN_AAON_EXACT = CouponONArithmeticAverageDiscountingMethod.getInstance(); private static final CouponONArithmeticAverageSpreadDiscountingMethod METHOD_CPN_AAON_SPREAD_EXACT = CouponONArithmeticAverageSpreadDiscountingMethod.getInstance(); // ----- Payment/Coupon ------ @Override public MultipleCurrencyMulticurveSensitivity visitCouponONArithmeticAverage(final CouponONArithmeticAverage payment, final ParameterProviderInterface multicurve) { return METHOD_CPN_AAON_EXACT.presentValueCurveSensitivity(payment, multicurve.getMulticurveProvider()); } @Override public MultipleCurrencyMulticurveSensitivity visitCouponONArithmeticAverageSpread(final CouponONArithmeticAverageSpread payment, final ParameterProviderInterface multicurve) { return METHOD_CPN_AAON_SPREAD_EXACT.presentValueCurveSensitivity(payment, multicurve.getMulticurveProvider()); } // ----- Annuity ------ @Override public MultipleCurrencyMulticurveSensitivity visitGenericAnnuity(final Annuity<? extends Payment> annuity, final ParameterProviderInterface multicurve) { ArgumentChecker.notNull(annuity, "Annuity"); ArgumentChecker.notNull(multicurve, "multicurve"); MultipleCurrencyMulticurveSensitivity cs = annuity.getNthPayment(0).accept(this, multicurve); for (int loopp = 1; loopp < annuity.getNumberOfPayments(); loopp++) { cs = cs.plus(annuity.getNthPayment(loopp).accept(this, multicurve)); } return cs; } @Override public MultipleCurrencyMulticurveSensitivity visitFixedCouponAnnuity(final AnnuityCouponFixed annuity, final ParameterProviderInterface multicurve) { return visitGenericAnnuity(annuity, multicurve); } // ----- Swap ------ @Override public MultipleCurrencyMulticurveSensitivity visitSwap(final Swap<?, ?> swap, final ParameterProviderInterface multicurve) { final MultipleCurrencyMulticurveSensitivity sensitivity1 = swap.getFirstLeg().accept(this, multicurve); final MultipleCurrencyMulticurveSensitivity sensitivity2 = swap.getSecondLeg().accept(this, multicurve); return sensitivity1.plus(sensitivity2); } @Override public MultipleCurrencyMulticurveSensitivity visitFixedCouponSwap(final SwapFixedCoupon<?> swap, final ParameterProviderInterface multicurve) { return visitSwap(swap, multicurve); } }