/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.analytics.conversion; import com.opengamma.OpenGammaRuntimeException; import com.opengamma.analytics.financial.instrument.InstrumentDefinition; import com.opengamma.analytics.financial.instrument.volatilityswap.FXVolatilitySwapDefinition; import com.opengamma.analytics.financial.instrument.volatilityswap.VolatilitySwapDefinition; import com.opengamma.core.holiday.HolidaySource; import com.opengamma.financial.convention.HolidaySourceCalendarAdapter; import com.opengamma.financial.convention.calendar.Calendar; import com.opengamma.financial.convention.frequency.Frequency; import com.opengamma.financial.convention.frequency.PeriodFrequency; import com.opengamma.financial.convention.frequency.SimpleFrequency; import com.opengamma.financial.security.FinancialSecurityVisitorAdapter; import com.opengamma.financial.security.fx.FXVolatilitySwapSecurity; import com.opengamma.financial.security.swap.VolatilitySwapSecurity; import com.opengamma.financial.security.swap.VolatilitySwapType; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.money.Currency; /** * Converts {@link VolatilitySwapSecurity} classes to {@link VolatilitySwapDefinition}, which is required * for use in the analytics library. */ public class VolatilitySwapSecurityConverter extends FinancialSecurityVisitorAdapter<InstrumentDefinition<?>> { /** The holiday source */ private final HolidaySource _holidaySource; /** * @param holidaySource The holiday source, not null */ public VolatilitySwapSecurityConverter(final HolidaySource holidaySource) { ArgumentChecker.notNull(holidaySource, "holidaySource"); _holidaySource = holidaySource; } @Override public FXVolatilitySwapDefinition visitFXVolatilitySwapSecurity(final FXVolatilitySwapSecurity security) { ArgumentChecker.notNull(security, "security"); final Currency currency = security.getCurrency(); final Calendar calendar = new HolidaySourceCalendarAdapter(_holidaySource, currency); final Frequency frequency = security.getObservationFrequency(); final PeriodFrequency periodFrequency; if (frequency instanceof PeriodFrequency) { periodFrequency = (PeriodFrequency) frequency; } else if (frequency instanceof SimpleFrequency) { periodFrequency = ((SimpleFrequency) frequency).toPeriodFrequency(); } else { throw new OpenGammaRuntimeException("Can only handle PeriodFrequency and SimpleFrequency"); } final double volStrike, volNotional; final VolatilitySwapType volatilitySwapType = security.getVolatilitySwapType(); switch (volatilitySwapType) { case VEGA: throw new UnsupportedOperationException("TODO"); case VOLATILITY: volStrike = security.getStrike(); volNotional = security.getNotional(); break; default: throw new UnsupportedOperationException("Cannot handle VolatilitySwapType " + volatilitySwapType); } return new FXVolatilitySwapDefinition(currency, security.getBaseCurrency(), security.getCounterCurrency(), volStrike, volNotional, security.getFirstObservationDate(), security.getLastObservationDate(), security.getSettlementDate(), security.getMaturityDate(), periodFrequency, security.getAnnualizationFactor(), calendar); } }