/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics.model.futureoption;
import com.opengamma.engine.ComputationTargetSpecification;
import com.opengamma.engine.target.ComputationTargetType;
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.financial.analytics.model.InstrumentTypeProperties;
import com.opengamma.financial.analytics.model.curve.forward.ForwardCurveValuePropertyNames;
import com.opengamma.financial.analytics.model.volatility.surface.black.BlackVolatilitySurfacePropertyUtils;
import com.opengamma.financial.security.FinancialSecurity;
import com.opengamma.financial.security.FinancialSecurityTypes;
import com.opengamma.financial.security.FinancialSecurityUtils;
import com.opengamma.id.ExternalId;
import com.opengamma.util.money.Currency;
/**
*
*/
public abstract class CommodityFutureOptionFunction extends FutureOptionFunction {
/**
* @param valueRequirementNames The value requirement names
*/
public CommodityFutureOptionFunction(final String... valueRequirementNames) {
super(valueRequirementNames);
}
@Override
public ComputationTargetType getTargetType() {
return FinancialSecurityTypes.COMMODITY_FUTURE_OPTION_SECURITY;
}
@Override
protected ValueRequirement getVolatilitySurfaceRequirement(final ValueRequirement desiredValue, final FinancialSecurity security, final String surfaceName,
final String forwardCurveName, final String surfaceCalculationMethod) {
final ExternalId currencyId = ExternalId.of(Currency.OBJECT_SCHEME, FinancialSecurityUtils.getCurrency(security).getCode());
final String fullSurfaceName = CommodityFutureOptionUtils.getSurfaceName(security, surfaceName);
final String fullForwardCurveName = CommodityFutureOptionUtils.getSurfaceName(security, forwardCurveName);
final ValueRequirement requirement = BlackVolatilitySurfacePropertyUtils.getSurfaceRequirement(desiredValue, ValueProperties.none(), surfaceName, forwardCurveName,
InstrumentTypeProperties.COMMODITY_FUTURE_OPTION, ComputationTargetType.CURRENCY, currencyId);
final ValueProperties.Builder properties = requirement.getConstraints().copy();
properties.withoutAny(ValuePropertyNames.SURFACE).with(ValuePropertyNames.SURFACE, fullSurfaceName);
properties.withoutAny(ValuePropertyNames.CURVE).with(ValuePropertyNames.CURVE, fullForwardCurveName);
return new ValueRequirement(requirement.getValueName(), requirement.getTargetReference(), properties.get());
}
@Override
protected ValueRequirement getForwardCurveRequirement(final FinancialSecurity security, final String forwardCurveName, final String forwardCurveCalculationMethod) {
final Currency currency = FinancialSecurityUtils.getCurrency(security);
final String fullCurveName = CommodityFutureOptionUtils.getSurfaceName(security, forwardCurveName);
final ValueProperties properties = ValueProperties.builder()
.with(ValuePropertyNames.CURVE, fullCurveName)
.with(ForwardCurveValuePropertyNames.PROPERTY_FORWARD_CURVE_CALCULATION_METHOD, forwardCurveCalculationMethod)
.get();
return new ValueRequirement(ValueRequirementNames.FORWARD_CURVE, ComputationTargetSpecification.of(currency), properties);
}
@Override
protected String getSurfaceName(final FinancialSecurity security, final String surfaceName) {
return CommodityFutureOptionUtils.getSurfaceNameWithoutTicker(security, surfaceName);
}
}