/**
* 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.Validate;
import com.opengamma.util.time.Expiry;
/**
* Class defining a gap option.
* <p>
* Gap options have European-style exercise with payoff
* $$
* \begin{align*}
* \mathrm{payoff} =
* \begin{cases}
* 0 \quad & \mathrm{if} \quad S \leq K_1\\
* S - K_2 \quad & \mathrm{otherwise}
* \end{cases}
* \end{align*}
* $$
* for a call and
* $$
* \begin{align*}
* \mathrm{payoff} =
* \begin{cases}
* 0 \quad & \mathrm{if} \quad S \geq K_1\\
* K_2 - S \quad & \mathrm{otherwise}
* \end{cases}
* \end{align*}
* $$
* for a put, where $K_1$ is the strike, $K_2$ is the payoff strike and $S$ is
* the spot.
*/
public class GapOptionDefinition extends OptionDefinition {
private final OptionExerciseFunction<StandardOptionDataBundle> _exerciseFunction = new EuropeanExerciseFunction<>();
private final OptionPayoffFunction<StandardOptionDataBundle> _payoffFunction = new OptionPayoffFunction<StandardOptionDataBundle>() {
@Override
public double getPayoff(final StandardOptionDataBundle data, final Double optionPrice) {
Validate.notNull(data);
final double s = data.getSpot();
final double k = getStrike();
final double x = getPayoffStrike();
return isCall() ? s <= k ? 0 : s - x : s >= k ? 0 : x - s;
}
};
private final double _payoffStrike;
/**
* @param strike The strike
* @param expiry The expiry
* @param isCall Is the option a call or put
* @param payoffStrike The payoff strike of the option, greater than zero
*/
public GapOptionDefinition(final double strike, final Expiry expiry, final boolean isCall, final double payoffStrike) {
super(strike, expiry, isCall);
Validate.isTrue(payoffStrike >= 0, "payoff strike");
_payoffStrike = payoffStrike;
}
/**
* {@inheritDoc}
*/
@Override
public OptionExerciseFunction<StandardOptionDataBundle> getExerciseFunction() {
return _exerciseFunction;
}
/**
* {@inheritDoc}
*/
@Override
public OptionPayoffFunction<StandardOptionDataBundle> getPayoffFunction() {
return _payoffFunction;
}
public double getPayoffStrike() {
return _payoffStrike;
}
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
long temp;
temp = Double.doubleToLongBits(_payoffStrike);
result = prime * result + (int) (temp ^ (temp >>> 32));
return result;
}
@Override
public boolean equals(final Object obj) {
if (this == obj) {
return true;
}
if (!super.equals(obj)) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final GapOptionDefinition other = (GapOptionDefinition) obj;
if (Double.doubleToLongBits(_payoffStrike) != Double.doubleToLongBits(other._payoffStrike)) {
return false;
}
return true;
}
}