/** * Copyright (C) 2013 - 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.ZonedDateTime; import com.opengamma.OpenGammaRuntimeException; import com.opengamma.analytics.financial.forex.definition.ForexDefinition; import com.opengamma.analytics.financial.forex.definition.ForexOptionVanillaDefinition; import com.opengamma.analytics.financial.instrument.InstrumentDefinition; import com.opengamma.financial.currency.CurrencyPair; import com.opengamma.financial.currency.CurrencyPairs; import com.opengamma.financial.security.FinancialSecurityVisitorAdapter; import com.opengamma.financial.security.option.FXOptionSecurity; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.money.Currency; /** * Converts {@link FXOptionSecurity} to {@link ForexOptionVanillaDefinition} */ public class FXVanillaOptionConverter extends FinancialSecurityVisitorAdapter<InstrumentDefinition<?>> { /** The currency pairs */ private final CurrencyPairs _currencyPairs; /** * @param currencyPairs The currency pairs, not null */ public FXVanillaOptionConverter(final CurrencyPairs currencyPairs) { ArgumentChecker.notNull(currencyPairs, "currency pairs"); _currencyPairs = currencyPairs; } @Override public InstrumentDefinition<?> visitFXOptionSecurity(final FXOptionSecurity fxOptionSecurity) { ArgumentChecker.notNull(fxOptionSecurity, "fx option security"); final Currency putCurrency = fxOptionSecurity.getPutCurrency(); final Currency callCurrency = fxOptionSecurity.getCallCurrency(); final double putAmount = fxOptionSecurity.getPutAmount(); final double callAmount = fxOptionSecurity.getCallAmount(); final ZonedDateTime expiry = fxOptionSecurity.getExpiry().getExpiry(); final ZonedDateTime settlementDate = fxOptionSecurity.getSettlementDate(); final boolean isLong = fxOptionSecurity.isLong(); ForexDefinition underlying; final CurrencyPair baseQuotePair = _currencyPairs.getCurrencyPair(putCurrency, callCurrency); if (baseQuotePair == null) { throw new OpenGammaRuntimeException("Could not get base/quote order for currency pair (" + putCurrency + ", " + callCurrency + ")"); } if (baseQuotePair.getBase().equals(putCurrency)) { underlying = ForexDefinition.fromAmounts(putCurrency, callCurrency, settlementDate, putAmount, -callAmount); return new ForexOptionVanillaDefinition(underlying, expiry, false, isLong); } underlying = ForexDefinition.fromAmounts(callCurrency, putCurrency, settlementDate, callAmount, -putAmount); return new ForexOptionVanillaDefinition(underlying, expiry, true, isLong); } }