/** * Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.analytics.conversion; import org.threeten.bp.LocalDate; import org.threeten.bp.ZoneOffset; import org.threeten.bp.ZonedDateTime; import com.opengamma.OpenGammaRuntimeException; import com.opengamma.analytics.financial.instrument.InstrumentDefinition; import com.opengamma.analytics.financial.instrument.fra.ForwardRateAgreementDefinition; import com.opengamma.analytics.financial.instrument.index.IborIndex; import com.opengamma.core.convention.ConventionSource; import com.opengamma.core.holiday.HolidaySource; import com.opengamma.core.id.ExternalSchemes; import com.opengamma.core.region.RegionSource; import com.opengamma.core.security.Security; import com.opengamma.core.security.SecuritySource; import com.opengamma.financial.analytics.curve.ConverterUtils; import com.opengamma.financial.convention.HolidaySourceCalendarAdapter; import com.opengamma.financial.convention.IborIndexConvention; import com.opengamma.financial.convention.calendar.Calendar; import com.opengamma.financial.security.FinancialSecurityVisitorAdapter; import com.opengamma.financial.security.fra.FRASecurity; import com.opengamma.financial.security.fra.ForwardRateAgreementSecurity; import com.opengamma.id.ExternalId; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.money.Currency; /** * */ public class FRASecurityConverter extends FinancialSecurityVisitorAdapter<InstrumentDefinition<?>> { /** A security source. Used to retrieve Ibor index. */ private final SecuritySource _securitySource; private final HolidaySource _holidaySource; private final RegionSource _regionSource; private final ConventionSource _conventionSource; public FRASecurityConverter(final SecuritySource securitySource, final HolidaySource holidaySource, final RegionSource regionSource, final ConventionSource conventionSource) { ArgumentChecker.notNull(holidaySource, "holiday source"); ArgumentChecker.notNull(securitySource, "security source"); ArgumentChecker.notNull(regionSource, "region source"); ArgumentChecker.notNull(conventionSource, "convention source"); _securitySource = securitySource; _holidaySource = holidaySource; _regionSource = regionSource; _conventionSource = conventionSource; } @Override public ForwardRateAgreementDefinition visitFRASecurity(final FRASecurity security) { ArgumentChecker.notNull(security, "security"); final Security sec = _securitySource.getSingle(security.getUnderlyingId().toBundle()); if (sec == null) { throw new OpenGammaRuntimeException("Ibor index with id " + security.getUnderlyingId() + " was null"); } final com.opengamma.financial.security.index.IborIndex indexSecurity = (com.opengamma.financial.security.index.IborIndex) sec; final IborIndexConvention indexConvention = _conventionSource.getSingle(indexSecurity.getConventionId(), IborIndexConvention.class); final IborIndex iborIndex = ConverterUtils.indexIbor(indexSecurity.getName(), indexConvention, indexSecurity.getTenor()); final Currency currency = security.getCurrency(); final ZonedDateTime accrualStartDate = security.getStartDate(); final ZonedDateTime accrualEndDate = security.getEndDate(); final double notional = security.getAmount(); final Calendar calendar = CalendarUtils.getCalendar(_regionSource, _holidaySource, ExternalSchemes.currencyRegionId(currency)); //TODO exchange region? return ForwardRateAgreementDefinition.from(accrualStartDate, accrualEndDate, notional, iborIndex, security.getRate(), calendar); } @Override public ForwardRateAgreementDefinition visitForwardRateAgreementSecurity(final ForwardRateAgreementSecurity security) { ArgumentChecker.notNull(security, "security"); final ZonedDateTime accrualStartDate = security.getStartDate().atStartOfDay(ZoneOffset.UTC); final ZonedDateTime accrualEndDate = security.getEndDate().atStartOfDay(ZoneOffset.UTC); final double notional = security.getAmount(); final Calendar calendar = new HolidaySourceCalendarAdapter(_holidaySource, security.getCalendars().toArray(new ExternalId[security.getCalendars().size()])); final Calendar paymentCalendar = security.getPaymentCalendars() != null ? new HolidaySourceCalendarAdapter(_holidaySource, security.getPaymentCalendars().toArray(new ExternalId[security.getPaymentCalendars().size()])) : calendar; ArgumentChecker.notNull(security, "security"); final Security sec = _securitySource.getSingle(security.getUnderlyingId().toBundle()); if (sec == null) { throw new OpenGammaRuntimeException("Ibor index with id " + security.getUnderlyingId() + " was null"); } final com.opengamma.financial.security.index.IborIndex indexSecurity = (com.opengamma.financial.security.index.IborIndex) sec; final IborIndexConvention indexConvention = _conventionSource.getSingle(indexSecurity.getConventionId(), IborIndexConvention.class); final IborIndex iborIndex = ConverterUtils.indexIbor(indexSecurity.getName(), indexConvention, indexSecurity.getTenor()); final LocalDate fixingDate = security.getFixingDate(); if (fixingDate == null) { return ForwardRateAgreementDefinition.from(accrualStartDate, accrualEndDate, notional, iborIndex, security.getRate(), calendar, paymentCalendar); } else { return ForwardRateAgreementDefinition.from(accrualStartDate, accrualEndDate, notional, fixingDate.atStartOfDay(ZoneOffset.UTC), iborIndex, security.getRate(), calendar, paymentCalendar); } } }