/**
* 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 com.opengamma.OpenGammaRuntimeException;
import com.opengamma.financial.analytics.fixedincome.InterestRateInstrumentType;
import com.opengamma.financial.security.swap.FixedInflationSwapLeg;
import com.opengamma.financial.security.swap.FixedInterestRateLeg;
import com.opengamma.financial.security.swap.FixedVarianceSwapLeg;
import com.opengamma.financial.security.swap.FloatingGearingIRLeg;
import com.opengamma.financial.security.swap.FloatingInterestRateLeg;
import com.opengamma.financial.security.swap.FloatingRateType;
import com.opengamma.financial.security.swap.FloatingSpreadIRLeg;
import com.opengamma.financial.security.swap.FloatingVarianceSwapLeg;
import com.opengamma.financial.security.swap.InflationIndexSwapLeg;
import com.opengamma.financial.security.swap.InterestRateNotional;
import com.opengamma.financial.security.swap.SwapLeg;
import com.opengamma.financial.security.swap.SwapLegVisitor;
import com.opengamma.financial.security.swap.SwapSecurity;
/**
*
*/
public class SwapSecurityUtils {
public static InterestRateInstrumentType getSwapType(final SwapSecurity security) {
final SwapLeg payLeg = security.getPayLeg();
final SwapLeg receiveLeg = security.getReceiveLeg();
if (payLeg.getNotional() instanceof InterestRateNotional && receiveLeg.getNotional() instanceof InterestRateNotional) {
final InterestRateNotional payNotional = (InterestRateNotional) payLeg.getNotional();
final InterestRateNotional receiveNotional = (InterestRateNotional) receiveLeg.getNotional();
if (payLeg instanceof FixedInflationSwapLeg) {
return InterestRateInstrumentType.ZERO_COUPON_INFLATION_SWAP;
}
if (payLeg instanceof InflationIndexSwapLeg) {
return InterestRateInstrumentType.ZERO_COUPON_INFLATION_SWAP;
}
if (!payNotional.getCurrency().equals(receiveNotional.getCurrency())) {
return InterestRateInstrumentType.SWAP_CROSS_CURRENCY;
}
}
if (!payLeg.getRegionId().equals(receiveLeg.getRegionId())) {
throw new OpenGammaRuntimeException("Pay and receive legs must be from same region; have " + payLeg.getRegionId() + " and " + receiveLeg.getRegionId());
}
if (payLeg instanceof FixedInterestRateLeg && receiveLeg instanceof FloatingInterestRateLeg) {
final FloatingInterestRateLeg floatingLeg = (FloatingInterestRateLeg) receiveLeg;
if (floatingLeg instanceof FloatingSpreadIRLeg) {
return InterestRateInstrumentType.SWAP_FIXED_IBOR_WITH_SPREAD;
}
final FloatingRateType floatingRateType = floatingLeg.getFloatingRateType();
switch (floatingRateType) {
case IBOR:
return InterestRateInstrumentType.SWAP_FIXED_IBOR;
case CMS:
return InterestRateInstrumentType.SWAP_FIXED_CMS;
case OIS:
return InterestRateInstrumentType.SWAP_FIXED_OIS;
default:
throw new OpenGammaRuntimeException("Unsupported Floating rate type: " + floatingRateType);
}
} else if (payLeg instanceof FloatingInterestRateLeg && receiveLeg instanceof FixedInterestRateLeg) {
final FloatingInterestRateLeg floatingLeg = (FloatingInterestRateLeg) payLeg;
if (floatingLeg instanceof FloatingSpreadIRLeg) {
return InterestRateInstrumentType.SWAP_FIXED_IBOR_WITH_SPREAD;
}
final FloatingRateType floatingRateType = floatingLeg.getFloatingRateType();
switch (floatingRateType) {
case IBOR:
return InterestRateInstrumentType.SWAP_FIXED_IBOR;
case CMS:
return InterestRateInstrumentType.SWAP_FIXED_CMS;
case OIS:
return InterestRateInstrumentType.SWAP_FIXED_OIS;
default:
throw new OpenGammaRuntimeException("Unsupported Floating rate type: " + floatingRateType);
}
}
if (payLeg instanceof FloatingInterestRateLeg && receiveLeg instanceof FloatingInterestRateLeg) {
final FloatingInterestRateLeg payLeg1 = (FloatingInterestRateLeg) payLeg;
final FloatingInterestRateLeg receiveLeg1 = (FloatingInterestRateLeg) receiveLeg;
if (payLeg1.getFloatingRateType().isIbor()) {
if (receiveLeg1.getFloatingRateType().isIbor()) {
return InterestRateInstrumentType.SWAP_IBOR_IBOR;
}
return InterestRateInstrumentType.SWAP_IBOR_CMS;
}
if (receiveLeg1.getFloatingRateType().isIbor()) {
return InterestRateInstrumentType.SWAP_IBOR_CMS;
}
return InterestRateInstrumentType.SWAP_CMS_CMS;
}
throw new OpenGammaRuntimeException("Can only handle fixed-floating (pay and receive) swaps and floating-floating swaps");
}
public static boolean payFixed(final SwapSecurity security) {
final SwapLeg payLeg = security.getPayLeg();
final SwapLeg receiveLeg = security.getReceiveLeg();
if (payLeg instanceof FixedInterestRateLeg && receiveLeg instanceof FloatingInterestRateLeg) {
return true;
}
if (payLeg instanceof FloatingInterestRateLeg && receiveLeg instanceof FixedInterestRateLeg) {
return false;
}
throw new OpenGammaRuntimeException("Swap was not fixed / floating");
}
public static boolean isFloatFloat(final SwapSecurity security) {
final SwapLegVisitor<Boolean> isFixed = new SwapLegVisitor<Boolean>() {
@Override
public Boolean visitFixedInterestRateLeg(final FixedInterestRateLeg swapLeg) {
return Boolean.TRUE;
}
@Override
public Boolean visitFloatingInterestRateLeg(final FloatingInterestRateLeg swapLeg) {
return Boolean.FALSE;
}
@Override
public Boolean visitFloatingSpreadIRLeg(final FloatingSpreadIRLeg swapLeg) {
return Boolean.FALSE;
}
@Override
public Boolean visitFloatingGearingIRLeg(final FloatingGearingIRLeg swapLeg) {
return Boolean.FALSE;
}
@Override
public Boolean visitFixedVarianceSwapLeg(final FixedVarianceSwapLeg swapLeg) {
return Boolean.TRUE;
}
@Override
public Boolean visitFloatingVarianceSwapLeg(final FloatingVarianceSwapLeg swapLeg) {
return Boolean.FALSE;
}
@Override
public Boolean visitFixedInflationSwapLeg(final FixedInflationSwapLeg swapLeg) {
return Boolean.TRUE;
}
@Override
public Boolean visitInflationIndexSwapLeg(final InflationIndexSwapLeg swapLeg) {
return Boolean.FALSE;
}
};
return !security.getPayLeg().accept(isFixed) && !security.getReceiveLeg().accept(isFixed);
}
}