com.opengamma.analytics.financial.commodity.derivative.CommodityFutureOption.java Source code

Java tutorial

Introduction

Here is the source code for com.opengamma.analytics.financial.commodity.derivative.CommodityFutureOption.java

Source

/**
 * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
 *
 * Please see distribution for license.
 */
package com.opengamma.analytics.financial.commodity.derivative;

import com.opengamma.analytics.financial.ExerciseDecisionType;
import com.opengamma.analytics.financial.interestrate.InstrumentDerivative;
import com.opengamma.util.ArgumentChecker;

import org.apache.commons.lang.ObjectUtils;

/**
 * Abstract commodity future derivative.
 *
 * @param <T>
 */
public abstract class CommodityFutureOption<T extends CommodityFuture> implements InstrumentDerivative {
    /** Time (in years as a double) until the date-time at which the future expires */
    private final double _expiry;
    /** Identifier of the underlying commodity */
    private final T _underlying;
    /** Strike price */
    private final double _strike;
    /** Exercise type - European or American */
    private final ExerciseDecisionType _exerciseType;
    /** Call if true, Put if false */
    private final boolean _isCall;

    /**
     * @param expiry Time (in years as a double) until the date-time at which the future expires
     * @param underlying Underlying future
     * @param strike Strike price
     * @param exerciseType Exercise type - European or American
     * @param isCall Call if true, Put if false
     */
    public CommodityFutureOption(final double expiry, final T underlying, final double strike,
            final ExerciseDecisionType exerciseType, final boolean isCall) {
        ArgumentChecker.isTrue(expiry >= 0, "time to expiry must be positive");

        _expiry = expiry;
        _underlying = underlying;
        _strike = strike;
        _exerciseType = exerciseType;
        _isCall = isCall;
    }

    /**
     * Gets the expiry.
     * @return the expiry
     */
    public double getExpiry() {
        return _expiry;
    }

    /**
     * Gets the underlying.
     * @return the underlying
     */
    public T getUnderlying() {
        return _underlying;
    }

    /**
     * Gets the strike price
     * @return the strike.
     */
    public double getStrike() {
        return _strike;
    }

    /**
     * Gets the exercise type
     * @return the exerciseType.
     */
    public ExerciseDecisionType getExerciseType() {
        return _exerciseType;
    }

    /**
     * @return True if the option is a Call, false if it is a Put.
     */
    public boolean isCall() {
        return _isCall;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + _underlying.hashCode();
        result = prime * result + _exerciseType.hashCode();
        result = prime * result + (_isCall ? 1231 : 1237);
        long temp;
        temp = Double.doubleToLongBits(_strike);
        result = prime * result + (int) (temp ^ (temp >>> 32));
        temp = Double.doubleToLongBits(_expiry);
        result = prime * result + (int) (temp ^ (temp >>> 32));
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (!(obj instanceof CommodityFutureOption)) {
            return false;
        }
        final CommodityFutureOption<?> other = (CommodityFutureOption<?>) obj;
        if (!ObjectUtils.equals(_underlying, other._underlying)) {
            return false;
        }
        if (!ObjectUtils.equals(_exerciseType, other._exerciseType)) {
            return false;
        }
        if (Double.compare(_expiry, other._expiry) != 0) {
            return false;
        }
        if (Double.compare(_strike, other._strike) != 0) {
            return false;
        }
        if (_isCall != other._isCall) {
            return false;
        }
        return true;
    }

}