/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.analytics.model.trs; import static com.opengamma.core.value.MarketDataRequirementNames.MARKET_VALUE; import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.opengamma.analytics.financial.equity.EquityTrsDataBundle; import com.opengamma.analytics.financial.forex.method.FXMatrix; import com.opengamma.analytics.financial.instrument.InstrumentDefinition; import com.opengamma.analytics.financial.provider.description.interestrate.MulticurveProviderInterface; import com.opengamma.core.convention.ConventionSource; import com.opengamma.core.holiday.HolidaySource; import com.opengamma.core.security.Security; import com.opengamma.core.security.SecuritySource; import com.opengamma.engine.ComputationTarget; import com.opengamma.engine.function.FunctionCompilationContext; import com.opengamma.engine.function.FunctionInputs; import com.opengamma.engine.target.ComputationTargetType; import com.opengamma.engine.value.ValuePropertyNames; import com.opengamma.engine.value.ValueRequirement; import com.opengamma.financial.OpenGammaCompilationContext; import com.opengamma.financial.analytics.conversion.DefaultTradeConverter; import com.opengamma.financial.analytics.conversion.EquityTotalReturnSwapSecurityConverter; import com.opengamma.financial.analytics.conversion.FixedIncomeConverterDataProvider; import com.opengamma.financial.analytics.model.discounting.DiscountingFunction; import com.opengamma.financial.security.FinancialSecurityVisitor; import com.opengamma.financial.security.swap.EquityTotalReturnSwapSecurity; import com.opengamma.id.ExternalIdBundle; /** * Base function for equity total return swap pricing. */ public abstract class EquityTotalReturnSwapFunction extends DiscountingFunction { /** The logger */ private static final Logger s_logger = LoggerFactory.getLogger(EquityTotalReturnSwapFunction.class); /** * @param valueRequirements The value requirement names, not null */ public EquityTotalReturnSwapFunction(final String... valueRequirements) { super(valueRequirements); } @Override protected DefaultTradeConverter getTargetToDefinitionConverter(final FunctionCompilationContext context) { final ConventionSource conventionSource = OpenGammaCompilationContext.getConventionSource(context); final HolidaySource holidaySource = OpenGammaCompilationContext.getHolidaySource(context); final SecuritySource securitySource = OpenGammaCompilationContext.getSecuritySource(context); final FinancialSecurityVisitor<InstrumentDefinition<?>> securityConverter = new EquityTotalReturnSwapSecurityConverter(conventionSource, holidaySource, securitySource); return new DefaultTradeConverter(securityConverter); } /** * Base compiled function for equity total return swap pricing. */ protected abstract class EquityTotalReturnSwapCompiledFunction extends DiscountingCompiledFunction { /** * @param tradeToDefinitionConverter Converts targets to definitions, not null * @param definitionToDerivativeConverter Converts definitions to derivatives, not null * @param withCurrency True if the {@link ValuePropertyNames#CURRENCY} result property is set */ protected EquityTotalReturnSwapCompiledFunction(final DefaultTradeConverter tradeToDefinitionConverter, final FixedIncomeConverterDataProvider definitionToDerivativeConverter, final boolean withCurrency) { super(tradeToDefinitionConverter, definitionToDerivativeConverter, withCurrency); } @Override public boolean canApplyTo(final FunctionCompilationContext context, final ComputationTarget target) { return target.getTrade().getSecurity() instanceof EquityTotalReturnSwapSecurity; } @Override public Set<ValueRequirement> getRequirements(final FunctionCompilationContext context, final ComputationTarget target, final ValueRequirement desiredValue) { final Set<ValueRequirement> requirements = super.getRequirements(context, target, desiredValue); if (requirements == null) { return null; } final ValueRequirement spotRequirement = getEquityUnderlyingRequirement(context, target); if (spotRequirement == null) { return null; } requirements.add(spotRequirement); return requirements; } /** * Gets the underlying equity market data requirement. * @param context The compilation context * @param target The computation target * @return The equity market data requirement */ @SuppressWarnings("synthetic-access") protected ValueRequirement getEquityUnderlyingRequirement(final FunctionCompilationContext context, final ComputationTarget target) { final SecuritySource securitySource = OpenGammaCompilationContext.getSecuritySource(context); final EquityTotalReturnSwapSecurity security = (EquityTotalReturnSwapSecurity) target.getTrade().getSecurity(); final ExternalIdBundle equityId = security.getAssetId(); try { final Security equitySecurity = securitySource.getSingle(equityId); return new ValueRequirement(MARKET_VALUE, ComputationTargetType.SECURITY, equitySecurity.getUniqueId()); } catch (final Exception e) { s_logger.error(e.getMessage()); return null; } } /** * Creates the data bundle required for equity total return swap pricing. * @param inputs The function inputs * @param matrix The FX matrix * @return The data bundle */ protected EquityTrsDataBundle getDataBundle(final FunctionInputs inputs, final FXMatrix matrix) { final MulticurveProviderInterface curves = getMergedProviders(inputs, matrix); final double spotEquity = (Double) inputs.getValue(MARKET_VALUE); return new EquityTrsDataBundle(spotEquity, curves); } } }