/** * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.interestrate.future.derivative; import java.util.Arrays; import org.apache.commons.lang.ObjectUtils; import com.opengamma.analytics.financial.instrument.InstrumentDefinition; import com.opengamma.analytics.financial.instrument.index.IndexON; import com.opengamma.analytics.financial.interestrate.InstrumentDerivativeVisitor; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.money.Currency; /** * Description of an Federal Funds Futures. */ public class FederalFundsFutureSecurity extends FuturesSecurity { /** * The OIS-like index on which the future fixes. */ private final IndexON _index; /** * The accrual interest of the period already fixed. Interest (fixing rate * accrual fraction) for a notional of 1. * For a future without fixing, it will be 0. */ private final double _accruedInterest; /** * The times of the fixing periods not yet fixed. There is one date more than period. */ private final double[] _fixingPeriodTime; /** * The accrual factors (or year fractions) associated to the fixing periods not yet fixed in the Index day count convention. */ private final double[] _fixingPeriodAccrualFactor; /** * The total accrual factor for all fixing periods (including the one that have fixed already). */ private final double _fixingTotalAccrualFactor; /** * The future notional. */ private final double _notional; /** * The future payment accrual factor. Usually a standardized number of 1/12 for a 30-day future. */ private final double _paymentAccrualFactor; /** * The future name. */ private final String _name; /** * The OIS curve name */ private final String _oisCurveName; /** * Constructor from all the details. * @param index The OIS-like index on which the future fixes. * @param accruedInterest The accrual interest of the period already fixed. Interest (fixing rate * accrual fraction) for a notional of 1. * @param fixingPeriodTime The times of the fixing periods not yet fixed. There is one date more than period. * @param lastTradingTime The last trading time of the futures. * @param fixingPeriodAccrualFactor The accrual factors (or year fractions) associated to the fixing periods not yet fixed in the Index day count convention. * @param fixingTotalAccrualFactor The total accrual factor for all fixing periods (including the one that have fixed already). * @param notional The future notional. * @param paymentAccrualFactor The future payment accrual factor. Usually a standardized number of 1/12 for a 30-day future. * @param name The future name. * @param oisCurveName The OIS forward curve name. * @deprecated Use the constructor that does not take curve names */ @Deprecated public FederalFundsFutureSecurity(final IndexON index, final double accruedInterest, final double[] fixingPeriodTime, final double lastTradingTime, final double[] fixingPeriodAccrualFactor, final double fixingTotalAccrualFactor, final double notional, final double paymentAccrualFactor, final String name, final String oisCurveName) { super(lastTradingTime); ArgumentChecker.notNull(index, "Index overnight"); ArgumentChecker.notNull(fixingPeriodTime, "Fixing period time"); ArgumentChecker.notNull(fixingPeriodAccrualFactor, "Fixing period accrual factors"); ArgumentChecker.notNull(name, "Name"); ArgumentChecker.isTrue(fixingPeriodTime.length == fixingPeriodAccrualFactor.length + 1, "Fixing dates length should be fixing accrual factors + 1."); _index = index; _accruedInterest = accruedInterest; _fixingPeriodTime = fixingPeriodTime; _fixingPeriodAccrualFactor = fixingPeriodAccrualFactor; _fixingTotalAccrualFactor = fixingTotalAccrualFactor; _notional = notional; _paymentAccrualFactor = paymentAccrualFactor; _name = name; _oisCurveName = oisCurveName; } /** * Constructor from all the details. * @param index The OIS-like index on which the future fixes. * @param accruedInterest The accrual interest of the period already fixed. Interest (fixing rate * accrual fraction) for a notional of 1. * @param fixingPeriodTime The times of the fixing periods not yet fixed. There is one date more than period. * @param lastTradingTime The last trading time of the futures. * @param fixingPeriodAccrualFactor The accrual factors (or year fractions) associated to the fixing periods not yet fixed in the Index day count convention. * @param fixingTotalAccrualFactor The total accrual factor for all fixing periods (including the one that have fixed already). * @param notional The future notional. * @param paymentAccrualFactor The future payment accrual factor. Usually a standardized number of 1/12 for a 30-day future. * @param name The future name. */ public FederalFundsFutureSecurity(final IndexON index, final double accruedInterest, final double[] fixingPeriodTime, final double lastTradingTime, final double[] fixingPeriodAccrualFactor, final double fixingTotalAccrualFactor, final double notional, final double paymentAccrualFactor, final String name) { super(lastTradingTime); ArgumentChecker.notNull(index, "Index overnight"); ArgumentChecker.notNull(fixingPeriodTime, "Fixing period time"); ArgumentChecker.notNull(fixingPeriodAccrualFactor, "Fixing period accrual factors"); ArgumentChecker.notNull(name, "Name"); ArgumentChecker.isTrue(fixingPeriodTime.length == fixingPeriodAccrualFactor.length + 1, "Fixing dates length should be fixing accrual factors + 1."); _index = index; _accruedInterest = accruedInterest; _fixingPeriodTime = fixingPeriodTime; _fixingPeriodAccrualFactor = fixingPeriodAccrualFactor; _fixingTotalAccrualFactor = fixingTotalAccrualFactor; _notional = notional; _paymentAccrualFactor = paymentAccrualFactor; _name = name; _oisCurveName = null; } /** * Gets the OIS-like index on which the future fixes. * @return The index. */ public IndexON getIndex() { return _index; } /** * Gets the accrual interest of the period already fixed. Interest (fixing rate * accrual fraction) for a notional of 1. * @return The accrual interest of the period already fixed. */ public double getAccruedInterest() { return _accruedInterest; } /** * Gets the times of the fixing periods not yet fixed. * @return The times. */ public double[] getFixingPeriodTime() { return _fixingPeriodTime; } /** * Gets the accrual factors (or year fractions) associated to the fixing periods not yet fixed in the Index day count convention. * @return The accrual factors. */ public double[] getFixingPeriodAccrualFactor() { return _fixingPeriodAccrualFactor; } /** * Gets the total accrual factor for all fixing periods (including the one that have fixed already). * @return The accrual factor. */ public double getFixingTotalAccrualFactor() { return _fixingTotalAccrualFactor; } /** * Gets the future notional. * @return The notional. */ public double getNotional() { return _notional; } /** * Gets the future payment accrual factor. Usually a standardized number of 1/12 for a 30-day future. * @return The payment accrual factor. */ public double getPaymentAccrualFactor() { return _paymentAccrualFactor; } /** * Gets the future name. * @return The future name. */ public String getName() { return _name; } /** * Gets the OIS curve name. * @return The curve name. * @deprecated Curve names should no longer be set in {@link InstrumentDefinition}s */ @Deprecated public String getOISCurveName() { if (_oisCurveName == null) { throw new IllegalStateException("OIS curve name not set"); } return _oisCurveName; } /** * Gets the future currency. * @return The currency. */ @Override public Currency getCurrency() { return _index.getCurrency(); } @Override public <S, T> T accept(final InstrumentDerivativeVisitor<S, T> visitor, final S data) { ArgumentChecker.notNull(visitor, "visitor"); return visitor.visitFederalFundsFutureSecurity(this, data); } @Override public <T> T accept(final InstrumentDerivativeVisitor<?, T> visitor) { ArgumentChecker.notNull(visitor, "visitor"); return visitor.visitFederalFundsFutureSecurity(this); } @Override public int hashCode() { final int prime = 31; int result = 1; long temp; temp = Double.doubleToLongBits(_accruedInterest); result = prime * result + (int) (temp ^ (temp >>> 32)); result = prime * result + Arrays.hashCode(_fixingPeriodAccrualFactor); result = prime * result + Arrays.hashCode(_fixingPeriodTime); result = prime * result + _index.hashCode(); result = prime * result + _name.hashCode(); temp = Double.doubleToLongBits(_notional); result = prime * result + (int) (temp ^ (temp >>> 32)); temp = Double.doubleToLongBits(_paymentAccrualFactor); result = prime * result + (int) (temp ^ (temp >>> 32)); return result; } @Override public boolean equals(final Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final FederalFundsFutureSecurity other = (FederalFundsFutureSecurity) obj; if (Double.doubleToLongBits(_accruedInterest) != Double.doubleToLongBits(other._accruedInterest)) { return false; } if (Double.doubleToLongBits(_notional) != Double.doubleToLongBits(other._notional)) { return false; } if (Double.doubleToLongBits(_paymentAccrualFactor) != Double.doubleToLongBits(other._paymentAccrualFactor)) { return false; } if (!Arrays.equals(_fixingPeriodAccrualFactor, other._fixingPeriodAccrualFactor)) { return false; } if (!Arrays.equals(_fixingPeriodTime, other._fixingPeriodTime)) { return false; } if (!ObjectUtils.equals(_index, other._index)) { return false; } if (!ObjectUtils.equals(_name, other._name)) { return false; } return true; } }