/**
* Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics.model.forex.option.callspreadblack;
import static com.opengamma.engine.value.ValuePropertyNames.CALCULATION_METHOD;
import java.util.Set;
import com.opengamma.OpenGammaRuntimeException;
import com.opengamma.engine.ComputationTarget;
import com.opengamma.engine.function.FunctionCompilationContext;
import com.opengamma.engine.value.ValueProperties;
import com.opengamma.engine.value.ValuePropertyNames;
import com.opengamma.engine.value.ValueRequirement;
import com.opengamma.financial.analytics.model.CalculationPropertyNamesAndValues;
import com.opengamma.financial.analytics.model.forex.option.black.FXOptionBlackSingleValuedFunction;
import com.opengamma.financial.currency.CurrencyPair;
import com.opengamma.financial.security.FinancialSecurity;
import com.opengamma.financial.security.option.FXDigitalOptionSecurity;
import com.opengamma.financial.security.option.NonDeliverableFXDigitalOptionSecurity;
/**
*
*/
public abstract class FXDigitalCallSpreadBlackSingleValuedFunction extends FXOptionBlackSingleValuedFunction {
public FXDigitalCallSpreadBlackSingleValuedFunction(final String valueRequirementName) {
super(valueRequirementName);
}
@Override
public Set<ValueRequirement> getRequirements(final FunctionCompilationContext context, final ComputationTarget target, final ValueRequirement desiredValue) {
final ValueProperties constraints = desiredValue.getConstraints();
final Set<String> spreads = constraints.getValues(CalculationPropertyNamesAndValues.PROPERTY_CALL_SPREAD_VALUE);
if (spreads == null || spreads.size() != 1) {
return null;
}
return super.getRequirements(context, target, desiredValue);
}
@Override
protected ValueProperties.Builder getResultProperties(final ComputationTarget target) {
final ValueProperties.Builder properties = super.getResultProperties(target)
.withoutAny(CALCULATION_METHOD)
.with(ValuePropertyNames.CALCULATION_METHOD, CalculationPropertyNamesAndValues.CALL_SPREAD_BLACK_METHOD)
.withAny(CalculationPropertyNamesAndValues.PROPERTY_CALL_SPREAD_VALUE);
return properties;
}
@Override
protected ValueProperties.Builder getResultProperties(final ComputationTarget target, final String putCurve, final String putCurveCalculationConfig,
final String callCurve, final String callCurveCalculationConfig, final CurrencyPair baseQuotePair, final ValueProperties optionalProperties) {
final ValueProperties.Builder properties = super.getResultProperties(target, putCurve, putCurveCalculationConfig, callCurve, callCurveCalculationConfig,
baseQuotePair, optionalProperties)
.withoutAny(CALCULATION_METHOD)
.with(ValuePropertyNames.CALCULATION_METHOD, CalculationPropertyNamesAndValues.CALL_SPREAD_BLACK_METHOD)
.withAny(CalculationPropertyNamesAndValues.PROPERTY_CALL_SPREAD_VALUE);
return properties;
}
@Override
protected ValueProperties.Builder getResultProperties(final ComputationTarget target, final ValueRequirement desiredValue, final CurrencyPair baseQuotePair) {
final String callSpread = desiredValue.getConstraint(CalculationPropertyNamesAndValues.PROPERTY_CALL_SPREAD_VALUE);
final ValueProperties.Builder properties = super.getResultProperties(target, desiredValue, baseQuotePair)
.withoutAny(CALCULATION_METHOD)
.with(ValuePropertyNames.CALCULATION_METHOD, CalculationPropertyNamesAndValues.CALL_SPREAD_BLACK_METHOD)
.with(CalculationPropertyNamesAndValues.PROPERTY_CALL_SPREAD_VALUE, callSpread);
return properties;
}
@Override
protected String getResultCurrency(final ComputationTarget target, final CurrencyPair baseQuotePair) {
final FinancialSecurity security = (FinancialSecurity) target.getSecurity();
if (security instanceof FXDigitalOptionSecurity) {
return ((FXDigitalOptionSecurity) target.getSecurity()).getPaymentCurrency().getCode();
} else if (security instanceof NonDeliverableFXDigitalOptionSecurity) {
return ((NonDeliverableFXDigitalOptionSecurity) target.getSecurity()).getPaymentCurrency().getCode();
}
throw new OpenGammaRuntimeException("Can only handle FX digitals and non-deliverable FX digitals; should never happen");
}
}