/** * Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.analytics.volatility.surface; import org.apache.commons.lang.Validate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.threeten.bp.LocalDate; import org.threeten.bp.format.DateTimeFormatter; import com.opengamma.OpenGammaRuntimeException; import com.opengamma.core.id.ExternalSchemes; import com.opengamma.id.ExternalId; import com.opengamma.id.ExternalScheme; /** * Generates equity option Bloomberg ticker codes from ATM strike (set via init()), tenor, double and date). * @deprecated This has been replaced by BloombergEquityFutureOptionVolatilitySurfaceInstrumentProvider */ @Deprecated public class BloombergEquityOptionVolatilitySurfaceInstrumentProvider implements SurfaceInstrumentProvider<LocalDate, Double> { private static final Logger s_logger = LoggerFactory.getLogger(BloombergEquityOptionVolatilitySurfaceInstrumentProvider.class); private static final ExternalScheme SCHEME = ExternalSchemes.BLOOMBERG_TICKER_WEAK; private final String _underlyingPrefix; //expecting something like DJX private final String _postfix; //expecting Index or Equity private final String _dataFieldName; //expecting MarketDataRequirementNames.MARKET_VALUE private static final DateTimeFormatter s_dateFormatter = DateTimeFormatter.ofPattern("MM/dd/yy"); private Boolean _generatePuts; public BloombergEquityOptionVolatilitySurfaceInstrumentProvider(final String underlyingPrefix, final String postfix, final String dataFieldName) { Validate.notNull(underlyingPrefix, "underlying prefix"); Validate.notNull(postfix, "postfix"); Validate.notNull(dataFieldName, "data field name"); _underlyingPrefix = underlyingPrefix; _postfix = postfix; _dataFieldName = dataFieldName; } public void init(final boolean generatePuts) { _generatePuts = generatePuts; } public String getUnderlyingPrefix() { return _underlyingPrefix; } public String getPostfix() { return _postfix; } @Override public String getDataFieldName() { return _dataFieldName; } @Override public ExternalId getInstrument(final LocalDate expiry, final Double strike) { throw new OpenGammaRuntimeException("Need surface date to calculate expiry"); } @Override public ExternalId getInstrument(final LocalDate expiry, final Double strike, final LocalDate surfaceDate) { return createEquityOptionVolatilityCode(expiry, strike); } private ExternalId createEquityOptionVolatilityCode(final LocalDate expiry, final Double strike) { if (_generatePuts == null) { s_logger.error("Cannot create option volatility code until atm strike is set (use init method)"); } final StringBuffer ticker = new StringBuffer(); ticker.append(_underlyingPrefix); ticker.append(" "); final String formattedDate = s_dateFormatter.format(expiry); ticker.append(formattedDate); ticker.append(" "); // TODO: check this logic if (_generatePuts) { ticker.append("P"); } else { ticker.append("C"); } ticker.append(strike); ticker.append(" "); ticker.append(_postfix); return ExternalId.of(SCHEME, ticker.toString()); } @Override public int hashCode() { return getUnderlyingPrefix().hashCode() + getPostfix().hashCode() + getDataFieldName().hashCode(); } @Override public boolean equals(final Object obj) { if (obj == null) { return false; } if (!(obj instanceof BloombergEquityOptionVolatilitySurfaceInstrumentProvider)) { return false; } final BloombergEquityOptionVolatilitySurfaceInstrumentProvider other = (BloombergEquityOptionVolatilitySurfaceInstrumentProvider) obj; return getUnderlyingPrefix().equals(other.getUnderlyingPrefix()) && getPostfix().equals(other.getPostfix()) && getDataFieldName().equals(other.getDataFieldName()); } }