Logo Search packages:      
Sourcecode: quantlib version File versions  Download package

exercise.hpp

Go to the documentation of this file.
/* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */

/*
 Copyright (C) 2003 Ferdinando Ametrano
 Copyright (C) 2001, 2002, 2003 Sadruddin Rejeb
 Copyright (C) 2006 StatPro Italia srl

 This file is part of QuantLib, a free-software/open-source library
 for financial quantitative analysts and developers - http://quantlib.org/

 QuantLib is free software: you can redistribute it and/or modify it
 under the terms of the QuantLib license.  You should have received a
 copy of the license along with this program; if not, please email
 <quantlib-dev@lists.sf.net>. The license is also available online at
 <http://quantlib.org/reference/license.html>.

 This program is distributed in the hope that it will be useful, but WITHOUT
 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 FOR A PARTICULAR PURPOSE.  See the license for more details.
*/

/*! \file exercise.hpp
    \brief Option exercise classes and payoff function
*/

#ifndef quantlib_exercise_type_h
#define quantlib_exercise_type_h

#include <ql/date.hpp>
#include <vector>

namespace QuantLib {

    //! Base exercise class
00035     class Exercise {
      public:
        enum Type {
            #ifndef QL_DISABLE_DEPRECATED
            Undefined = -1,
            #endif
            American, Bermudan, European
        };
        // constructor
        #ifndef QL_DISABLE_DEPRECATED
        /*! \deprecated initialize the exercise type explicitly */
00046         Exercise() : type_(Undefined) {}
        #endif
        explicit Exercise(Type type) : type_(type) {}
        virtual ~Exercise() {}
        // inspectors
        #ifndef QL_DISABLE_DEPRECATED
        /*! \deprecated no longer needed after initialization of an
                        undefined exercise is forbidden
        */
00055         bool isNull() const { return type_ == Undefined; }
        #endif
        Type type() const { return type_; }
        Date date(Size index) const { return dates_[index]; }
        //! Returns all exercise dates
00060         const std::vector<Date>& dates() const { return dates_; }
        Date lastDate() const { return dates_.back(); }
      protected:
        std::vector<Date> dates_;
        Type type_;
    };

    //! Early-exercise base class
    /*! The payoff can be at exercise (the default) or at expiry */
00069     class EarlyExercise : public Exercise {
      public:
        #ifndef QL_DISABLE_DEPRECATED
        /*! \deprecated initialize the exercise type explicitly */
00073         EarlyExercise() : payoffAtExpiry_(false) {}
        #endif
        EarlyExercise(Type type,
                      bool payoffAtExpiry = false)
        : Exercise(type), payoffAtExpiry_(payoffAtExpiry) {}
        bool payoffAtExpiry() const { return payoffAtExpiry_; }
      private:
        bool payoffAtExpiry_;
    };

    //! American exercise
    /*! An American option can be exercised at any time between two
        predefined dates; the first date might be omitted, in which
        case the option can be exercised at any time before the expiry.

        \todo check that everywhere the American condition is applied
              from earliestDate and not earlier
    */
00091     class AmericanExercise : public EarlyExercise {
      public:
        AmericanExercise(const Date& earliestDate,
                         const Date& latestDate,
                         bool payoffAtExpiry = false);
        AmericanExercise(const Date& latestDate,
                         bool payoffAtExpiry = false);
    };

    //! Bermudan exercise
    /*! A Bermudan option can only be exercised at a set of fixed dates.

        \todo it would be nice to have a way for making a Bermudan with
              one exercise date equivalent to an European
    */
00106     class BermudanExercise : public EarlyExercise {
      public:
        BermudanExercise(const std::vector<Date>& dates,
                         bool payoffAtExpiry = false);
    };

    //! European exercise
    /*! A European option can only be exercised at one (expiry) date.
    */
00115     class EuropeanExercise : public Exercise {
      public:
        EuropeanExercise(const Date& date);
    };

}


#endif

Generated by  Doxygen 1.6.0   Back to index