//+------------------------------------------------------------------+
//| 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"
//--- activamos las funciones para calcular una distribución normal
#include <Math\Stat\Normal.mqh>
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- establecemos los parámetros de la distribución normal
double mu=5.0;
double sigma=1.0;
PrintFormat("Distribución normal con los parámetros mu=%G y sigma=%G, ejemplos de cálculo:",mu,sigma);
//--- establecemos el intervalo
double x1=mu-sigma;
double x2=mu+sigma;
//--- variables para el cálculo de la probabilidad
double cdf1,cdf2,probability;
//--- variables para el código de error
int error_code1,error_code2;
//--- calculamos los valores de la función de distribución
cdf1=MathCumulativeDistributionNormal(x1,mu,sigma,error_code1);
cdf2=MathCumulativeDistributionNormal(x2,mu,sigma,error_code2);
//--- comprobamos el código de los errores
if(error_code1==ERR_OK && error_code2==ERR_OK)
{
//--- calculamos la probabilidad de una magnitud aleatoria en el rango
probability=cdf2-cdf1;
//--- mostramos el resultado
PrintFormat("1. Calcular en el rango %.5f<x<%.5f la probabilidad de una magnitud aleatoria",x1,x2);
PrintFormat(" Respuesta: Probability = %5.8f",probability);
}
//--- Encontramos el intervalo de valores de la magnitud aleatoria x, que corresponde al 95% de la probabilidad confiada
probability=0.95; // establecemos la probabilidad confiada
//--- establecemos la probabilidad en los límites del intervalo
double p1=(1.0-probability)*0.5;
double p2=probability+(1.0-probability)*0.5;
//--- calculamos los límites del intervalo
x1=MathQuantileNormal(p1,mu,sigma,error_code1);
x2=MathQuantileNormal(p2,mu,sigma,error_code2);
//--- comprobamos el código de los errores
if(error_code1==ERR_OK && error_code2==ERR_OK)
{
//--- mostramos el resultado
PrintFormat("2. Para el intervalo confiado = %.2f encontrar el rango de la magnitud aleatoria",probability);
PrintFormat(" Respuesta: rango %5.8f <= x <=%5.8f",x1,x2);
}
PrintFormat("3. Calcular los primeros 4 momentos teóricos y calculados de la distribución");
//--- Generamos una matriz de números aleatorios, calculamos los primeros 4 momentos y comparamos con los valores teóricos
int data_count=1000000; // establecemos el número de valores y preparamos la matriz
double data[];
ArrayResize(data,data_count);
//--- generamos los valores aleatorios y los guardamos en la matriz
for(int i=0; i<data_count; i++)
{
data[i]=MathRandomNormal(mu,sigma,error_code1);
}
//--- establecemos el índice del valor incial y el número de datos para el cálculo
int start=0;
int count=data_count;
//--- calculamos los primeros 4 momentos de los valores generados
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 para los momentos teóricos
double normal_mean=0;
double normal_variance=0;
double normal_skewness=0;
double normal_kurtosis=0;
//--- mostramos los valores de los momentos calculados
PrintFormat(" Mean Variance Skewness Kurtosis");
PrintFormat("Calculated %.10f %.10f %.10f %.10f",mean,variance,skewness,kurtosis);
//--- calculamos los valores teóricos de los momentos y comparamos con los obtenidos
if(MathMomentsNormal(mu,sigma,normal_mean,normal_variance,normal_skewness,normal_kurtosis,error_code1))
{
PrintFormat("Theoretical %.10f %.10f %.10f %.10f",normal_mean,normal_variance,normal_skewness,normal_kurtosis);
PrintFormat("Difference %.10f %.10f %.10f %.10f",mean-normal_mean,variance-normal_variance,skewness-normal_skewness,kurtosis-normal_kurtosis);
}
}
|