/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.sesame.fra; import com.opengamma.analytics.util.amount.ReferenceAmount; import com.opengamma.financial.analytics.model.fixedincome.BucketedCrossSensitivities; import com.opengamma.financial.analytics.model.fixedincome.BucketedCurveSensitivities; import com.opengamma.financial.analytics.model.fixedincome.SwapLegCashFlows; import com.opengamma.financial.security.fra.FRASecurity; import com.opengamma.financial.security.fra.ForwardRateAgreementSecurity; import com.opengamma.sesame.Environment; import com.opengamma.sesame.trade.ForwardRateAgreementTrade; import com.opengamma.util.money.Currency; import com.opengamma.util.money.MultipleCurrencyAmount; import com.opengamma.util.result.Result; import com.opengamma.util.tuple.Pair; /** * Calculate discounting PV and par rate for a FRA. */ public class DiscountingFRAFn implements FRAFn { private final FRACalculatorFactory _fraCalculatorFactory; /** * Create the function. * * @param fraCalculatorFactory function to generate the calculator for the security */ public DiscountingFRAFn(FRACalculatorFactory fraCalculatorFactory) { _fraCalculatorFactory = fraCalculatorFactory; } @Override public Result<MultipleCurrencyAmount> calculatePV(Environment env, FRASecurity security) { Result<FRACalculator> calculatorResult = _fraCalculatorFactory.createCalculator(env, security); if (!calculatorResult.isSuccess()) { return Result.failure(calculatorResult); } return calculatorResult.getValue().calculatePV(); } @Override public Result<Double> calculateParRate(Environment env, FRASecurity security) { Result<FRACalculator> calculatorResult = _fraCalculatorFactory.createCalculator(env, security); if (!calculatorResult.isSuccess()) { return Result.failure(calculatorResult); } return calculatorResult.getValue().calculateRate(); } @Override public Result<MultipleCurrencyAmount> calculatePV(Environment env, ForwardRateAgreementSecurity security) { Result<FRACalculator> calculatorResult = _fraCalculatorFactory.createCalculator(env, security); if (!calculatorResult.isSuccess()) { return Result.failure(calculatorResult); } return calculatorResult.getValue().calculatePV(); } @Override public Result<Double> calculateParRate(Environment env, ForwardRateAgreementSecurity security) { Result<FRACalculator> calculatorResult = _fraCalculatorFactory.createCalculator(env, security); if (!calculatorResult.isSuccess()) { return Result.failure(calculatorResult); } return calculatorResult.getValue().calculateRate(); } @Override public Result<ReferenceAmount<Pair<String, Currency>>> calculatePV01(Environment env, ForwardRateAgreementSecurity security) { Result<FRACalculator> calculatorResult = _fraCalculatorFactory.createCalculator(env, security); if (!calculatorResult.isSuccess()) { return Result.failure(calculatorResult); } return calculatorResult.getValue().calculatePV01(); } @Override public Result<ReferenceAmount<Pair<String, Currency>>> calculatePV01(Environment env, FRASecurity security) { Result<FRACalculator> calculatorResult = _fraCalculatorFactory.createCalculator(env, security); if (!calculatorResult.isSuccess()) { return Result.failure(calculatorResult); } return calculatorResult.getValue().calculatePV01(); } @Override public Result<BucketedCurveSensitivities> calculateBucketedPV01(Environment env, FRASecurity security) { Result<FRACalculator> calculatorResult = _fraCalculatorFactory.createCalculator(env, security); if (!calculatorResult.isSuccess()) { return Result.failure(calculatorResult); } return calculatorResult.getValue().calculateBucketedPV01(); } @Override public Result<BucketedCurveSensitivities> calculateBucketedPV01(Environment env, ForwardRateAgreementSecurity security) { Result<FRACalculator> calculatorResult = _fraCalculatorFactory.createCalculator(env, security); if (!calculatorResult.isSuccess()) { return Result.failure(calculatorResult); } return calculatorResult.getValue().calculateBucketedPV01(); } @Override public Result<BucketedCrossSensitivities> calculateBucketedCrossGamma(Environment env, FRASecurity security) { Result<FRACalculator> calculatorResult = _fraCalculatorFactory.createCalculator(env, security); if (!calculatorResult.isSuccess()) { return Result.failure(calculatorResult); } return calculatorResult.getValue().calculateBucketedCrossGamma(); } @Override public Result<BucketedCrossSensitivities> calculateBucketedCrossGamma(Environment env, ForwardRateAgreementSecurity security) { Result<FRACalculator> calculatorResult = _fraCalculatorFactory.createCalculator(env, security); if (!calculatorResult.isSuccess()) { return Result.failure(calculatorResult); } return calculatorResult.getValue().calculateBucketedCrossGamma(); } @Override public Result<SwapLegCashFlows> calculateReceiveLegCashFlows(Environment env, ForwardRateAgreementSecurity security) { Result<FRACalculator> calculatorResult = _fraCalculatorFactory.createCalculator(env, security); if (!calculatorResult.isSuccess()) { return Result.failure(calculatorResult); } return calculatorResult.getValue().calculateReceiveCashFlows(); } @Override public Result<SwapLegCashFlows> calculatePayLegCashFlows(Environment env, ForwardRateAgreementSecurity security) { Result<FRACalculator> calculatorResult = _fraCalculatorFactory.createCalculator(env, security); if (!calculatorResult.isSuccess()) { return Result.failure(calculatorResult); } return calculatorResult.getValue().calculatePayCashFlows(); } @Override public Result<Double> calculateParRate(Environment env, ForwardRateAgreementTrade trade) { Result<FRACalculator> calculatorResult = _fraCalculatorFactory.createCalculator(env, trade); if (!calculatorResult.isSuccess()) { return Result.failure(calculatorResult); } return calculatorResult.getValue().calculateRate(); } @Override public Result<MultipleCurrencyAmount> calculatePV(Environment env, ForwardRateAgreementTrade trade) { Result<FRACalculator> calculatorResult = _fraCalculatorFactory.createCalculator(env, trade); if (!calculatorResult.isSuccess()) { return Result.failure(calculatorResult); } return calculatorResult.getValue().calculatePV(); } @Override public Result<ReferenceAmount<Pair<String, Currency>>> calculatePV01(Environment env, ForwardRateAgreementTrade trade) { Result<FRACalculator> calculatorResult = _fraCalculatorFactory.createCalculator(env, trade); if (!calculatorResult.isSuccess()) { return Result.failure(calculatorResult); } return calculatorResult.getValue().calculatePV01(); } @Override public Result<BucketedCurveSensitivities> calculateBucketedPV01(Environment env, ForwardRateAgreementTrade trade) { Result<FRACalculator> calculatorResult = _fraCalculatorFactory.createCalculator(env, trade); if (!calculatorResult.isSuccess()) { return Result.failure(calculatorResult); } return calculatorResult.getValue().calculateBucketedPV01(); } @Override public Result<BucketedCrossSensitivities> calculateBucketedCrossGamma(Environment env, ForwardRateAgreementTrade trade) { Result<FRACalculator> calculatorResult = _fraCalculatorFactory.createCalculator(env, trade); if (!calculatorResult.isSuccess()) { return Result.failure(calculatorResult); } return calculatorResult.getValue().calculateBucketedCrossGamma(); } @Override public Result<BucketedCurveSensitivities> calculateBucketedGamma(Environment env, ForwardRateAgreementTrade trade) { Result<FRACalculator> calculatorResult = _fraCalculatorFactory.createCalculator(env, trade); if (!calculatorResult.isSuccess()) { return Result.failure(calculatorResult); } return calculatorResult.getValue().calculateBucketedGamma(); } @Override public Result<SwapLegCashFlows> calculateReceiveLegCashFlows(Environment env, ForwardRateAgreementTrade trade) { Result<FRACalculator> calculatorResult = _fraCalculatorFactory.createCalculator(env, trade); if (!calculatorResult.isSuccess()) { return Result.failure(calculatorResult); } return calculatorResult.getValue().calculateReceiveCashFlows(); } @Override public Result<SwapLegCashFlows> calculatePayLegCashFlows(Environment env, ForwardRateAgreementTrade trade) { Result<FRACalculator> calculatorResult = _fraCalculatorFactory.createCalculator(env, trade); if (!calculatorResult.isSuccess()) { return Result.failure(calculatorResult); } return calculatorResult.getValue().calculatePayCashFlows(); } }