/**
* 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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.threeten.bp.LocalDate;
import org.threeten.bp.LocalTime;
import org.threeten.bp.OffsetTime;
import org.threeten.bp.ZoneId;
import org.threeten.bp.ZoneOffset;
import org.threeten.bp.ZonedDateTime;
import com.opengamma.OpenGammaRuntimeException;
import com.opengamma.analytics.financial.instrument.InstrumentDefinition;
import com.opengamma.analytics.financial.instrument.future.BondFuturesOptionPremiumSecurityDefinition;
import com.opengamma.analytics.financial.instrument.future.BondFuturesOptionPremiumTransactionDefinition;
import com.opengamma.analytics.financial.instrument.future.BondFuturesOptionMarginSecurityDefinition;
import com.opengamma.analytics.financial.instrument.future.BondFuturesOptionMarginTransactionDefinition;
import com.opengamma.core.position.Trade;
import com.opengamma.financial.security.option.BondFutureOptionSecurity;
import com.opengamma.util.ArgumentChecker;
/**
* Converter used to create a bond future option OG-Analytics representation from an OG-Financial type from a trade. The trade
* is needed for conversion to retrieve details such as last traded date and quantity that are only held on the trade itself.
*/
public class BondFutureOptionTradeConverter implements TradeConverter {
/**
* Converter used to convert the bond future option of the trade.
*/
private final BondFutureOptionSecurityConverter _securityConverter;
/**
* Constructs a bond future option converter.
* @param securityConverter the bond future option converter, not null.
*/
public BondFutureOptionTradeConverter(final BondFutureOptionSecurityConverter securityConverter) {
_securityConverter = ArgumentChecker.notNull(securityConverter, "security converter");
}
@Override
public InstrumentDefinition<?> convert(final Trade trade) {
ArgumentChecker.notNull(trade, "trade");
ArgumentChecker.isTrue(trade.getSecurity() instanceof BondFutureOptionSecurity, "Can only handle trades with security type BondFutureOptionSecurity");
BondFutureOptionSecurity security = (BondFutureOptionSecurity) trade.getSecurity();
final InstrumentDefinition<?> securityDefinition = security.accept(_securityConverter);
ArgumentChecker.notNull(trade.getPremium(), "Bond future option trade must have a premium set. The interpretation of premium is the market price, without unit, i.e. not %");
final int quantity = trade.getQuantity().intValue();
final double premium = trade.getPremium();
// Get DateTime of trade to add to Transaction. Handle case when time isn't available.
final ZonedDateTime tradeDate;
LocalDate tradeDateLocal = trade.getTradeDate();
OffsetTime tradeTime = trade.getTradeTime();
if (tradeDateLocal == null) {
throw new OpenGammaRuntimeException("Trade did not contain a tradeDate:" + trade.getUniqueId());
} else if (tradeTime == null) {
s_logger.debug("Trade did not contain a tradeTime. Using noon UTC. " + trade.getUniqueId());
tradeDate = ZonedDateTime.of(tradeDateLocal, LocalTime.of(12, 0), ZoneId.of("UTC"));
} else {
tradeDate = trade.getTradeDate().atTime(trade.getTradeTime()).atZoneSameInstant(ZoneOffset.UTC); //TODO get the real time zone
}
if (security.isMargined()) {
final BondFuturesOptionMarginSecurityDefinition option = (BondFuturesOptionMarginSecurityDefinition) securityDefinition;
return new BondFuturesOptionMarginTransactionDefinition(option, quantity, tradeDate, premium);
}
final BondFuturesOptionPremiumSecurityDefinition underlyingOption = (BondFuturesOptionPremiumSecurityDefinition) securityDefinition;
return new BondFuturesOptionPremiumTransactionDefinition(underlyingOption, quantity, tradeDate, premium);
}
private static final Logger s_logger = LoggerFactory.getLogger(BondFutureOptionTradeConverter.class);
}