//+------------------------------------------------------------------+
//| 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"
//--- fügen wir Funktionen für die Berechnung der Normalverteilung hinzu
#include <Math\Stat\Normal.mqh>
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- setzen wir Parameter der Normalverteilung
double mu=5.0;
double sigma=1.0;
PrintFormat("Normalverteilung mit den Parametern mu=%G und sigma=%G, Beispiele der Berechnung:",mu,sigma);
//--- Interval setzen
double x1=mu-sigma;
double x2=mu+sigma;
//--- Variablen für die Berechnung der Wahrscheinlichkeit
double cdf1,cdf2,probability;
//--- Variablen für den Fehlercode
int error_code1,error_code2;
//--- berechnen wir den Wert der Funktion der Verteilung
cdf1=MathCumulativeDistributionNormal(x1,mu,sigma,error_code1);
cdf2=MathCumulativeDistributionNormal(x2,mu,sigma,error_code2);
//--- überprüfen wir den Fehlercode
if(error_code1==ERR_OK && error_code2==ERR_OK)
{
//--- berechnen wir die Wahrscheinlichkeit der Zufallsvariablen im angebebenen Bereich
probability=cdf2-cdf1;
//--- Ergebnis ausgeben
PrintFormat("1. Die Wahrscheinlichkeit des Auftretens der Zufallszahl im Bereich %.5f<x<%.5f berechnen",x1,x2);
PrintFormat(" Antwort: Probability = %5.8f",probability);
}
//--- Finden wir den Wertebereich der Zufallsvariablen x, der mit dem Konfidenzintervall von 95% übereinstimmt
probability=0.95; // setzen wir das Konfidentzintervall
//--- setzen wir Wahrscheinlichkeiten an den Grenzen des Intervalls
double p1=(1.0-probability)*0.5;
double p2=probability+(1.0-probability)*0.5;
//--- berechnen wir die Grenzen des Berecihs
x1=MathQuantileNormal(p1,mu,sigma,error_code1);
x2=MathQuantileNormal(p2,mu,sigma,error_code2);
//--- überprüfen wir den Fehlercode
if(error_code1==ERR_OK && error_code2==ERR_OK)
{
//--- geben wir das Ergebnis aus
PrintFormat("2. Für das Konfidenzintervall = %.2f den Wertebereich der Zufallsvariablen finden",probability);
PrintFormat(" Anwort: Wertebereich %5.8f <= x <=%5.8f",x1,x2);
}
PrintFormat("3. Berechnete und theoretische 4 Momente der Verteilung berechnen");
//--- Generieren wir das Array der Zufallsvariablen, berechnen wir die ersten 4 Momente und vergleichen wir diese mit den theoretischen Werten
int data_count=1000000; // setzen wir die Anzahl der Werte und bereiten ein Array vor
double data[];
ArrayResize(data,data_count);
//--- erzeugen wir Zufallszahlen und speichern diese im Array
for(int i=0; i<data_count; i++)
{
data[i]=MathRandomNormal(mu,sigma,error_code1);
}
//--- setzen wir den Index des Anfangswertes und die Anzahl der Daten für die Berechnung
int start=0;
int count=data_count;
//--- berechnen wir die ersten 4 Momente der erzeugten Werte
double mean=MathMean(data,start,count);
double variance=MathVariance(data,start,count);
double skewness=MathSkewness(data,start,count);
double kurtosis=MathKurtosis(data,start,count);
//--- Variablen für theoretische Momente
double normal_mean=0;
double normal_variance=0;
double normal_skewness=0;
double normal_kurtosis=0;
//--- geben wir die Werte der berechneten Momente aus
PrintFormat(" Mean Variance Skewness Kurtosis");
PrintFormat("Calculated %.10f %.10f %.10f %.10f",mean,variance,skewness,kurtosis);
//--- berechnen wir theoretische Werte der Momente und vergleichen diese mit den erhaltenen
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);
}
}
|