/** * 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.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_MARKET_SECTOR_DES; import static com.opengamma.bbg.BloombergConstants.FIELD_PARSEKYABLE_DES; import static com.opengamma.bbg.BloombergConstants.FIELD_SETTLE_DT; import static com.opengamma.bbg.BloombergConstants.FIELD_UNDL_SPOT_TICKER; import static com.opengamma.bbg.util.BloombergDataUtils.isValidField; import java.util.Collections; import java.util.Set; import org.fudgemsg.FudgeMsg; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.collect.Sets; import com.opengamma.bbg.BloombergConstants; import com.opengamma.bbg.referencedata.ReferenceDataProvider; import com.opengamma.bbg.util.BloombergDataUtils; import com.opengamma.core.id.ExternalSchemes; import com.opengamma.financial.security.future.EquityIndexDividendFutureSecurity; 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 a equity dividend Future from Bloomberg. */ public class EquityDividendFutureLoader extends SecurityLoader { /** Logger. */ private static final Logger s_logger = LoggerFactory.getLogger(EquityDividendFutureLoader.class); /** * The fields to load from Bloomberg. */ private static final Set<String> BLOOMBERG_EQUITY_DIVIDEND_FUTURE_FIELDS = Collections.unmodifiableSet(Sets.newHashSet( FIELD_MARKET_SECTOR_DES, 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_FUT_TRADING_UNITS, FIELD_PARSEKYABLE_DES, FIELD_SETTLE_DT, FIELD_FUTURES_CATEGORY, // FIELD_FUT_CONT_SIZE, FIELD_UNDL_SPOT_TICKER, FIELD_ID_BBG_UNIQUE, FIELD_ID_CUSIP, FIELD_ID_ISIN, FIELD_ID_SEDOL1, FIELD_FUT_VAL_PT)); /** * The valid Bloomberg future categories for Equity Dividend Futures */ public static final Set<String> VALID_FUTURE_CATEGORIES = Collections.unmodifiableSet(Sets.newHashSet( BloombergConstants.BBG_STOCK_FUTURE_TYPE)); /** * Creates an instance. * @param referenceDataProvider the provider, not null */ public EquityDividendFutureLoader(ReferenceDataProvider referenceDataProvider) { super(s_logger, referenceDataProvider, SecurityType.EQUITY_DIVIDEND_FUTURE); } //------------------------------------------------------------------------- @Override protected ManageableSecurity createSecurity(FudgeMsg fieldData) { String marketSectorDes = fieldData.getString(FIELD_MARKET_SECTOR_DES); 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 settleDate = fieldData.getString(FIELD_SETTLE_DT); String category = BloombergDataUtils.removeDuplicateWhiteSpace(fieldData.getString(FIELD_FUTURES_CATEGORY), " "); // Double unitNumber = fieldData.getDouble(FIELD_FUT_CONT_SIZE); // String unitName = fieldData.getString(FIELD_FUT_TRADING_UNITS); String underlyingTicker = fieldData.getString(FIELD_UNDL_SPOT_TICKER); String name = BloombergDataUtils.removeDuplicateWhiteSpace(fieldData.getString(FIELD_FUT_LONG_NAME), " "); String bbgUnique = fieldData.getString(FIELD_ID_BBG_UNIQUE); double unitAmount = Double.valueOf(fieldData.getString(FIELD_FUT_VAL_PT)); if (!isValidField(marketSectorDes)) { s_logger.warn("market sector description is null, cannot construct equity dividend future security"); return null; } if (!isValidField(bbgUnique)) { s_logger.warn("bbgUnique is null, cannot construct equity dividend future security"); return null; } if (!isValidField(expiryDate)) { s_logger.warn("expiry date is null, cannot construct equity dividend future security"); return null; } if (!isValidField(settleDate)) { s_logger.warn("settle date is null, cannot construct equity dividend future security"); return null; } if (!isValidField(category)) { s_logger.warn("futures category is null, cannot construct equity dividend index future security"); return null; } if (!isValidField(futureTradingHours)) { s_logger.warn("futures trading hours is null, cannot construct equity dividend index future security"); return null; } if (!isValidField(micExchangeCode)) { s_logger.warn("settlement exchange is null, cannot construct equity dividend future security"); return null; } if (!isValidField(currencyStr)) { s_logger.info("currency is null, cannot construct equity dividend future security"); return null; } // if (!isValidField(unitName)) { // s_logger.info("unitName is null, cannot construct equity dividend future security"); // return null; // } // if (unitNumber == null) { // s_logger.info("unitNumber is null, cannot construct equity dividend future security"); // return null; // } ExternalId underlying = null; if (underlyingTicker != null) { if (BloombergDataUtils.isValidBloombergTicker(underlyingTicker)) { underlying = ExternalSchemes.bloombergTickerSecurityId(underlyingTicker); } else { underlying = ExternalSchemes.bloombergTickerSecurityId(underlyingTicker + " " + marketSectorDes); } } Expiry expiry = decodeExpiry(expiryDate, futureTradingHours); if (expiry == null) { return null; } Expiry settle = decodeExpiry(settleDate, futureTradingHours); if (settle == null) { s_logger.info("Invalid settlement date, cannot construct equity dividend future security"); return null; } Currency currency = Currency.parse(currencyStr); EquityIndexDividendFutureSecurity security = new EquityIndexDividendFutureSecurity(expiry, micExchangeCode, micExchangeCode, currency, unitAmount, settle.getExpiry(), underlying, category); security.setName(name); // set identifiers parseIdentifiers(fieldData, security); return security; } @Override protected Set<String> getBloombergFields() { return BLOOMBERG_EQUITY_DIVIDEND_FUTURE_FIELDS; } }