/** * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.analytics.fxforwardcurve; import java.util.Collections; import java.util.Map; import com.google.common.collect.ImmutableList; import com.opengamma.core.config.impl.ConfigItem; import com.opengamma.core.value.MarketDataRequirementNames; import com.opengamma.master.config.ConfigMaster; import com.opengamma.master.config.ConfigMasterUtils; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.money.Currency; import com.opengamma.util.money.UnorderedCurrencyPair; import com.opengamma.util.time.Tenor; import com.opengamma.util.tuple.Triple; /** * Populates the {@link ConfigMaster} with FX forward curve definitions and specifications. */ public class FXForwardCurveConfigPopulator { /** The separator */ private static final String SEPARATOR = "_"; /** The instrument type name */ private static final String INSTRUMENT_TYPE = "FX_FORWARD"; /** Tenors for non-JPY instruments */ private static final ImmutableList<Tenor> TENORS = ImmutableList.of(Tenor.ofDays(7), Tenor.ofDays(14), Tenor.ofDays(21), Tenor.ofMonths(1), Tenor.ofMonths(3), Tenor.ofMonths(6), Tenor.ofMonths(9), Tenor.ofMonths(12), Tenor.ofYears(5), Tenor.ofYears(10)); /** * @param configMaster The configuration master, not null */ public FXForwardCurveConfigPopulator(final ConfigMaster configMaster) { ArgumentChecker.notNull(configMaster, "configuration master"); populateFXForwardCurveConfigMaster(configMaster); } /** * Populates the configuration master with a single EUR/USD FX forward curve definition and specification called DEFAULT. * @param configMaster The configuration master, not null * @return The populated configuration master */ public static ConfigMaster populateFXForwardCurveConfigMaster(final ConfigMaster configMaster) { return populateFXForwardCurveConfigMaster(configMaster, Collections.singletonMap(UnorderedCurrencyPair.of(Currency.EUR, Currency.USD), new Triple<>("DEFAULT", "EUR", "EUR"))); } /** * Populates the configuration master curves. * @param configMaster The configuration master, not null * @param pairs The currency pairs and (surface name, forward prefix and spot prefix) information, not null * @return The populated configuration master */ public static ConfigMaster populateFXForwardCurveConfigMaster(final ConfigMaster configMaster, final Map<UnorderedCurrencyPair, Triple<String, String, String>> pairs) { ArgumentChecker.notNull(configMaster, "configuration master"); ArgumentChecker.notNull(pairs, "pairs, names and tickers"); for (final Map.Entry<UnorderedCurrencyPair, Triple<String, String, String>> pair : pairs.entrySet()) { populateCurveSpecifications(configMaster, pair.getKey(), pair.getValue()); populateCurveDefinitions(configMaster, pair.getKey(), pair.getValue().getFirst()); } return configMaster; } private static void populateCurveDefinitions(final ConfigMaster configMaster, final UnorderedCurrencyPair target, final String name) { final String fullName = name + SEPARATOR + target.toString() + SEPARATOR + INSTRUMENT_TYPE; final FXForwardCurveDefinition definition = FXForwardCurveDefinition.of(fullName, target, TENORS); ConfigMasterUtils.storeByName(configMaster, makeConfig(definition)); } private static void populateCurveSpecifications(final ConfigMaster configMaster, final UnorderedCurrencyPair target, final Triple<String, String, String> triple) { final FXForwardCurveInstrumentProvider curveInstrumentProvider = new BloombergFXForwardCurveInstrumentProvider(triple.getSecond(), "Curncy", triple.getThird(), MarketDataRequirementNames.MARKET_VALUE); final String fullName = triple.getFirst() + SEPARATOR + target.toString() + SEPARATOR + INSTRUMENT_TYPE; final FXForwardCurveSpecification spec = new FXForwardCurveSpecification(fullName, target, curveInstrumentProvider); ConfigMasterUtils.storeByName(configMaster, makeConfig(spec)); } private static ConfigItem<FXForwardCurveDefinition> makeConfig(final FXForwardCurveDefinition definition) { final ConfigItem<FXForwardCurveDefinition> config = ConfigItem.of(definition); config.setName(definition.getName()); return config; } private static ConfigItem<FXForwardCurveSpecification> makeConfig(final FXForwardCurveSpecification specification) { final ConfigItem<FXForwardCurveSpecification> config = ConfigItem.of(specification); config.setName(specification.getName()); return config; } }