/**
* 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.instrument.InstrumentDefinition;
import com.opengamma.analytics.financial.instrument.future.BondFutureDefinition;
import com.opengamma.analytics.financial.instrument.future.BondFuturesOptionPremiumSecurityDefinition;
import com.opengamma.analytics.financial.instrument.future.BondFuturesOptionMarginSecurityDefinition;
import com.opengamma.analytics.financial.instrument.future.BondFuturesSecurityDefinition;
import com.opengamma.core.convention.ConventionSource;
import com.opengamma.core.holiday.HolidaySource;
import com.opengamma.core.legalentity.LegalEntitySource;
import com.opengamma.core.region.RegionSource;
import com.opengamma.core.security.SecuritySource;
import com.opengamma.financial.convention.ConventionBundleSource;
import com.opengamma.financial.security.FinancialSecurityVisitorAdapter;
import com.opengamma.financial.security.future.BondFutureSecurity;
import com.opengamma.financial.security.option.BondFutureOptionSecurity;
import com.opengamma.financial.security.option.OptionType;
import com.opengamma.id.ExternalId;
import com.opengamma.id.ExternalIdBundle;
import com.opengamma.util.ArgumentChecker;
/**
* Bond future option converter to create OG-Analytics representations from OG-Financial types.
*/
public class BondFutureOptionSecurityConverter extends FinancialSecurityVisitorAdapter<InstrumentDefinition<?>> {
/**
* SecuritySource used to look up underlying bond future.
*/
private final SecuritySource _securitySource;
/**
* Converter used for premium based bond future option.
*/
private final BondFutureSecurityConverter _underlyingConverter;
/**
* Converter used for margin based bond future option.
*/
private final BondAndBondFutureTradeConverter _bondAndBondFutureConverter;
/**
* Constructs a bond future option converter.
* @param holidaySource the holiday source, not null.
* @param conventionBundleSource the convention bundle source, not null.
* @param regionSource the region source, not null.
* @param securitySource the security source, not null.
* @param conventionSource the convention source, not null.
* @param legalEntitySource the legal entity source, not null.
*/
public BondFutureOptionSecurityConverter(final HolidaySource holidaySource,
final ConventionBundleSource conventionBundleSource,
final RegionSource regionSource,
final SecuritySource securitySource,
final ConventionSource conventionSource,
final LegalEntitySource legalEntitySource) {
ArgumentChecker.notNull(holidaySource, "holidaySource");
ArgumentChecker.notNull(conventionBundleSource, "conventionBundleSource");
ArgumentChecker.notNull(regionSource, "regionSource");
ArgumentChecker.notNull(securitySource, "securitySource");
ArgumentChecker.notNull(conventionSource, "conventionSource");
ArgumentChecker.notNull(legalEntitySource, "legalEntitySource");
final BondSecurityConverter bondSecurityConverter = new BondSecurityConverter(holidaySource, conventionBundleSource, regionSource);
_underlyingConverter = new BondFutureSecurityConverter(securitySource, bondSecurityConverter);
_securitySource = securitySource;
_bondAndBondFutureConverter = new BondAndBondFutureTradeConverter(holidaySource, conventionBundleSource, conventionSource, regionSource, securitySource, legalEntitySource);
}
@Override
public InstrumentDefinition<?> visitBondFutureOptionSecurity(final BondFutureOptionSecurity security) {
ArgumentChecker.notNull(security, "security");
final ExternalId underlyingIdentifier = security.getUnderlyingId();
final BondFutureSecurity underlyingSecurity = ((BondFutureSecurity) _securitySource.getSingle(ExternalIdBundle.of(underlyingIdentifier)));
if (underlyingSecurity == null) {
throw new OpenGammaRuntimeException("Underlying security " + underlyingIdentifier + " was not found in database");
}
final ZonedDateTime expirationDate = security.getExpiry().getExpiry();
final double strike = security.getStrike();
final boolean isCall = security.getOptionType() == OptionType.CALL ? true : false;
final BondFuturesSecurityDefinition underlyingFuture = _bondAndBondFutureConverter.getBondFuture(underlyingSecurity);
if (security.isMargined()) {
return new BondFuturesOptionMarginSecurityDefinition(underlyingFuture, expirationDate, expirationDate, strike, isCall);
}
return new BondFuturesOptionPremiumSecurityDefinition(underlyingFuture, expirationDate, strike, isCall);
}
}