//+------------------------------------------------------------------+ //| 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); } } |