Package com.opengamma.financial.analytics.model.bondfutureoption

Source Code of com.opengamma.financial.analytics.model.bondfutureoption.BondFutureOptionBlackFromFuturePresentValueFunction

/**
* Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics.model.bondfutureoption;

import java.util.Collections;
import java.util.Set;

import com.opengamma.OpenGammaRuntimeException;
import com.opengamma.analytics.financial.interestrate.InstrumentDerivative;
import com.opengamma.analytics.financial.interestrate.PresentValueBlackCalculator;
import com.opengamma.analytics.financial.model.option.definition.YieldCurveWithBlackCubeAndForwardBundle;
import com.opengamma.analytics.financial.model.option.definition.YieldCurveWithBlackCubeBundle;
import com.opengamma.core.value.MarketDataRequirementNames;
import com.opengamma.engine.ComputationTarget;
import com.opengamma.engine.function.FunctionCompilationContext;
import com.opengamma.engine.function.FunctionInputs;
import com.opengamma.engine.target.ComputationTargetType;
import com.opengamma.engine.value.ComputedValue;
import com.opengamma.engine.value.ValueProperties;
import com.opengamma.engine.value.ValuePropertyNames;
import com.opengamma.engine.value.ValueRequirement;
import com.opengamma.engine.value.ValueRequirementNames;
import com.opengamma.engine.value.ValueSpecification;
import com.opengamma.financial.analytics.ircurve.calcconfig.MultiCurveCalculationConfig;
import com.opengamma.financial.security.option.BondFutureOptionSecurity;
import com.opengamma.id.ExternalId;

/**
*
*/
public class BondFutureOptionBlackFromFuturePresentValueFunction extends BondFutureOptionBlackFunction {
  /** String indicating the calculation method */
  public static final String FUTURES_PRICE = "FromFuturePrice";
  private static final PresentValueBlackCalculator s_calculator = PresentValueBlackCalculator.getInstance();

  public BondFutureOptionBlackFromFuturePresentValueFunction() {
    super(ValueRequirementNames.PRESENT_VALUE);
  }

  @Override
  protected Set<ComputedValue> getResult(final InstrumentDerivative bondFutureOption, final YieldCurveWithBlackCubeBundle data, final MultiCurveCalculationConfig curveCalculationConfig,
      final ValueSpecification spec, final FunctionInputs inputs, final Set<ValueRequirement> desiredValue, final BondFutureOptionSecurity security) {
    final Object underlyingValue = inputs.getValue(MarketDataRequirementNames.MARKET_VALUE);
    if (underlyingValue == null) {
      throw new OpenGammaRuntimeException("Could not get market data for underlying future");
    }
    final double futurePrice = (Double) underlyingValue;
    final YieldCurveWithBlackCubeAndForwardBundle dataWithFuture = YieldCurveWithBlackCubeAndForwardBundle.from(data, futurePrice);
    final double pv = bondFutureOption.accept(s_calculator, dataWithFuture);
    return Collections.singleton(new ComputedValue(spec, pv));
  }

  @Override
  public Set<ValueRequirement> getRequirements(final FunctionCompilationContext context, final ComputationTarget target, final ValueRequirement desiredValue) {
    final Set<ValueRequirement> requirements = super.getRequirements(context, target, desiredValue);
    if (requirements == null) {
      return null;
    }
    final BondFutureOptionSecurity security = (BondFutureOptionSecurity) target.getTrade().getSecurity();
    final ExternalId underlyingId = security.getUnderlyingId();
    requirements.add(new ValueRequirement(MarketDataRequirementNames.MARKET_VALUE, ComputationTargetType.PRIMITIVE, underlyingId));
    return requirements;
  }

  @Override
  protected ValueProperties getResultProperties(final String currency) {
    final ValueProperties.Builder properties = super.getResultProperties(currency).copy();
    properties.withoutAny(ValuePropertyNames.CALCULATION_METHOD).with(ValuePropertyNames.CALCULATION_METHOD, FUTURES_PRICE);
    return properties.get();
  }

  @Override
  protected ValueProperties getResultProperties(final ValueRequirement desiredValue, final BondFutureOptionSecurity security) {
    final ValueProperties.Builder properties = super.getResultProperties(desiredValue, security).copy();
    properties.withoutAny(ValuePropertyNames.CALCULATION_METHOD).with(ValuePropertyNames.CALCULATION_METHOD, FUTURES_PRICE);
    return properties.get();
  }
}
TOP

Related Classes of com.opengamma.financial.analytics.model.bondfutureoption.BondFutureOptionBlackFromFuturePresentValueFunction

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.