/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.analytics.model.equity.option; import com.opengamma.OpenGammaRuntimeException; import com.opengamma.core.value.MarketDataRequirementNames; import com.opengamma.engine.function.FunctionInputs; import com.opengamma.engine.target.ComputationTargetType; import com.opengamma.engine.value.ValueRequirement; import com.opengamma.financial.analytics.model.futureoption.BarrierOptionDistanceFunction; import com.opengamma.financial.security.FinancialSecurity; import com.opengamma.financial.security.FinancialSecurityTypes; import com.opengamma.financial.security.FinancialSecurityUtils; import com.opengamma.financial.security.option.EquityBarrierOptionSecurity; /** * Function to compute barrier distance for equity options * * Defined as absolute difference (optionally expressed as a percentage) between barrier level and market price * */ public class EquityVanillaBarrierOptionDistanceFunction extends BarrierOptionDistanceFunction { /** */ public EquityVanillaBarrierOptionDistanceFunction() { } @Override public ComputationTargetType getTargetType() { return FinancialSecurityTypes.EQUITY_BARRIER_OPTION_SECURITY; } @Override protected ValueRequirement getMarketDataRequirement(FinancialSecurity security) { return new ValueRequirement(MarketDataRequirementNames.MARKET_VALUE, ComputationTargetType.PRIMITIVE, FinancialSecurityUtils.getUnderlyingId(security)); } @Override protected Double getSpot(final FunctionInputs inputs) { final Object spotObject = inputs.getValue(MarketDataRequirementNames.MARKET_VALUE); if (spotObject == null) { throw new OpenGammaRuntimeException("Could not get spot for " + inputs.getAllValues().iterator().next().getSpecification().getTargetSpecification()); } return (Double) spotObject; } @Override protected double getBarrierLevel(FinancialSecurity security) { return ((EquityBarrierOptionSecurity) security).getBarrierLevel(); } }