/**
* Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics.fixedincome;
import com.opengamma.OpenGammaRuntimeException;
import com.opengamma.engine.target.ComputationTargetType;
import com.opengamma.financial.analytics.conversion.InterestRateSwapSecurityUtils;
import com.opengamma.financial.analytics.conversion.SwapSecurityUtils;
import com.opengamma.financial.security.FinancialSecurity;
import com.opengamma.financial.security.FinancialSecurityTypes;
import com.opengamma.financial.security.FinancialSecurityVisitor;
import com.opengamma.financial.security.FinancialSecurityVisitorSameValueAdapter;
import com.opengamma.financial.security.bond.CorporateBondSecurity;
import com.opengamma.financial.security.bond.GovernmentBondSecurity;
import com.opengamma.financial.security.bond.MunicipalBondSecurity;
import com.opengamma.financial.security.cash.CashSecurity;
import com.opengamma.financial.security.cashflow.CashFlowSecurity;
import com.opengamma.financial.security.fra.FRASecurity;
import com.opengamma.financial.security.fra.ForwardRateAgreementSecurity;
import com.opengamma.financial.security.future.BondFutureSecurity;
import com.opengamma.financial.security.future.FederalFundsFutureSecurity;
import com.opengamma.financial.security.future.InterestRateFutureSecurity;
import com.opengamma.financial.security.irs.InterestRateSwapSecurity;
import com.opengamma.financial.security.swap.SwapSecurity;
import com.opengamma.financial.security.swap.ZeroCouponInflationSwapSecurity;
/**
*
*/
public enum InterestRateInstrumentType {
/** A swap, one fixed leg, one floating referenced to an ibor rate */
SWAP_FIXED_IBOR,
/** A swap, one fixed leg, one floating referenced to an ibor rate and spread, paying fixed */
SWAP_FIXED_IBOR_WITH_SPREAD,
/** A swap, two floating legs referenced to ibor rates */
SWAP_IBOR_IBOR,
/** A swap, one fixed leg, one CMS leg */
SWAP_FIXED_CMS,
/** A swap, one ibor leg, one CMS leg */
SWAP_IBOR_CMS,
/** A swap, one ibor leg, one CMS leg */
SWAP_IBOR_OIS,
/** A swap, one ibor leg, one OIS leg */
SWAP_CMS_CMS,
/** A swap, one fixed leg, one OIS leg */
SWAP_FIXED_OIS,
/** A cross-currency swap */
SWAP_CROSS_CURRENCY,
/** Cash */
CASH, //TODO do we need ibor, deposit, OIS?
/** Cashflow */
CASHFLOW,
/** FRA */
FRA,
/** Interest rate future */
IR_FUTURE,
/** Fed fund future */
FED_FUND_FUTURE,
/** Coupon bond */
COUPON_BOND,
/** Bond future */
BOND_FUTURE,
/** Zero coupon inflation swap */
ZERO_COUPON_INFLATION_SWAP;
@SuppressWarnings("synthetic-access")
private static final FinancialSecurityVisitor<InterestRateInstrumentType> TYPE_IDENTIFIER = new TypeIdentifier();
public static InterestRateInstrumentType getInstrumentTypeFromSecurity(final FinancialSecurity security) {
final InterestRateInstrumentType type = security.accept(TYPE_IDENTIFIER);
if (type == null) {
throw new OpenGammaRuntimeException("Can't handle " + security.getClass().getName());
}
return type;
}
public static boolean isFixedIncomeInstrumentType(final FinancialSecurity security) {
try {
return security.accept(TYPE_IDENTIFIER) != null;
} catch (final OpenGammaRuntimeException e) {
return false;
}
}
private static final class TypeIdentifier extends FinancialSecurityVisitorSameValueAdapter<InterestRateInstrumentType> {
private TypeIdentifier() {
super(null);
}
@Override
public InterestRateInstrumentType visitGovernmentBondSecurity(final GovernmentBondSecurity security) {
return COUPON_BOND;
}
@Override
public InterestRateInstrumentType visitMunicipalBondSecurity(final MunicipalBondSecurity security) {
return COUPON_BOND;
}
@Override
public InterestRateInstrumentType visitCorporateBondSecurity(final CorporateBondSecurity security) {
return COUPON_BOND;
}
@Override
public InterestRateInstrumentType visitCashSecurity(final CashSecurity security) {
return CASH;
}
@Override
public InterestRateInstrumentType visitCashFlowSecurity(final CashFlowSecurity security) {
return CASHFLOW;
}
@Override
public InterestRateInstrumentType visitFRASecurity(final FRASecurity security) {
return FRA;
}
@Override
public InterestRateInstrumentType visitForwardRateAgreementSecurity(final ForwardRateAgreementSecurity security) {
return FRA;
}
@Override
public InterestRateInstrumentType visitBondFutureSecurity(final BondFutureSecurity security) {
return BOND_FUTURE;
}
@Override
public InterestRateInstrumentType visitZeroCouponInflationSwapSecurity(final ZeroCouponInflationSwapSecurity security) {
return ZERO_COUPON_INFLATION_SWAP;
}
@Override
public InterestRateInstrumentType visitInterestRateFutureSecurity(final InterestRateFutureSecurity security) {
return IR_FUTURE;
}
@Override
public InterestRateInstrumentType visitSwapSecurity(final SwapSecurity security) {
return SwapSecurityUtils.getSwapType(security);
}
@Override
public InterestRateInstrumentType visitInterestRateSwapSecurity(final InterestRateSwapSecurity security) {
return InterestRateSwapSecurityUtils.getSwapType(security);
}
@Override
public InterestRateInstrumentType visitFederalFundsFutureSecurity(final FederalFundsFutureSecurity security) {
return FED_FUND_FUTURE;
}
}
/**
* Engine {@link ComputationTargetType} corresponding to securities which would return true for {@link #isFixedIncomeInstrumentType}.
*/
public static final ComputationTargetType FIXED_INCOME_INSTRUMENT_TARGET_TYPE = FinancialSecurityTypes.CASH_SECURITY
.or(FinancialSecurityTypes.FRA_SECURITY)
.or(FinancialSecurityTypes.FORWARD_RATE_AGREEMENT_SECURITY)
.or(FinancialSecurityTypes.INTEREST_RATE_FUTURE_SECURITY)
.or(FinancialSecurityTypes.SWAP_SECURITY)
.or(FinancialSecurityTypes.INTEREST_RATE_SWAP_SECURITY)
.or(FinancialSecurityTypes.CASH_FLOW_SECURITY);
}