/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.equity.future.definition; import org.threeten.bp.ZonedDateTime; import com.opengamma.analytics.financial.equity.future.derivative.VolatilityIndexFuture; import com.opengamma.analytics.financial.instrument.InstrumentDefinitionVisitor; import com.opengamma.analytics.util.time.TimeCalculator; import com.opengamma.id.ExternalId; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.money.Currency; /** * Volatility index future definition. An IndexFuture is always cash-settled. * eg UXH5 Index, http://cfe.cboe.com/products/Products_VIX.aspx */ public class VolatilityIndexFutureDefinition extends IndexFutureDefinition { /** * Constructor for Equity Index Futures, always cash-settled. * * @param expiryDate the time and the day that a particular delivery month of a futures contract stops trading, as well as the final settlement price for that contract * @param settlementDate settlement date * @param strikePrice reference price * @param currency currency * @param unitAmount size of a unit * @param underlying identifier of the underlying commodity */ public VolatilityIndexFutureDefinition(final ZonedDateTime expiryDate, final ZonedDateTime settlementDate, final double strikePrice, final Currency currency, final double unitAmount, final ExternalId underlying) { super(expiryDate, settlementDate, strikePrice, currency, unitAmount, underlying); } @Override public VolatilityIndexFuture toDerivative(final ZonedDateTime date) { ArgumentChecker.notNull(date, "date"); final double timeToFixing = TimeCalculator.getTimeBetween(date, getExpiryDate()); final double timeToDelivery = TimeCalculator.getTimeBetween(date, getSettlementDate()); final VolatilityIndexFuture newDeriv = new VolatilityIndexFuture(timeToFixing, timeToDelivery, getReferencePrice(), getCurrency(), getUnitAmount()); return newDeriv; } @Override public VolatilityIndexFuture toDerivative(final ZonedDateTime date, final Double referencePrice) { ArgumentChecker.notNull(date, "date"); if (referencePrice == null) { return toDerivative(date); } final double timeToFixing = TimeCalculator.getTimeBetween(date, getExpiryDate()); final double timeToDelivery = TimeCalculator.getTimeBetween(date, getSettlementDate()); final VolatilityIndexFuture newDeriv = new VolatilityIndexFuture(timeToFixing, timeToDelivery, referencePrice, getCurrency(), getUnitAmount()); return newDeriv; } @Override public <U, V> V accept(final InstrumentDefinitionVisitor<U, V> visitor, final U data) { ArgumentChecker.notNull(visitor, "visitor"); return visitor.visitVolatilityIndexFutureDefinition(this, data); } @Override public <V> V accept(final InstrumentDefinitionVisitor<?, V> visitor) { ArgumentChecker.notNull(visitor, "visitor"); return visitor.visitVolatilityIndexFutureDefinition(this); } @Override public int hashCode() { return super.hashCode(); } @Override public boolean equals(final Object obj) { if (this == obj) { return true; } if (!(obj instanceof VolatilityIndexFutureDefinition)) { return false; } return super.equals(obj); } }