/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.model.option.definition;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.Validate;
import org.threeten.bp.ZonedDateTime;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.time.DateUtils;
import com.opengamma.util.time.Expiry;
/**
*
* Contains the minimum information required to define an option. Descendant
* classes must define a payoff function, which gives the payoff given a
* particular spot value, and an exercise function, which calculates whether an
* option should be exercised.
*
*/
public abstract class OptionDefinition {
private final Double _strike;
private final Expiry _expiry;
private final Boolean _isCall;
/**
*
* @param strike The strike
* @param expiry The expiry, not null
* @param isCall Is the option a put or call
*/
public OptionDefinition(final Double strike, final Expiry expiry, final Boolean isCall) {
if (strike != null) {
ArgumentChecker.notNegative(strike, "strike");
}
Validate.notNull(expiry);
_strike = strike;
_expiry = expiry;
_isCall = isCall;
}
/**
*
* @return Returns the strike.
*/
public Double getStrike() {
return _strike;
}
/**
*
* @return Returns the expiry.
*/
public Expiry getExpiry() {
return _expiry;
}
/**
*
* @param date The date
* @return The time to expiry in years, where a year is defined as having 365.25 days
*/
public double getTimeToExpiry(final ZonedDateTime date) {
if (date.isAfter(getExpiry().getExpiry())) {
throw new IllegalArgumentException("Date " + date + " is after expiry " + getExpiry());
}
return DateUtils.getDifferenceInYears(date, getExpiry().getExpiry());
}
/**
*
* @return Returns true if the option is a call.
*/
public Boolean isCall() {
return _isCall;
}
/**
* @param <T> The data bundle type
* @return The exercise function.
*/
public abstract <T extends StandardOptionDataBundle> OptionExerciseFunction<T> getExerciseFunction();
/**
* @param <T> The data bundle type
* @return The payoff function.
*/
public abstract <T extends StandardOptionDataBundle> OptionPayoffFunction<T> getPayoffFunction();
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + _expiry.hashCode();
result = prime * result + ((_isCall == null) ? 0 : _isCall.hashCode());
result = prime * result + ((_strike == null) ? 0 : _strike.hashCode());
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 OptionDefinition other = (OptionDefinition) obj;
return ObjectUtils.equals(_expiry, other._expiry) && ObjectUtils.equals(_isCall, other._isCall) && ObjectUtils.equals(_strike, other._strike);
}
}