/**
* 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.localvol;
import org.threeten.bp.ZonedDateTime;
import com.opengamma.analytics.financial.model.option.pricing.analytic.formula.EuropeanVanillaOption;
import com.opengamma.analytics.util.time.TimeCalculator;
import com.opengamma.engine.ComputationTarget;
import com.opengamma.engine.target.ComputationTargetReference;
import com.opengamma.engine.target.ComputationTargetType;
import com.opengamma.financial.analytics.model.InstrumentTypeProperties;
import com.opengamma.financial.analytics.model.forex.FXUtils;
import com.opengamma.financial.analytics.model.volatility.local.LocalVolatilityForwardPDEFunction;
import com.opengamma.financial.security.FinancialSecurity;
import com.opengamma.financial.security.FinancialSecurityTypes;
import com.opengamma.financial.security.option.FXOptionSecurity;
import com.opengamma.util.money.Currency;
import com.opengamma.util.money.UnorderedCurrencyPair;
/**
*
*/
public abstract class FXOptionLocalVolatilityForwardPDEFunction extends LocalVolatilityForwardPDEFunction {
public FXOptionLocalVolatilityForwardPDEFunction(final String blackSmileInterpolatorName) {
super(blackSmileInterpolatorName);
}
@Override
public ComputationTargetType getTargetType() {
return FinancialSecurityTypes.FX_OPTION_SECURITY;
}
@Override
protected ComputationTargetReference getVolatilitySurfaceAndForwardCurveTarget(final ComputationTarget target) {
final FXOptionSecurity fxOption = (FXOptionSecurity) target.getSecurity();
return ComputationTargetType.UNORDERED_CURRENCY_PAIR.specification(UnorderedCurrencyPair.of(fxOption.getCallCurrency(), fxOption.getPutCurrency()));
}
@Override
protected ComputationTargetReference getDiscountingCurveTarget(final ComputationTarget target) {
final FXOptionSecurity fxOption = (FXOptionSecurity) target.getSecurity();
return ComputationTargetType.CURRENCY.specification(fxOption.getCallCurrency());
}
@Override
protected String getInstrumentType() {
return InstrumentTypeProperties.FOREX;
}
@Override
protected EuropeanVanillaOption getOption(final FinancialSecurity security, final ZonedDateTime date) {
final FXOptionSecurity fxOption = (FXOptionSecurity) security;
final Currency putCurrency = fxOption.getPutCurrency();
final Currency callCurrency = fxOption.getCallCurrency();
double strike;
if (FXUtils.isInBaseQuoteOrder(putCurrency, callCurrency)) {
strike = fxOption.getCallAmount() / fxOption.getPutAmount();
} else {
strike = fxOption.getPutAmount() / fxOption.getCallAmount();
}
final double t = TimeCalculator.getTimeBetween(date, fxOption.getExpiry().getExpiry());
return new EuropeanVanillaOption(strike, t, true); //TODO this shouldn't be hard coded to a call
}
}