/** * 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 java.text.DecimalFormat; import org.apache.commons.lang.Validate; import org.threeten.bp.LocalDate; import com.opengamma.OpenGammaRuntimeException; import com.opengamma.financial.convention.expirycalc.ExchangeTradedInstrumentExpiryCalculator; import com.opengamma.financial.convention.expirycalc.IRFutureAndFutureOptionExpiryCalculator; import com.opengamma.id.ExternalId; import com.opengamma.id.ExternalScheme; /** * Provider of Interest Rate Future Instrument ID's. * Tied closely to BloombergIRFutureInstrumentProviderUtils. */ public class BloombergIRFuturePriceCurveInstrumentProvider implements FuturePriceCurveInstrumentProvider<Number> { private static final DecimalFormat FORMATTER = new DecimalFormat("##.###"); static { FORMATTER.setMinimumFractionDigits(3); } private final String _futurePrefix; private final String _postfix; private final String _dataFieldName; private final String _tickerScheme; /** * @param futurePrefix Two character string representing future type. e.g ED, ER, IR (See WIR in BBG) * @param postfix Generally, "Comdty" * @param dataFieldName Expecting MarketDataRequirementNames.MARKET_VALUE * @param tickerScheme Expecting BLOOMBERG_TICKER_WEAK or BLOOMBERG_TICKER */ public BloombergIRFuturePriceCurveInstrumentProvider(final String futurePrefix, final String postfix, final String dataFieldName, String tickerScheme) { Validate.notNull(futurePrefix, "future option prefix"); Validate.notNull(postfix, "postfix"); Validate.notNull(dataFieldName, "data field name"); Validate.notNull(tickerScheme, "tickerScheme was null. Try BLOOMBERG_TICKER_WEAK or BLOOMBERG_TICKER"); _futurePrefix = futurePrefix; _postfix = postfix; _dataFieldName = dataFieldName; _tickerScheme = tickerScheme; } /** If a 4th argument is not provided, constructor uses BLOOMBERG_TICKER_WEAK as its ExternalScheme * @param futurePrefix Two character string representing future type. e.g ED, ER, IR (See WIR in BBG) * @param postfix Generally, "Comdty" * @param dataFieldName Expecting MarketDataRequirementNames.MARKET_PRICE */ public BloombergIRFuturePriceCurveInstrumentProvider(final String futurePrefix, final String postfix, final String dataFieldName) { Validate.notNull(futurePrefix, "future option prefix"); Validate.notNull(postfix, "postfix"); Validate.notNull(dataFieldName, "data field name"); _futurePrefix = futurePrefix; _postfix = postfix; _dataFieldName = dataFieldName; _tickerScheme = "BLOOMBERG_TICKER_WEAK"; } @Override public ExternalId getInstrument(final Number futureNumber) { throw new OpenGammaRuntimeException("Provider needs a curve date to create interest rate future identifier from futureNumber"); } @Override /** * Provides ExternalID for Bloomberg ticker, eg EDZ3 Comdty, * given a reference date and an integer offset, the n'th subsequent future * The format is _futurePrefix + month + year + _postfix * <p> * Note that midcurve options are written on underlying futures that expire some number of quarters after the option's expiry. * The logic of this is based on the _futurePrefix. * <p> * @param futureNumber n'th future following curve date * @param curveDate date of curve validity; valuation date */ public ExternalId getInstrument(final Number futureNumber, final LocalDate curveDate) { final StringBuffer ticker = new StringBuffer(); ticker.append(_futurePrefix); // nQuartersDelay is used to handle mid-curve options int nQuartersDelay = 0; if ("0R".equals(_futurePrefix)) { nQuartersDelay = 4; } ticker.append(BloombergFutureUtils.getQuarterlyExpiryCodeForFutures(_futurePrefix, futureNumber.intValue() + nQuartersDelay, curveDate)); ticker.append(" "); ticker.append(_postfix); return ExternalId.of(ExternalScheme.of(_tickerScheme), ticker.toString()); } public String getFuturePrefix() { return _futurePrefix; } public String getPostfix() { return _postfix; } @Override public String getTickerScheme() { return _tickerScheme; } @Override public String getDataFieldName() { return _dataFieldName; } @Override public int hashCode() { return getFuturePrefix().hashCode() + getPostfix().hashCode() + getDataFieldName().hashCode(); } @Override public boolean equals(final Object obj) { if (obj == null) { return false; } if (!(obj instanceof BloombergIRFuturePriceCurveInstrumentProvider)) { return false; } final BloombergIRFuturePriceCurveInstrumentProvider other = (BloombergIRFuturePriceCurveInstrumentProvider) obj; return getFuturePrefix().equals(other.getFuturePrefix()) && getPostfix().equals(other.getPostfix()) && getDataFieldName().equals(other.getDataFieldName()); } @Override public ExchangeTradedInstrumentExpiryCalculator getExpiryRuleCalculator() { return IRFutureAndFutureOptionExpiryCalculator.getInstance(); } }