/**
* Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.sesame.irfuture;
import com.opengamma.analytics.util.amount.ReferenceAmount;
import com.opengamma.financial.analytics.model.fixedincome.BucketedCurveSensitivities;
import com.opengamma.sesame.Environment;
import com.opengamma.sesame.trade.InterestRateFutureTrade;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.money.Currency;
import com.opengamma.util.money.MultipleCurrencyAmount;
import com.opengamma.util.result.Result;
import com.opengamma.util.tuple.Pair;
/**
* Default implementation of the {@link InterestRateFutureFn} that uses a specified calculator function to calculate
* requested values.
*/
public class DefaultInterestRateFutureFn implements InterestRateFutureFn {
/**
* The calculator used to provide the OG-Analytics representation of the security and the necessary market data
* requirements to calculate the requested values.
*/
private final InterestRateFutureCalculatorFactory _interestRateFutureCalculatorFactory;
public DefaultInterestRateFutureFn(InterestRateFutureCalculatorFactory interestRateFutureCalculatorFactory) {
_interestRateFutureCalculatorFactory =
ArgumentChecker.notNull(interestRateFutureCalculatorFactory, "interestRateFutureCalculatorFactory");
}
@Override
public Result<Double> calculateParRate(Environment env, InterestRateFutureTrade irFutureTrade) {
Result<InterestRateFutureCalculator> calculatorResult =
_interestRateFutureCalculatorFactory.createCalculator(env, irFutureTrade);
if (!calculatorResult.isSuccess()) {
return Result.failure(calculatorResult);
}
return calculatorResult.getValue().calculateParRate();
}
@Override
public Result<MultipleCurrencyAmount> calculatePV(Environment env, InterestRateFutureTrade irFutureTrade) {
Result<InterestRateFutureCalculator> calculatorResult =
_interestRateFutureCalculatorFactory.createCalculator(env, irFutureTrade);
if (!calculatorResult.isSuccess()) {
return Result.failure(calculatorResult);
}
return calculatorResult.getValue().calculatePV();
}
@Override
public Result<ReferenceAmount<Pair<String, Currency>>> calculatePV01(Environment env,
InterestRateFutureTrade irFutureTrade) {
Result<InterestRateFutureCalculator> calculatorResult =
_interestRateFutureCalculatorFactory.createCalculator(env, irFutureTrade);
if (!calculatorResult.isSuccess()) {
return Result.failure(calculatorResult);
}
return calculatorResult.getValue().calculatePV01();
}
@Override
public Result<Double> getSecurityMarketPrice(Environment env, InterestRateFutureTrade irFutureTrade) {
// TODO this is not specific to a calculator, and should be pulled out - SSM-248
Result<InterestRateFutureCalculator> calculatorResult =
_interestRateFutureCalculatorFactory.createCalculator(env, irFutureTrade);
if (!calculatorResult.isSuccess()) {
return Result.failure(calculatorResult);
}
return calculatorResult.getValue().getSecurityMarketPrice();
}
@Override
public Result<Double> calculateSecurityModelPrice(Environment env, InterestRateFutureTrade irFutureTrade) {
Result<InterestRateFutureCalculator> calculatorResult =
_interestRateFutureCalculatorFactory.createCalculator(env, irFutureTrade);
if (!calculatorResult.isSuccess()) {
return Result.failure(calculatorResult);
}
return calculatorResult.getValue().calculateSecurityModelPrice();
}
@Override
public Result<BucketedCurveSensitivities> calculateBucketedZeroIRDelta(Environment env,
InterestRateFutureTrade irFutureTrade) {
Result<InterestRateFutureCalculator> calculatorResult =
_interestRateFutureCalculatorFactory.createCalculator(env, irFutureTrade);
if (!calculatorResult.isSuccess()) {
return Result.failure(calculatorResult);
}
return calculatorResult.getValue().calculateBucketedZeroIRDelta();
}
}