/**
* Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics.conversion;
import org.threeten.bp.ZonedDateTime;
import com.opengamma.OpenGammaRuntimeException;
import com.opengamma.analytics.financial.ExerciseDecisionType;
import com.opengamma.analytics.financial.commodity.definition.AgricultureFutureDefinition;
import com.opengamma.analytics.financial.commodity.definition.AgricultureFutureOptionDefinition;
import com.opengamma.analytics.financial.commodity.definition.CommodityFutureOptionDefinition;
import com.opengamma.analytics.financial.commodity.definition.EnergyFutureDefinition;
import com.opengamma.analytics.financial.commodity.definition.EnergyFutureOptionDefinition;
import com.opengamma.analytics.financial.commodity.definition.MetalFutureDefinition;
import com.opengamma.analytics.financial.commodity.definition.MetalFutureOptionDefinition;
import com.opengamma.analytics.financial.instrument.InstrumentDefinition;
import com.opengamma.core.holiday.HolidaySource;
import com.opengamma.core.region.RegionSource;
import com.opengamma.core.security.SecuritySource;
import com.opengamma.financial.convention.ConventionBundleSource;
import com.opengamma.financial.security.ExerciseTypeAnalyticsVisitorAdapter;
import com.opengamma.financial.security.FinancialSecurityVisitorAdapter;
import com.opengamma.financial.security.future.AgricultureFutureSecurity;
import com.opengamma.financial.security.future.CommodityFutureSecurity;
import com.opengamma.financial.security.future.EnergyFutureSecurity;
import com.opengamma.financial.security.future.MetalFutureSecurity;
import com.opengamma.financial.security.option.CommodityFutureOptionSecurity;
import com.opengamma.financial.security.option.OptionType;
import com.opengamma.id.ExternalIdBundle;
import com.opengamma.util.ArgumentChecker;
/**
*
*/
public class CommodityFutureOptionConverter extends FinancialSecurityVisitorAdapter<InstrumentDefinition<?>> {
/** security source */
private final SecuritySource _securitySource;
/** Converter to get underlying future */
private final FutureSecurityConverterDeprecated _futureSecurityConverter;
/**
* @param securitySource The security source, not null
* @param holidaySource The holiday source, not null
* @param conventionSource The convention source, not null
* @param regionSource The region source, not null
*/
public CommodityFutureOptionConverter(final SecuritySource securitySource, final HolidaySource holidaySource, final ConventionBundleSource conventionSource,
final RegionSource regionSource) {
ArgumentChecker.notNull(securitySource, "security source");
_securitySource = securitySource;
final InterestRateFutureSecurityConverterDeprecated irFutureConverter = new InterestRateFutureSecurityConverterDeprecated(holidaySource, conventionSource, regionSource);
final BondSecurityConverter bondConverter = new BondSecurityConverter(holidaySource, conventionSource, regionSource);
final BondFutureSecurityConverter bondFutureConverter = new BondFutureSecurityConverter(securitySource, bondConverter);
_futureSecurityConverter = new FutureSecurityConverterDeprecated(bondFutureConverter);
}
@Override
public CommodityFutureOptionDefinition<?, ?> visitCommodityFutureOptionSecurity(final CommodityFutureOptionSecurity commodityOption) {
ArgumentChecker.notNull(commodityOption, "security");
final ExternalIdBundle underlyingBundle = ExternalIdBundle.of(commodityOption.getUnderlyingId());
final CommodityFutureSecurity underlyingSecurity = (CommodityFutureSecurity) _securitySource.getSingle(underlyingBundle);
if (underlyingSecurity == null) {
throw new OpenGammaRuntimeException("No underlying future found with identifier " + commodityOption.getUnderlyingId());
}
final ZonedDateTime expiry = underlyingSecurity.getExpiry().getExpiry();
final boolean isCall = (commodityOption.getOptionType().equals(OptionType.CALL));
final ExerciseDecisionType exerciseType = commodityOption.getExerciseType().accept(ExerciseTypeAnalyticsVisitorAdapter.getInstance());
if (underlyingSecurity instanceof AgricultureFutureSecurity) {
final AgricultureFutureDefinition underlyingDefinition = (AgricultureFutureDefinition) underlyingSecurity.accept(_futureSecurityConverter);
return new AgricultureFutureOptionDefinition(expiry,
underlyingDefinition,
commodityOption.getStrike() * 100.0, // TODO: Remove when security stops scaling price
exerciseType,
isCall);
} else if (underlyingSecurity instanceof EnergyFutureSecurity) {
final EnergyFutureDefinition underlyingDefinition = (EnergyFutureDefinition) underlyingSecurity.accept(_futureSecurityConverter);
return new EnergyFutureOptionDefinition(expiry,
underlyingDefinition,
commodityOption.getStrike() * 100.0, // TODO: Remove when security stops scaling price
exerciseType,
isCall);
} else if (underlyingSecurity instanceof MetalFutureSecurity) {
final MetalFutureDefinition underlyingDefinition = (MetalFutureDefinition) underlyingSecurity.accept(_futureSecurityConverter);
return new MetalFutureOptionDefinition(expiry,
underlyingDefinition,
commodityOption.getStrike() * 100.0, // TODO: Remove when security stops scaling price
exerciseType,
isCall);
} else {
throw new OpenGammaRuntimeException("Unknown commodity option underlying type " + underlyingSecurity.getClass().getName());
}
}
}