/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.commodity.multicurvecommodity.definition;
import org.threeten.bp.LocalDate;
import org.threeten.bp.ZonedDateTime;
import com.opengamma.analytics.financial.ExpiredException;
import com.opengamma.analytics.financial.commodity.multicurvecommodity.derivative.EnergyFutureSecurity;
import com.opengamma.analytics.financial.commodity.multicurvecommodity.derivative.EnergyFutureTransaction;
import com.opengamma.analytics.financial.instrument.InstrumentDefinitionVisitor;
import com.opengamma.util.ArgumentChecker;
/**
*
*/
public class EnergyFutureTransactionDefinition extends CommodityFutureTransactionDefinition<EnergyFutureTransaction> {
public EnergyFutureTransactionDefinition(final CommodityFutureSecurityDefinition<?> underlying, final ZonedDateTime transactionDate, final double transactionPrice, final int quantity) {
super(underlying, transactionDate, transactionPrice, quantity);
}
@Override
public EnergyFutureTransaction toDerivative(final ZonedDateTime date, final Double lastMarginPrice) {
ArgumentChecker.notNull(date, "date");
final LocalDate dateLocal = date.toLocalDate();
final LocalDate transactionDateLocal = getTransactionDate().toLocalDate();
final LocalDate lastTradingDateLocal = getLastTradingDate().toLocalDate();
if (dateLocal.isAfter(lastTradingDateLocal)) {
throw new ExpiredException("Valuation date, " + date + ", is after last margin date, " + lastTradingDateLocal);
}
double referencePrice;
if (transactionDateLocal.isBefore(dateLocal)) { // Transaction was before last margining.
referencePrice = lastMarginPrice;
} else { // Transaction is today
referencePrice = getTransactionPrice();
}
final EnergyFutureSecurity underlying = (EnergyFutureSecurity) getUnderlying().toDerivative(date);
return new EnergyFutureTransaction(underlying, getQuantity(), referencePrice);
}
@Override
public EnergyFutureTransaction toDerivative(final ZonedDateTime date) {
throw new UnsupportedOperationException("The method toDerivative of " + this.getClass().getSimpleName() + " does not support the two argument method (without margin price data).");
}
@Override
public <U, V> V accept(final InstrumentDefinitionVisitor<U, V> visitor, final U data) {
ArgumentChecker.notNull(visitor, "visitor");
return visitor.visitEnergyFutureTransactionDefinition(this, data);
}
@Override
public <V> V accept(final InstrumentDefinitionVisitor<?, V> visitor) {
ArgumentChecker.notNull(visitor, "visitor");
return visitor.visitEnergyFutureTransactionDefinition(this);
}
@Override
public CommodityFutureTransactionDefinition<?> withNewTransactionPrice(final double transactionPrice) {
return new EnergyFutureTransactionDefinition(getUnderlying(), getTransactionDate(), transactionPrice, getQuantity());
}
}