/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.analytics.model.riskfactor.option; import com.opengamma.OpenGammaRuntimeException; import com.opengamma.analytics.financial.greeks.AbstractGreekVisitor; import com.opengamma.analytics.financial.greeks.Greek; import com.opengamma.core.security.Security; import com.opengamma.core.security.SecuritySource; import com.opengamma.core.value.MarketDataRequirementNames; import com.opengamma.engine.value.ValueRequirement; import com.opengamma.financial.analytics.timeseries.DateConstraint; import com.opengamma.financial.analytics.timeseries.HistoricalTimeSeriesFunctionUtils; import com.opengamma.financial.security.FinancialSecurity; import com.opengamma.financial.security.FinancialSecurityVisitorAdapter; import com.opengamma.financial.security.option.EquityIndexOptionSecurity; import com.opengamma.financial.security.option.EquityOptionSecurity; import com.opengamma.id.ExternalIdBundle; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesResolutionResult; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesResolver; import com.opengamma.util.ArgumentChecker; /** * */ public class UnderlyingTimeSeriesProvider { private static final FieldGreekVisitor FIELD_VISITOR = new FieldGreekVisitor(); private final HistoricalTimeSeriesResolver _timeSeriesResolver; private final String _resolutionKey; private final UnderlyingFinancialSecurityVisitor _securityVisitor; public UnderlyingTimeSeriesProvider(final HistoricalTimeSeriesResolver timeSeriesResolver, final String resolutionKey, final SecuritySource securitySource) { ArgumentChecker.notNull(timeSeriesResolver, "timeSeriesResolver"); ArgumentChecker.notNull(resolutionKey, "resolutionLey"); ArgumentChecker.notNull(securitySource, "securitySource"); _timeSeriesResolver = timeSeriesResolver; _resolutionKey = resolutionKey; _securityVisitor = new UnderlyingFinancialSecurityVisitor(securitySource); } private HistoricalTimeSeriesResolver getTimeSeriesResolver() { return _timeSeriesResolver; } private String getResolutionKey() { return _resolutionKey; } private UnderlyingFinancialSecurityVisitor getSecurityVisitor() { return _securityVisitor; } public ValueRequirement getSeriesRequirement(final Greek greek, final FinancialSecurity security) { return getSeriesRequirement(greek, security, DateConstraint.NULL, DateConstraint.VALUATION_TIME); } public ValueRequirement getSeriesRequirement(final Greek greek, final FinancialSecurity security, final DateConstraint startDate, final DateConstraint endDate) { final String fieldName = greek.accept(FIELD_VISITOR); final ExternalIdBundle underlyingId = security.accept(getSecurityVisitor()); final HistoricalTimeSeriesResolutionResult timeSeries = getTimeSeriesResolver().resolve(underlyingId, null, null, null, fieldName, getResolutionKey()); if (timeSeries == null) { throw new OpenGammaRuntimeException("Could not resolve time series for " + underlyingId + " for security " + security + " for " + getResolutionKey() + "/" + fieldName); } return HistoricalTimeSeriesFunctionUtils.createHTSRequirement(timeSeries, fieldName, startDate, true, endDate, true); } private static class FieldGreekVisitor extends AbstractGreekVisitor<String> { public FieldGreekVisitor() { } @Override public String visitDelta() { return MarketDataRequirementNames.MARKET_VALUE; } @Override public String visitGamma() { return MarketDataRequirementNames.MARKET_VALUE; } } private class UnderlyingFinancialSecurityVisitor extends FinancialSecurityVisitorAdapter<ExternalIdBundle> { private final SecuritySource _securitySource; public UnderlyingFinancialSecurityVisitor(final SecuritySource securitySource) { _securitySource = securitySource; } @Override public ExternalIdBundle visitEquityIndexOptionSecurity(final EquityIndexOptionSecurity security) { return _securitySource.getSingle(ExternalIdBundle.of(security.getUnderlyingId())).getExternalIdBundle(); } @Override public ExternalIdBundle visitEquityOptionSecurity(final EquityOptionSecurity security) { Security underlyingSecurity = _securitySource.getSingle(ExternalIdBundle.of(security.getUnderlyingId())); if (underlyingSecurity == null) { throw new NullPointerException("Unable to obtain underlying security for " + security.getUnderlyingId()); } return underlyingSecurity.getExternalIdBundle(); } } }