//+------------------------------------------------------------------+
//| NormalDistributionExample.mq5 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
//--- include the functions for calculating the normal distribution
#include <Math\Stat\Normal.mqh>
//+------------------------------------------------------------------+
//| Fonction de lancement du script |
//+------------------------------------------------------------------+
void OnStart()
{
//--- définit les paramètres de la distribution normale
double mu=5.0;
double sigma=1.0;
PrintFormat("Distribution normale avec les paramètres mu=%G and sigma=%G, exemples de calcul :",mu,sigma);
//--- définit l'intervalle
double x1=mu-sigma;
double x2=mu+sigma;
//--- variables pour le calcul de la probabilité
double cdf1,cdf2,probability;
//--- variables pour les codes d'erreurs
int error_code1,error_code2;
//--- calcule les valeurs des fonctions de distribution
cdf1=MathCumulativeDistributionNormal(x1,mu,sigma,error_code1);
cdf2=MathCumulativeDistributionNormal(x2,mu,sigma,error_code2);
//--- vérifie les codes d'erreur
if(error_code1==ERR_OK && error_code2==ERR_OK)
{
//--- calcule la probabilité d'une variable aléatoire dans l'intervalle
probability=cdf2-cdf1;
//--- sort le résultat
PrintFormat("1. Calcule la probabilité d'une variable aléatoire dans l'intervalle %.5f<x<%.5f",x1,x2);
PrintFormat(" Réponse : Probabilité = %5.8f",probability);
}
//--- Cherche l'intervalle de valeurs de la variable aléatoire x, correspondant aux 95% du niveau de confiance
probability=0.95; // définit la probabilité de confiance
//--- définit les probabilités aux limites de l'intervalle
double p1=(1.0-probability)*0.5;
double p2=probability+(1.0-probability)*0.5;
//--- calcule les limites de l'intervalle
x1=MathQuantileNormal(p1,mu,sigma,error_code1);
x2=MathQuantileNormal(p2,mu,sigma,error_code2);
//--- vérifie les codes d'erreur
if(error_code1==ERR_OK && error_code2==ERR_OK)
{
//--- affiche le résultat
PrintFormat("2. Pour l'intervalle de confiance = %.2f, cherche l'intervalle de la variable aléatoire",probability);
PrintFormat(" Réponse: l'intervalle est %5.8f <= x <=%5.8f",x1,x2);
}
PrintFormat("3. Calcule les 4 premiers moments théoriques de la distribution");
//--- Génère un tableau de nombres aléatoires, calcule les 4 premiers moments et les compare avec les valeurs théoriques
int data_count=1000000; // définit le nombre de valeurs et prépare un tableau
double data[];
ArrayResize(data,data_count);
//--- génère des valeurs aléatoires et les stocke dans le tableau
for(int i=0; i<data_count; i++)
{
data[i]=MathRandomNormal(mu,sigma,error_code1);
}
//--- définit l'indice de la valeur initiale et la quantité de données pour le calcul
int start=0;
int count=data_count;
//--- calcule les 4 premiers moments des valeurs générées
double mean=MathMean(data,start,count);
double variance=MathVariance(data,start,count);
double skewness=MathSkewness(data,start,count);
double kurtosis=MathKurtosis(data,start,count);
//--- variables pour les moments théoriques
double normal_mean=0;
double normal_variance=0;
double normal_skewness=0;
double normal_kurtosis=0;
//--- affiche les valeurs des moments calculés
PrintFormat(" Moyenne Variance Coef Dissymetrie Kurtosis");
PrintFormat("Calculés %.10f %.10f %.10f %.10f",mean,variance,skewness,kurtosis);
//--- calcule les valeurs théoriques des moments et les compare avec les valeurs obtenues
if(MathMomentsNormal(mu,sigma,normal_mean,normal_variance,normal_skewness,normal_kurtosis,error_code1))
{
PrintFormat("Théoriques %.10f %.10f %.10f %.10f",normal_mean,normal_variance,normal_skewness,normal_kurtosis);
PrintFormat("Différence %.10f %.10f %.10f %.10f",mean-normal_mean,variance-normal_variance,skewness-normal_skewness,kurtosis-normal_kurtosis);
}
}
|