IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Typedef struct et Methode en C++


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 31
    Points : 12
    Points
    12
    Par défaut Typedef struct et Methode en C++
    Bonjour,

    je viens de découvrir ce forum ou j’espère trouver de l' aide par rapport à mon problème. En effet, j'ai construit deux structures AmercanPut et Modele que j' essais d' utiliser dans une méthode Ame_PutPrice () que est définie comme suite:



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    typedef struct   {
    	 Date ContractDate ; // t
    	 Date MaturityDate ;// T
    	 Amount StrikePrice ;// K
    	}AmericanPut;
     
     typedef struct  {
    	double r;
    	double sigma;
    	double S;
    	}Modele;
     
     
    double Option::Ame_PutPrice_BS(long t, double S, AmericanPut option, Modele modele)const {.............}
    Message d' erreur:
    error C2511: 'double option::Ame_PutPrice_BS(long,double,AmericanPut,Modele) const' : overloaded member function not found in 'Option'
    merci d'avance pour votre aide!

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour et bienvenu,
    Il manque la définition de la classe Option pour répondre correctement à ton problème.
    Généralement, ce genre d'erreur vient d'une divergence entre la définition de ta méthode et sa déclaration.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 31
    Points : 12
    Points
    12
    Par défaut
    Merci pour le bienvenu et aussi d'avoir répondu aussi vite!

    les deux structures typedef AmericanPut et Modele, je l'ai déclarés sur la partie code.cpp avant la fonction main. En résume mon problème est de ne pas savoir manipuler les structures de typedef en tant qu'agruments d' une méthode d' une classe.

    voici le code de ma class:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    #ifndef _WIN32_WINNT		
    #define _WIN32_WINNT 0x0501	
    #endif						
     
    #include <stdio.h>
    #include <tchar.h>
    #include <string>
     
     
    using namespace std ;
     
     
     
    class Option  
    {
    private:
     
    	void init();	// Initialise all default values
    	void copy(const Option& o2);
     
    	// 'Kernel' functions for option calculations
    	double Euro_CallPrice() const;
    	double Euro_PutPrice() const;
     
    	double Ame_CallPrice() const;// Black_Scholls
    	double Ame_PutPrice_BS() const  ;//c ' est la fonction qui cree les probléme !!!!!!!!!!!
     
     
     
     
    public:
    	// Public member data for convenience only
    	double r;		// Interest rate
    	double sig;		// Volatility
    	double K;		// Strike price
    	double T;		// Expiry date
    	double S;		// Current underlying price 
     
    	string optType;	// Option name (call, put)
     
     
    public:	
    // Constructors
    Option();	 // Default call option
    Option(const Option& option2);	// Copy constructor
    Option (const string& optionType);	// Create option type
     
    // Destructor
    virtual ~Option();	
     
    // Assignment operator
    Option& operator = (const Option& option2);
     
    // Functions that calculate option price 
    double Black_Schol_Price() const;
    double eva_Price() const;
     
     
    // Modifier functions
    void toggle();		// Change option type (C/P, P/C)
     
    };
    merci!

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Il faut que la déclaration dans le .h correspondent strictement à la définition dans le .cpp. Donc, dans ta déclaration, tu dois spécifier tous les paramètres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    class Option  
    {
    private:
    // definition des structures:
    // dans ce cas, le typedef n'est pas nécessaire en C++:
    struct   AmericanPut{
    	 Date ContractDate ; // t
    	 Date MaturityDate ;// T
    	 Amount StrikePrice ;// K
    	}AmericanPut;
     
    struct  Modele{
    	double r;
    	double sigma;
    	double S;
    	};
    private:
    ...	
    	double Ame_PutPrice_BS(long t, double S, AmericanPut option, Modele modele) const  ;//c ' est la fonction qui cree les probléme !!!!!!!!!!!
    ...
    };
    P.S.: Black&Scholls, ça me rappelle mes années d'étudiant Un projet d'école?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 31
    Points : 12
    Points
    12
    Par défaut
    Merci 3DArchi!! ça a marché même si j'ai encore une liste d’erreurs à résoudre .
    En effet je suis en train d’implanter une méthode numérique pour approximer une Option américain pour comparer le résultat avec d' autres méthodes plus au moins connues.

    merci encore

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 31
    Points : 12
    Points
    12
    Par défaut
    Encore une question concernant les structure:

    j'ai envi de définir 2 autre strucure l' une de type double et l 'autre de type long:

    version 1:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    struct double Date;
    struct long Amount;
    version 2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct Date {
    double i;
    };
    struct Amount {
    long j;
    };
    pourquoi le compiler n'accepte pas la 1 version et la douxieme est accepté mais je ne sais pas si elle bonne!!!

    merci d'avance!

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    J'ai l'impression que tu veux faire deux choses différentes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct Date {
    double i;
    };
    struct Amount {
    long j;
    };
    Tu définis deux structures. Ce sont des nouveaux types. Et par exemple tu ne pourras pas faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Date d1;
    double d2;
    d1 = d2;// Erreur, ce sont deux types différents
    La seconde chose, c'est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef double Ma_Date;
    Dans ce cas, tu dis au compilateur Ma_Date est un synonyme de double. Ce seront les mêmes types. Tu pourras faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Ma_Date d1;
    double d2;
    d1 = d2;// OK Ma_Date est un synonyme de double
    P.S.: évite de donné des noms comme 'Date'. Un jour ou l'autre tu sera en conflit avec un type d'une bibliothèque existante. Préfixe tes types par une lettre ou un mot clé de ton projet. Par exemple typedef double UdDate (Ud pour Udani).

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    P.S.: évite de donné des noms comme 'Date'. Un jour ou l'autre tu sera en conflit avec un type d'une bibliothèque existante. Préfixe tes types par une lettre ou un mot clé de ton projet. Par exemple typedef double UdDate (Ud pour Udani).
    Bof, en C, pourquoi pas, mais en C++, je préfère largement utiliser les namespaces pour résoudre ce problème et ne pas sacrifier la lisibilité.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  9. #9
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Bof, en C, pourquoi pas, mais en C++, je préfère largement utiliser les namespaces pour résoudre ce problème et ne pas sacrifier la lisibilité.
    Je pense que l'un n'empêche pas l'autre et qu'un préfixe court maintient la lisibilité. Ensuite, cela dépend aussi du projet: en entreprise, cela fait souvent partie des règles de codages.

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Je pense que l'un n'empêche pas l'autre et qu'un préfixe court maintient la lisibilité. Ensuite, cela dépend aussi du projet: en entreprise, cela fait souvent partie des règles de codages.
    ouais, pour l'avoir vu, c'est horrible Un bon namespace avec le préfixe et le tour est joué, sisi, vraiment.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 31
    Points : 12
    Points
    12
    Par défaut
    Merci 3DArchi pour ton aide. Je sais maintenant la différence entre typedef et struct.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 31
    Points : 12
    Points
    12
    Par défaut autres question
    Bonjour 3DArchi et tout le monde,

    j'ai encore un autre problème concernant la manipulation des structures en tant qu'arguments d' une fonction.

    Imaginez vous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    struct   AmericanPut{
     	 double ContractDate ; // t
    	 double MaturityDate ;// T
    	 long StrikePrice ;// K
    	};
     
    struct  Modele{
    	double r;
    	double sigma;
    	double S;
    	};

    une méthode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double Euro_PutPrice(double S, AmericainPut option, Modele modele) {..........}
    qui utilise le paramétre K de la structure option de typ AmericanPut. Mon problème à une certaine étape, j'aimerais que ma méthode Euro_PutPrice () utilise, par exemple le double de K*exp(T-t) comme argument.

    Autrement, imaginez:

    Euro_PutPrice (double S, AmercanPut option; Modele modele) // ici la méthode utilise K , càd le long StrikePrice. A une autre étape, j'aimerais faire intervenir pas K mais K*exp(T-t). J'ai pensé définir une deuxième structure comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct   AmericanPut_2{
     	 double ContractDate ; // t
    	 double MaturityDate ;// T
    	 long StrikePrice*exp(T-t) ;// K
    	};
    mais je trouve cela lourd, peut être tu aurais une ideé et merci d'avance.

    bonne weekend

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 31
    Points : 12
    Points
    12
    Par défaut
    je crois avoir une ideé!
    j'ai creé une "petite" méthode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    raz(struct AmericainPut & option) 
    {
    option.StrikePrice=StrikePrice*exp(option.MaturityDate-option.ContractDate)
    };
    qui modifie le paramètre concerné dans la structure AmericanPut.

    Que ceque vous en pensez?

  14. #14
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    La piste est bonne, le seul problème est que tu perd ta valeur initiale K. Le mieux est de faire une copie, de changer la valeur sur cette copie et après d'appeler ta fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    double Euro_PutPrice(double S, AmericainPut option, Modele modele) 
    {
    ..........
           AmericainPut cp_option(option);
           raz(cp_option);
           Euro_PutPrice(S,cp_option,modele);
    }

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 31
    Points : 12
    Points
    12
    Par défaut
    Merci pour ton idée 3DArchi, le problème je reçois une autre erreur , que j'arrive pas à resoudre :

    error C2662: 'Option::raz' : cannot convert 'this' pointer from 'const Option' to 'Option &'


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     double Option::Ame_PutPrice_Johnson(double S, struct AmericanPut option, struct Modele modele) const {
    ............
    AmericanPut cp_option(option);
    raz(cp_option);  //error C2662
    double V_u=Euro_PutPrice(S , cp_option, modele );
    
    .........
    
    }
    ma méthode raz est la suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void raz(struct AmericanPut  &re)const 
    {
    re.StikePrice=StikePrice*exp(MaturityDate-ContractDate);
    };
    merci pour tes conseilles.

  16. #16
    Membre éclairé
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Points : 709
    Points
    709
    Par défaut
    Salut
    Remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double Option::Ame_PutPrice_Johnson(double S, struct AmericanPut option, struct Modele modele)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double Option::Ame_PutPrice_Johnson(double S, struct AmericanPut  &option, struct Modele modele)
    If you type Google into Google, you Can break the internet" - The IT Crowd

  17. #17
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Udani Voir le message
    error C2662: 'Option::raz' : cannot convert 'this' pointer from 'const Option' to 'Option &'


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     double Option::Ame_PutPrice_Johnson(double S, struct AmericanPut option, struct Modele modele) const {
    ............
    AmericanPut cp_option(option);
    raz(cp_option);  //error C2662
    double V_u=Euro_PutPrice(S , cp_option, modele );
    
    .........
    
    }
    ma méthode raz est la suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void raz(struct AmericanPut  &re)const 
    {
    re.StikePrice=StikePrice*exp(MaturityDate-ContractDate);
    };
    merci pour tes conseilles.
    En fait, ta méthode option::raz est un peu bancale (à moins que ce ne soit une erreur de retranscription). Elle devrait s'appliquer sur l'objet qui l'invoque et ne pas le prendre en paramètre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    double Option::Ame_PutPrice_Johnson(double S, struct AmericanPut option, struct Modele modele) const {
    ............
    AmericanPut cp_option(option);
    cp_option.raz();
    double V_u=Euro_PutPrice(S , cp_option, modele );
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void option::raz()// j'ai enlevé le const car on va modifier l'état interne de l'objet!
    {
    StikePrice=StikePrice*exp(MaturityDate-ContractDate);
    };

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 31
    Points : 12
    Points
    12
    Par défaut
    Merci buggen25, 3DArchi,

    j'ai utilisé les changements.

    3DArchi, si je met :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AmericanPut cp_option(option);
         cp_option.raz();;
    error C2039: 'raz' : is not a member of 'Option::AmericanPut'


    c' est plutôt raz(option); non ?

    ?

    je peux vous poster le code tout entier, si vous préférez!!

    bonne nuit

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 31
    Points : 12
    Points
    12
    Par défaut
    En résume,

    ma class


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    #ifndef _WIN32_WINNT		// Lassen Sie die Verwendung spezifischer Features von Windows XP oder später zu.                   
    #define _WIN32_WINNT 0x0501	// Ändern Sie dies in den geeigneten Wert für andere Versionen von Windows.
    #endif						
     
    #include <stdio.h>
    #include <tchar.h>
    #include <string>
     
     
    using namespace std ;
     
     
     
    // TODO: Hier auf zusätzliche Header, die das Programm erfordert, verweisen.
     
     
    class Option  
    {
    public:
    	// Public member data for convenience only
     
    	double r;		// Interest rate
    	double sig;		// Volatility
    	double K;		// Strike price
    	double T;		// Expiry date
    	double S;		// Current underlying price 
     
    	string optType;	// Option name (call, put)
     
    struct   AmericanPut{
     	 double ContractDate ; // t
    	 double MaturityDate ;// T
    	 long StrikePrice ;// K
    	};
     
    struct  Modele{
    	double r;
    	double sigma;
    	double S;
    	};
     
    public:	
    // Constructors
    Option();	 // Default call option
    Option(const Option& option2);	// Copy constructor
    Option (const string& optionType);	// Create option type
     
    // Destructor
    virtual ~Option();	
     
    // Assignment operator
    Option& operator = (const Option& option2);
     
    // Functions that calculate option price 
    double Black_Schol_Price() const;
    double analy_eva_Price() const;// Johnson as anlytic solution
    void raz(struct AmericanPut &option);
     
     
    // Modifier functions
    void toggle();		// Change option type (C/P, P/C)
     
    private:
     
    	void init();	// Initialise all default values
    	void copy(const Option& o2);
     
    	// 'Kernel' functions for option calculations
    	double Euro_PutPrice(double S, struct AmericanPut option, struct Modele modele) const;
     
     
    /*double Ame_CallPrice() const;// Black_Scholls*/
    	double Ame_PutPrice_Johnson (double S, struct AmericanPut &option, struct Modele modele)const;// Analytic solution!  
     
     
    };
    partie code:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
     
    #include <iostream>			//I/O stuff like cout, cin
    #include "Option.h"
    #include <math.h>
    #include <conio.h>
     
    #ifndef pi 
    #define pi 3.141592653589793238462643
    #endif
     
    using namespace std ;
     
     
    const int PriceStepNb=200; 
    const int TimeStepNb=200 ;
    const double Precision =0.01;// wofür
    const int DaysInYearNb=360;
     
     
    double Date;
    long Amount;
    typedef double vecteur[PriceStepNb];
     
     
     
    double n(double x) 
    { // Gaussian (normal) distribution function
    	double K = 1.0/sqrt(2.0 * pi);
    	return K * exp(-pow(x,2)*0.5);
    };
     
    double N( double x){
    	const double c[]={ 0.196854, 0.115194, 0.000344, 0.019527};
     
    	 if(x >= 0.0) {
              double y1=1+x*(c[0]+x*(c[1] + x*(c[2] + c[3]*x)));
    	      double z1=1/y1;
              return (1-0.5*pow(z1,4));
              }
         else {
              return 1-N(-x);
           }
    };
     
    // Kernel Functions 
     
    double Option::Euro_PutPrice(double S, struct AmericanPut option, struct Modele modele) const
    {
    	double tmp = modele.sigma * sqrt(option.MaturityDate-option.ContractDate);
    	double d1 = ( log(S/K) + (modele.r+ (modele.sigma*modele.sigma)*0.5 ) * option.MaturityDate )/ tmp;
    	double d2 = d1 - tmp;
    	return (option.StrikePrice * exp(-modele.r * option.MaturityDate)* N(-d2)) - (S * N(-d1));
    };
     
    double Option::Ame_PutPrice_Johnson(double S, struct AmericanPut &option, struct Modele modele) const {
     
     
    	const double a0 = 3.9649; 
        const double a1 = 0.032325;
        const double b0 = 1.04083;
    	const double b1 = 0.00963;
    	double tau=option.MaturityDate-option.ContractDate;
    	double gam=modele.sigma*modele.sigma*tau/(b0*modele.sigma*modele.sigma*tau+b1);
    	double S_f=option.StrikePrice*pow((2*modele.r/(modele.sigma*modele.sigma+2*modele.r)),gam);
    	double betha=log(S/S_f)/log(option.StrikePrice/S_f);
    	double alfa=pow(modele.r*tau/(a0*r*tau+a1),betha);
    	double V_l=Euro_PutPrice( S, option, modele   );
    	AmericanPut cp_option(option);
        raz(cp_option);
        double V_u=Euro_PutPrice(S , cp_option, modele );
    	return alfa*V_l+(1-alfa)*V_u;
     
    	};
     
    void Option::init()
    { // Initialise all default values
     
    	// Default values
    	r = 0.1;
    	sig= 0.30;
    	K = 50.0;
    	T = 0.4166;
    	S = 50.0;		
     
    	optType = "C";	// European Call Option (the default type)
     
    };
     
    void Option::copy(const Option& o2)
    {
     
    	r	= o2.r;
    	sig = o2.sig;	
    	K	= o2.K;
    	T	= o2.T;
    	S	= o2.S;
    	optType = o2.optType;
     
    };
     
    Option::Option() 
    { // Default call option
     
    	init();
    };
     
    Option::Option(const Option& o2)
    { // Copy constructor
     
    	copy(o2);
    };
     
    Option::Option (const string& optionType)
    { // Create option type
     
    	init();
    	optType = optionType;
     
    	if (optType == "c")optType = "C";
    };
     
     
    Option::~Option()
    { // Destructor
     
    };
     
     
    Option& Option::operator = (const Option& opt2)
    { // Assignment operator (deep copy)
     
    	if (this == &opt2) return *this;
     
    	copy (opt2);
     
    	return *this;
    };
     
    // Functions that calculate EuroOption price 
    double Option::Black_Schol_Price() const 
    {
    	if (optType == "C")return Euro_CallPrice();
    	else return Euro_PutPrice();
    };
     
    double num_eva_Price() const;// Brenann&Schwartz as numeric solution
    {
    	if (optType == "C")return Euro_CallPrice()
    	else Ame_PutPrice_BS (); 
    };
    double analy_eva_Price() const;// Johnson as anlytic solution
    {
    	 return Ame_PutPrice_Johnson (); 
     
    };
     
    void option::raz()
    {
    StikePrice=StikePrice*exp(MaturityDate-ContractDate);
    };
     
     
     
     
    void Option::toggle()
    { // Change option type (C/P, P/C)
     
    	if (optType == "C")optType = "P";
    	else optType = "C";
    };
     
    int main()
     
    { 
    	Option::AmericanPut Test={ 0 , 150 , 50 };
    	Option::Modele modele ={ 0.1 , 0.4 , 50 };
    	Option europut;
    	europut.optType = "P";
    	cout << "European Put  option : " << "" <<europut.Black_Schol_Price() << endl;
    	cout << "Johnson              :	" << "" << Ame_PutPrice_Johnson( 50 , 0 , 50 , 0.1 , 0.4 , 0.4666)<< endl;
     
    	getch();
    };
    voila!

  20. #20
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour,
    Effectivement, j'avais un peu relu de travers et mélanger tes structures. Donc, AmericanPut est une structure interne de Option mais, Option n'a pas de membre de ce type. Donc petit retour en arrière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //dans le .h
    void raz(struct AmericanPut &option) const;
    
    // et dans le .c:
    void option::raz(AmericanPut &_option_put) const
    {
    _option_put.StrikePrice=_option_put.StrikePrice*exp(_option_put.MaturityDate-_option_put.ContractDate);
    };
    P.S. Pourquoi StrikePrice est de type long alors que MaturityDate et ContractDate sont des doubles. Le calcul ci-dessus produit un double.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Probleme de typedef struct
    Par matdakillah dans le forum Linux
    Réponses: 19
    Dernier message: 01/08/2008, 16h54
  2. struct / typedef struct
    Par darkwall_37 dans le forum Débuter
    Réponses: 2
    Dernier message: 14/06/2008, 16h43
  3. Questions sur Typedef Struct
    Par pinto_armindo dans le forum C
    Réponses: 6
    Dernier message: 26/11/2007, 20h22
  4. typedef struct
    Par moon93 dans le forum C
    Réponses: 3
    Dernier message: 10/05/2006, 11h22
  5. Réponses: 6
    Dernier message: 31/08/2005, 13h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo