/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.analytics.model.futureoption; import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.beans.factory.InitializingBean; import com.opengamma.engine.function.config.AbstractFunctionConfigurationBean; import com.opengamma.engine.function.config.FunctionConfiguration; import com.opengamma.engine.function.config.FunctionConfigurationSource; import com.opengamma.financial.analytics.model.curve.forward.ForwardCurveValuePropertyNames; import com.opengamma.financial.analytics.model.volatility.surface.black.BlackVolatilitySurfacePropertyNamesAndValues; import com.opengamma.financial.property.DefaultPropertyFunction.PriorityClass; import com.opengamma.util.ArgumentChecker; /** * Function repository configuration source for the functions contained in this package. */ public class FutureOptionFunctions extends AbstractFunctionConfigurationBean { /** * Default instance of a repository configuration source exposing the functions from this package. * * @return the configuration source exposing functions from this package */ public static FunctionConfigurationSource instance() { return new FutureOptionFunctions().getObjectCreating(); } /** * Function repository configuration source for the default functions contained in this package. */ public static class Defaults extends AbstractFunctionConfigurationBean { /** * Currency specific data. */ public static class CurrencyInfo implements InitializingBean { private String _curveName; private String _curveCalculationConfig; private String _surfaceName; private String _interpolationMethod = "Spline"; private String _forwardCurveName; private String _forwardCurveCalculationMethod = ForwardCurveValuePropertyNames.PROPERTY_FUTURE_PRICE_METHOD; private String _surfaceCalculationMethod = BlackVolatilitySurfacePropertyNamesAndValues.INTERPOLATED_BLACK_LOGNORMAL; public String getCurveName() { return _curveName; } public void setCurveName(final String curveName) { _curveName = curveName; } public String getCurveCalculationConfig() { return _curveCalculationConfig; } public void setCurveCalculationConfig(final String curveCalculationConfig) { _curveCalculationConfig = curveCalculationConfig; } public String getSurfaceName() { return _surfaceName; } public void setSurfaceName(final String surfaceName) { _surfaceName = surfaceName; } public String getInterpolationMethod() { return _interpolationMethod; } public void setInterpolationMethod(final String interpolationMethod) { _interpolationMethod = interpolationMethod; } public String getForwardCurveName() { return _forwardCurveName; } public void setForwardCurveName(final String forwardCurveName) { _forwardCurveName = forwardCurveName; } public String getForwardCurveCalculationMethodName() { return _forwardCurveCalculationMethod; } public void setForwardCurveCalculationMethodName(final String forwardCurveCalculationMethod) { _forwardCurveCalculationMethod = forwardCurveCalculationMethod; } public String getSurfaceCalculationMethod() { return _surfaceCalculationMethod; } public void setSurfaceCalculationMethod(final String surfaceCalculationMethod) { _surfaceCalculationMethod = surfaceCalculationMethod; } @Override public void afterPropertiesSet() { ArgumentChecker.notNullInjected(getCurveName(), "curveName"); ArgumentChecker.notNullInjected(getCurveCalculationConfig(), "curveCalculationConfig"); ArgumentChecker.notNullInjected(getSurfaceName(), "surfaceName"); ArgumentChecker.notNullInjected(getSurfaceCalculationMethod(), "surface calculation method"); ArgumentChecker.notNullInjected(getInterpolationMethod(), "interpolationMethod"); ArgumentChecker.notNullInjected(getForwardCurveName(), "forward curve name"); ArgumentChecker.notNullInjected(getForwardCurveCalculationMethodName(), "forward curve calculation method name"); } } private final Map<String, CurrencyInfo> _perCurrencyInfo = new HashMap<>(); public void setPerCurrencyInfo(final Map<String, CurrencyInfo> perCurrencyInfo) { _perCurrencyInfo.clear(); _perCurrencyInfo.putAll(perCurrencyInfo); } public Map<String, CurrencyInfo> getPerCurrencyInfo() { return _perCurrencyInfo; } public void setCurrencyInfo(final String currency, final CurrencyInfo info) { _perCurrencyInfo.put(currency, info); } public CurrencyInfo getCurrencyInfo(final String currency) { return _perCurrencyInfo.get(currency); } protected void addCommodityFutureOptionDefaults(final List<FunctionConfiguration> functions) { final String[] args = new String[getPerCurrencyInfo().size() * 2 + 1]; args[0] = PriorityClass.NORMAL.name(); int i = 1; for (final Map.Entry<String, CurrencyInfo> e : getPerCurrencyInfo().entrySet()) { args[i++] = e.getKey(); final CurrencyInfo value = e.getValue(); args[i++] = value.getSurfaceCalculationMethod(); } functions.add(functionConfiguration(CommodityFutureOptionSurfaceCalculationMethodDefaults.class, args)); } protected void addCommodityFutureOptionSurfaceCalculationMethodDefaults(final List<FunctionConfiguration> functions) { final String[] args = new String[getPerCurrencyInfo().size() * 7 + 1]; args[0] = PriorityClass.NORMAL.name(); int i = 1; for (final Map.Entry<String, CurrencyInfo> e : getPerCurrencyInfo().entrySet()) { args[i++] = e.getKey(); final CurrencyInfo value = e.getValue(); args[i++] = value.getCurveName(); args[i++] = value.getCurveCalculationConfig(); args[i++] = value.getSurfaceName(); args[i++] = value.getInterpolationMethod(); args[i++] = value.getForwardCurveName(); args[i++] = value.getForwardCurveCalculationMethodName(); } functions.add(functionConfiguration(CommodityFutureOptionBlackLognormalDefaults.class, args)); } @Override protected void addAllConfigurations(final List<FunctionConfiguration> functions) { if (!getPerCurrencyInfo().isEmpty()) { addCommodityFutureOptionSurfaceCalculationMethodDefaults(functions); addCommodityFutureOptionDefaults(functions); } } } @Override protected void addAllConfigurations(final List<FunctionConfiguration> functions) { functions.add(functionConfiguration(CommodityFutureOptionBlackDeltaFunction.class)); functions.add(functionConfiguration(CommodityFutureOptionBlackForwardDeltaFunction.class)); functions.add(functionConfiguration(CommodityFutureOptionBlackForwardGammaFunction.class)); functions.add(functionConfiguration(CommodityFutureOptionBlackGammaFunction.class)); functions.add(functionConfiguration(CommodityFutureOptionBlackPVFunction.class)); functions.add(functionConfiguration(CommodityFutureOptionBlackThetaFunction.class)); functions.add(functionConfiguration(CommodityFutureOptionBlackVegaFunction.class)); functions.add(functionConfiguration(CommodityFutureOptionBlackValueDeltaFunction.class)); functions.add(functionConfiguration(CommodityFutureOptionBlackValueGammaFunction.class)); functions.add(functionConfiguration(CommodityFutureOptionBAWPVFunction.class)); functions.add(functionConfiguration(CommodityFutureOptionBAWGreeksFunction.class)); functions.add(functionConfiguration(CommodityFutureOptionBAWValueDeltaFunction.class)); functions.add(functionConfiguration(CommodityFutureOptionBAWValueGammaFunction.class)); functions.add(functionConfiguration(CommodityFutureOptionBjerksundStenslandPVFunction.class)); functions.add(functionConfiguration(CommodityFutureOptionBjerksundStenslandGreeksFunction.class)); functions.add(functionConfiguration(CommodityFutureOptionBjerksundStenslandValueDeltaFunction.class)); functions.add(functionConfiguration(CommodityFutureOptionBjerksundStenslandValueGammaFunction.class)); functions.add(functionConfiguration(EquityFutureOptionBlackDeltaFunction.class)); functions.add(functionConfiguration(EquityFutureOptionBlackGammaFunction.class)); functions.add(functionConfiguration(EquityFutureOptionBlackPVFunction.class)); functions.add(functionConfiguration(EquityFutureOptionBlackThetaFunction.class)); functions.add(functionConfiguration(EquityFutureOptionBlackVegaFunction.class)); functions.add(functionConfiguration(EquityFutureOptionBlackValueDeltaFunction.class)); functions.add(functionConfiguration(EquityFutureOptionBlackValueGammaFunction.class)); functions.add(functionConfiguration(EquityFutureOptionBlackValueThetaFunction.class)); functions.add(functionConfiguration(EquityFutureOptionBlackValueVegaFunction.class)); functions.add(functionConfiguration(EquityFutureOptionBAWPVFunction.class)); functions.add(functionConfiguration(EquityFutureOptionBAWGreeksFunction.class)); functions.add(functionConfiguration(EquityFutureOptionBAWValueDeltaFunction.class)); functions.add(functionConfiguration(EquityFutureOptionBAWValueGammaFunction.class)); } }