/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.bbg.loader;
import static com.opengamma.bbg.BloombergConstants.BLOOMBERG_INTEREST_RATE_TYPE;
import static com.opengamma.bbg.BloombergConstants.FIELD_CRNCY;
import static com.opengamma.bbg.BloombergConstants.FIELD_FUTURES_CATEGORY;
import static com.opengamma.bbg.BloombergConstants.FIELD_FUT_LAST_TRADE_DT;
import static com.opengamma.bbg.BloombergConstants.FIELD_FUT_LONG_NAME;
import static com.opengamma.bbg.BloombergConstants.FIELD_FUT_TRADING_HRS;
import static com.opengamma.bbg.BloombergConstants.FIELD_FUT_VAL_PT;
import static com.opengamma.bbg.BloombergConstants.FIELD_ID_BBG_UNIQUE;
import static com.opengamma.bbg.BloombergConstants.FIELD_ID_CUSIP;
import static com.opengamma.bbg.BloombergConstants.FIELD_ID_ISIN;
import static com.opengamma.bbg.BloombergConstants.FIELD_ID_MIC_PRIM_EXCH;
import static com.opengamma.bbg.BloombergConstants.FIELD_ID_SEDOL1;
import static com.opengamma.bbg.BloombergConstants.FIELD_PARSEKYABLE_DES;
import static com.opengamma.bbg.BloombergConstants.FIELD_SECURITY_DES;
import static com.opengamma.bbg.util.BloombergDataUtils.isValidField;
import java.util.Collections;
import java.util.Map;
import java.util.Set;
import org.fudgemsg.FudgeMsg;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.opengamma.bbg.referencedata.ReferenceDataProvider;
import com.opengamma.bbg.util.BloombergDataUtils;
import com.opengamma.core.id.ExternalSchemes;
import com.opengamma.financial.security.future.FederalFundsFutureSecurity;
import com.opengamma.financial.security.future.FutureSecurity;
import com.opengamma.financial.security.future.InterestRateFutureSecurity;
import com.opengamma.id.ExternalId;
import com.opengamma.master.security.ManageableSecurity;
import com.opengamma.util.money.Currency;
import com.opengamma.util.time.Expiry;
/**
* Loads the data for an Interest Rate Future from Bloomberg.
*/
public class InterestRateFutureLoader extends SecurityLoader {
/** Logger. */
private static final Logger s_logger = LoggerFactory.getLogger(InterestRateFutureLoader.class);
/**
* The fields to load from Bloomberg.
*/
private static final Set<String> BLOOMBERG_INTEREST_RATE_FUTURE_FIELDS = Collections.unmodifiableSet(Sets.newHashSet(
FIELD_FUT_LONG_NAME,
FIELD_FUT_LAST_TRADE_DT,
FIELD_FUT_TRADING_HRS,
FIELD_ID_MIC_PRIM_EXCH, // trading exchange
FIELD_CRNCY,
FIELD_FUTURES_CATEGORY,
FIELD_SECURITY_DES,
FIELD_PARSEKYABLE_DES,
FIELD_ID_BBG_UNIQUE,
FIELD_ID_CUSIP,
FIELD_ID_ISIN,
FIELD_ID_SEDOL1,
FIELD_FUT_VAL_PT));
private static final Map<String, String> BBGCODE_UNDERLYING = Maps.newHashMap();
static {
// Mid-curves
for (int i : new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }) {
BBGCODE_UNDERLYING.put(i + "E", "US0003M Index");
BBGCODE_UNDERLYING.put(i + "R", "EUR003M Index");
BBGCODE_UNDERLYING.put(i + "L", "BP0003M Index");
}
BBGCODE_UNDERLYING.put("ED", "US0003M Index");
BBGCODE_UNDERLYING.put("EM", "US0001M Index");
BBGCODE_UNDERLYING.put("ER", "EUR003M Index");
BBGCODE_UNDERLYING.put("FP", "EUR003M Index");
BBGCODE_UNDERLYING.put("L ", "BP0003M Index");
BBGCODE_UNDERLYING.put("ES", "SF0003M Index");
BBGCODE_UNDERLYING.put("EF", "JY0003M Index");
BBGCODE_UNDERLYING.put("IR", "BBSW3M Index");
BBGCODE_UNDERLYING.put("BA", "CDOR03 Index");
BBGCODE_UNDERLYING.put("EY", "TI0003M Index");
BBGCODE_UNDERLYING.put("FF", "FEDL01 Index");
}
/**
* The valid Bloomberg future categories for IR Futures
*/
public static final Set<String> VALID_FUTURE_CATEGORIES = ImmutableSet.of(BLOOMBERG_INTEREST_RATE_TYPE);
/**
* Creates an instance. See {@link FutureSecurity}
* @param referenceDataProvider the provider, not null
*/
public InterestRateFutureLoader(ReferenceDataProvider referenceDataProvider) {
super(s_logger, referenceDataProvider, SecurityType.INTEREST_RATE_FUTURE);
}
//-------------------------------------------------------------------------
@Override
protected ManageableSecurity createSecurity(FudgeMsg fieldData) {
String expiryDate = fieldData.getString(FIELD_FUT_LAST_TRADE_DT);
String futureTradingHours = fieldData.getString(FIELD_FUT_TRADING_HRS);
String micExchangeCode = fieldData.getString(FIELD_ID_MIC_PRIM_EXCH);
String currencyStr = fieldData.getString(FIELD_CRNCY);
String category = BloombergDataUtils.removeDuplicateWhiteSpace(fieldData.getString(FIELD_FUTURES_CATEGORY), " ");
String name = BloombergDataUtils.removeDuplicateWhiteSpace(fieldData.getString(FIELD_FUT_LONG_NAME), " ");
String bbgUnique = fieldData.getString(FIELD_ID_BBG_UNIQUE);
double unitAmount = 2500;
try {
unitAmount = Double.valueOf(fieldData.getString(FIELD_FUT_VAL_PT));
} catch (NumberFormatException e) {
if (!currencyStr.equals("AUD")) { // Review: In AUD, you don't really have IR Futures, you have futures on Bank Bills..
throw e;
}
}
unitAmount *= 100.0; // Scale unitAmount as we quote prices without units, while Bloomberg's is in percent, ie. Bbg's 99.5 is our 0.995
if (!isValidField(bbgUnique)) {
s_logger.warn("bbgUnique is null. Cannot construct interest rate future security.");
return null;
}
if (!isValidField(expiryDate)) {
s_logger.warn("expiry date is null. Cannot construct interest rate future security.");
return null;
}
if (!isValidField(futureTradingHours)) {
s_logger.warn("futures trading hours is null. Cannot construct interest rate future security.");
return null;
}
if (!isValidField(micExchangeCode)) {
s_logger.warn("settlement exchange is null. Cannot construct interest rate future security.");
return null;
}
if (!isValidField(currencyStr)) {
s_logger.warn("currency is null. Cannot construct interest rate future security.");
return null;
}
if (!isValidField(category)) {
s_logger.warn("No category provided from field {}. Cannot construct interest rate future security.", FIELD_FUTURES_CATEGORY);
return null;
}
Expiry expiry = decodeExpiry(expiryDate, futureTradingHours);
if (expiry == null) {
s_logger.warn("expiry is null. Cannot construct interest rate future security.");
return null;
}
if (!isValidField(name)) {
s_logger.warn("name is null. Cannot construct interest rate future security.");
return null;
}
Currency currency = Currency.parse(currencyStr);
String bbgCode = fieldData.getString(FIELD_PARSEKYABLE_DES);
String bbgCode2 = bbgCode.substring(0, 2); // 2 first char
String id = BBGCODE_UNDERLYING.get(bbgCode2);
if (id == null) {
s_logger.warn("Cannot get underlying for future " + bbgCode2);
return null;
}
ExternalId underlyingIdentifier = ExternalId.of(ExternalSchemes.BLOOMBERG_TICKER, id);
ManageableSecurity security;
if ("FEDL01 Index".equals(id)) {
security = new FederalFundsFutureSecurity(expiry, micExchangeCode, micExchangeCode, currency, unitAmount, underlyingIdentifier, category);
} else {
security = new InterestRateFutureSecurity(expiry, micExchangeCode, micExchangeCode, currency, unitAmount, underlyingIdentifier, category);
}
security.setName(name);
// set identifiers
parseIdentifiers(fieldData, security);
return security;
}
@Override
protected Set<String> getBloombergFields() {
return BLOOMBERG_INTEREST_RATE_FUTURE_FIELDS;
}
}