@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());
}
}