//+------------------------------------------------------------------+
//| NormalDistributionExample.mq5 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//--- 包括计算正态分布的函数
#include <Math\Stat\Normal.mqh>
//+------------------------------------------------------------------+
//| 脚本程序起始函数 |
//+------------------------------------------------------------------+
void OnStart()
{
//--- 设置正态分布的参数
double mu=5.0;
double sigma=1.0;
PrintFormat("Normal distribution with parameters mu=%G and sigma=%G, calculation examples:",mu,sigma);
//--- 设置间隔
double x1=mu-sigma;
double x2=mu+sigma;
//--- 概率计算变量
double cdf1,cdf2,probability;
//--- 错误代码变量
int error_code1,error_code2;
//--- 计算分布函数值
cdf1=MathCumulativeDistributionNormal(x1,mu,sigma,error_code1);
cdf2=MathCumulativeDistributionNormal(x2,mu,sigma,error_code2);
//--- 检查错误代码
if(error_code1==ERR_OK && error_code2==ERR_OK)
{
//--- 计算范围内随机变量概率
probability=cdf2-cdf1;
//--- 输出结果
PrintFormat("1. 计算%.5f范围内随机变量的概率<x<%.5f",x1,x2);
PrintFormat(" Answer: Probability = %5.8f",probability);
}
//--- 对应95%的置信度,寻找随机变量x的值范围
probability=0.95; // 设置置信概率
//--- 在区间范围设置概率
double p1=(1.0-probability)*0.5;
double p2=probability+(1.0-probability)*0.5;
//--- 计算区间范围
x1=MathQuantileNormal(p1,mu,sigma,error_code1);
x2=MathQuantileNormal(p2,mu,sigma,error_code2);
//--- 检查错误代码
if(error_code1==ERR_OK && error_code2==ERR_OK)
{
//--- 输出结果
PrintFormat("2. 如果置信区间 = %.2f,请查找随机变量的范围",probability);
PrintFormat(" Answer: range is %5.8f <= x <=%5.8f",x1,x2);
}
PrintFormat("3. 估算分布的前4个已计算的理论力矩");
//--- 生成随机数数组,计算前4力矩和比较理论值
int data_count=1000000; // 设置值数和准备数组
double data[];
ArrayResize(data,data_count);
//--- 生成随机值并将其存入数组
for(int i=0; i<data_count; i++)
{
data[i]=MathRandomNormal(mu,sigma,error_code1);
}
//--- 设置初始值指数和计算的数据量
int start=0;
int count=data_count;
//--- 计算生成值的前4力矩
double mean=MathMean(data,start,count);
double variance=MathVariance(data,start,count);
double skewness=MathSkewness(data,start,count);
double kurtosis=MathKurtosis(data,start,count);
//--- 理论力矩变量
double normal_mean=0;
double normal_variance=0;
double normal_skewness=0;
double normal_kurtosis=0;
//--- 显示计算的力矩值
PrintFormat(" Mean Variance Skewness Kurtosis");
PrintFormat("Calculated %.10f %.10f %.10f %.10f",mean,variance,skewness,kurtosis);
//--- 计算力矩理论值并将其与获得的值相比较
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);
}
}
|