Package com.opengamma.financial.marketdata

Source Code of com.opengamma.financial.marketdata.MarketDataELFunctions

/**
* Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.marketdata;

import com.opengamma.OpenGammaRuntimeException;
import com.opengamma.analytics.financial.model.interestrate.curve.YieldCurve;
import com.opengamma.analytics.math.curve.CurveShiftFunctionFactory;
import com.opengamma.analytics.math.curve.DoublesCurve;
import com.opengamma.core.id.ExternalSchemes;
import com.opengamma.core.security.Security;
import com.opengamma.engine.target.ComputationTargetType;
import com.opengamma.financial.expression.UserExpressionParser;
import com.opengamma.id.ExternalId;
import com.opengamma.id.ExternalIdBundle;
import com.opengamma.id.UniqueId;
import com.opengamma.util.money.Currency;
import com.opengamma.util.money.StandardCurrencyPairs;
import com.opengamma.util.tuple.Pair;

/**
* Static functions for the EL compiler.
*/
public final class MarketDataELFunctions {

  private MarketDataELFunctions() {
  }

  public static Security getSecurity(final Object id) {
    return UserExpressionParser.resolve(ComputationTargetType.SECURITY, id);
  }

  public static Object pointShiftCurve(final Object curve, final double x, final double shift) {
    if (curve instanceof YieldCurve) {
      final DoublesCurve shifted = CurveShiftFunctionFactory.getShiftedCurve(((YieldCurve) curve).getCurve(), x, shift);
      return YieldCurve.from(shifted);
    } else {
      throw new UnsupportedOperationException("Invalid curve - " + curve);
    }
  }

  public static Object parallelShiftCurve(final Object curve, final double shift) {
    if (curve instanceof YieldCurve) {
      final DoublesCurve shifted = CurveShiftFunctionFactory.getShiftedCurve(((YieldCurve) curve).getCurve(), shift);
      return YieldCurve.from(shifted);
    } else {
      throw new UnsupportedOperationException("Invalid curve - " + curve);
    }
  }

  public static double getFXMultiplier(final Object id, final double multiplier) {
    if (id instanceof ExternalId) {
      return getFXMultiplierFromExternalId((ExternalId) id, multiplier);
    } else if (id instanceof ExternalIdBundle) {
      final ExternalIdBundle bundle = (ExternalIdBundle) id;
      if (bundle.getExternalId(ExternalSchemes.BLOOMBERG_TICKER) != null) {
        return getFXMultiplierFromExternalId(bundle.getExternalId(ExternalSchemes.BLOOMBERG_TICKER), multiplier);
      } else if (bundle.getExternalId(ExternalSchemes.BLOOMBERG_TICKER_WEAK) != null) {
        return getFXMultiplierFromExternalId(bundle.getExternalId(ExternalSchemes.BLOOMBERG_TICKER_WEAK), multiplier);
      }
    } else if (id instanceof UniqueId) {
      final UniqueId uid = (UniqueId) id;
      return getFXMultiplierFromExternalId(ExternalId.of(ExternalSchemes.BLOOMBERG_TICKER, uid.getValue()), multiplier);
    }
    throw new OpenGammaRuntimeException("id was not FX rate, which shouldn't happen");
  }

  private static double getFXMultiplierFromExternalId(final ExternalId id, final double multiplier) {
    final Pair<Currency, Currency> pair = getFXPairFromBloombergTicker(id);
    if (StandardCurrencyPairs.isStandardPair(pair.getFirst(), pair.getSecond())) {
      return multiplier;
    } else {
      return 1 / multiplier;
    }
  }

  private static Pair<Currency, Currency> getFXPairFromBloombergTicker(final ExternalId id) {
    if (id.getScheme().equals(ExternalSchemes.BLOOMBERG_TICKER) || id.getScheme().equals(ExternalSchemes.BLOOMBERG_TICKER_WEAK)) {
      final String ticker = id.getValue();
      final String[] split = ticker.split(" ");
      if (split.length != 2) {
        throw new OpenGammaRuntimeException("ticker contained more than one space:" + ticker);
      }
      if (!split[1].equals("Curncy")) {
        throw new OpenGammaRuntimeException("ticker did not end with Curncy:" + ticker);
      }
      final String ccyPart = split[0];
      switch (ccyPart.length()) {
        case 3:
        {
          final Currency ccy = Currency.of(ccyPart);
          if (StandardCurrencyPairs.isSingleCurrencyNumerator(ccy)) {
            return Pair.of(ccy, Currency.USD);
          } else {
            return Pair.of(Currency.USD, ccy);
          }
        }
        case 6:
        {
          final Currency numerator = Currency.of(ccyPart.substring(0, 3));
          final Currency denominator = Currency.of(ccyPart.substring(3));
          return Pair.of(numerator, denominator);
        }
        default:
          throw new OpenGammaRuntimeException("currency part of ticker did not have 3 or 6 characters" + ticker);
      }
    } else {
      throw new OpenGammaRuntimeException("id was not bloomberg ticker or bloomberg weak ticker" + id);
    }
  }

  public static boolean isFXRate(final Object id) {
    if (id instanceof ExternalId) {
      return isFXRateFromBloombergTicker((ExternalId) id);
    } else if (id instanceof ExternalIdBundle) {
      final ExternalIdBundle bundle = (ExternalIdBundle) id;
      if (bundle.getExternalId(ExternalSchemes.BLOOMBERG_TICKER) != null) {
        return isFXRateFromBloombergTicker(bundle.getExternalId(ExternalSchemes.BLOOMBERG_TICKER));
      } else if (bundle.getExternalId(ExternalSchemes.BLOOMBERG_TICKER_WEAK) != null) {
        return isFXRateFromBloombergTicker(bundle.getExternalId(ExternalSchemes.BLOOMBERG_TICKER_WEAK));
      }
    } else if (id instanceof UniqueId) {
      final UniqueId uid = (UniqueId) id;
      return isFXRateFromBloombergTicker(ExternalId.of(ExternalSchemes.BLOOMBERG_TICKER, uid.getValue()));
    }
    return false;
  }

  private static boolean isFXRateFromBloombergTicker(final ExternalId id) {
    if (id.getScheme().equals(ExternalSchemes.BLOOMBERG_TICKER) || id.getScheme().equals(ExternalSchemes.BLOOMBERG_TICKER_WEAK)) {
      final String ticker = id.getValue();
      final String[] split = ticker.split(" ");
      if (split.length != 2) {
        return false;
      }
      if (!split[1].equals("Curncy")) {
        return false;
      }
      final String ccyPart = split[0];
      switch (ccyPart.length()) {
        case 3:
          return true;
        case 6:
          return true;
        default:
          return false;
      }
    } else {
      return false;
    }
  }

}
TOP

Related Classes of com.opengamma.financial.marketdata.MarketDataELFunctions

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.