/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.currency; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.opengamma.core.config.impl.ConfigItem; import com.opengamma.core.id.ExternalSchemes; import com.opengamma.core.value.MarketDataRequirementNames; import com.opengamma.engine.target.ComputationTargetType; import com.opengamma.engine.value.ValueRequirement; import com.opengamma.id.ExternalId; import com.opengamma.id.VersionCorrection; import com.opengamma.master.config.ConfigMaster; import com.opengamma.master.config.ConfigMasterUtils; import com.opengamma.master.config.impl.MasterConfigSource; import com.opengamma.util.money.Currency; /** * Loads a default currency matrix into the configuration database. */ public class CurrencyMatrixConfigPopulator { private static final Logger s_logger = LoggerFactory.getLogger(CurrencyMatrixConfigPopulator.class); /** * Bloomberg currency matrix config name */ public static final String BLOOMBERG_LIVE_DATA = "BloombergLiveData"; /** * Synthetic currency matrix config name */ public static final String SYNTHETIC_LIVE_DATA = "SyntheticLiveData"; public static ConfigMaster populateCurrencyMatrixConfigMaster(final ConfigMaster cfgMaster) { final CurrencyPairs currencies = new MasterConfigSource(cfgMaster).getSingle(CurrencyPairs.class, CurrencyPairs.DEFAULT_CURRENCY_PAIRS, VersionCorrection.LATEST); storeCurrencyMatrix(cfgMaster, BLOOMBERG_LIVE_DATA, createBloombergConversionMatrix(currencies)); storeCurrencyMatrix(cfgMaster, SYNTHETIC_LIVE_DATA, createSyntheticConversionMatrix(currencies)); return cfgMaster; } private static void storeCurrencyMatrix(final ConfigMaster cfgMaster, final String name, final CurrencyMatrix currencyMatrix) { final ConfigItem<CurrencyMatrix> doc = ConfigItem.of(currencyMatrix, name, CurrencyMatrix.class); doc.setName(name); ConfigMasterUtils.storeByName(cfgMaster, doc); } public static CurrencyMatrix createBloombergConversionMatrix(final CurrencyPairs currencies) { final SimpleCurrencyMatrix matrix = new SimpleCurrencyMatrix(); for (final CurrencyPair pair : currencies.getPairs()) { matrix.setLiveData(pair.getCounter(), pair.getBase(), new ValueRequirement(MarketDataRequirementNames.MARKET_VALUE, ComputationTargetType.PRIMITIVE, ExternalId.of(ExternalSchemes.BLOOMBERG_TICKER.toString(), pair.getBase().getCode() + pair.getCounter().getCode() + " Curncy"))); } dumpMatrix(matrix); return matrix; } public static CurrencyMatrix createSyntheticConversionMatrix(final CurrencyPairs currencies) { final SimpleCurrencyMatrix matrix = new SimpleCurrencyMatrix(); final Currency commonCross = Currency.USD; for (final CurrencyPair pair : currencies.getPairs()) { if (commonCross.equals(pair.getBase()) || commonCross.equals(pair.getCounter())) { matrix.setLiveData(pair.getCounter(), pair.getBase(), new ValueRequirement(MarketDataRequirementNames.MARKET_VALUE, ComputationTargetType.PRIMITIVE, ExternalId.of(ExternalSchemes.OG_SYNTHETIC_TICKER.getName(), pair.getBase().getCode() + pair.getCounter().getCode()))); } } for (final CurrencyPair pair : currencies.getPairs()) { if (!commonCross.equals(pair.getBase()) && !commonCross.equals(pair.getCounter())) { matrix.setCrossConversion(pair.getCounter(), pair.getBase(), commonCross); } } dumpMatrix(matrix); return matrix; } public static void dumpMatrix(final CurrencyMatrix matrix) { final StringBuilder sb = new StringBuilder(); sb.append('\n'); for (final Currency x : matrix.getTargetCurrencies()) { sb.append('\t').append(x.getCode()); } for (final Currency y : matrix.getSourceCurrencies()) { sb.append('\n').append(y.getCode()); for (final Currency x : matrix.getTargetCurrencies()) { sb.append('\t').append(matrix.getConversion(y, x)); } } s_logger.debug("Currency matrix = {}", sb); } }