ALGLIB - 数值分析库 - MetaTrader 4程序库
- 显示:
- 6949
- 等级:
- 已发布:
- 2015.08.05 13:50
- 已更新:
- 2023.09.12 10:33
- 需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
原作者:
Sergey Bochkanov. ALGLIB项目网址 - http://www.alglib.net/. 该库的历史可 追溯至1999年。
ALGLIB是最大最完整的数学库之一
你需要做快速傅立叶变换或解答一个差分方程系统吗?你试图在一个源代码里收集所有方法以执行复杂的数据分析吗?那么 ALGLIB 数值方法库就是你所需要的!
ALGLIB是目前多语言算法的最好库之一。以下是在官方网站提到的ALGLIB的特性:
ALGLIB是一个跨平台的数值分析和数据处理库。它支持多种编程语言及 (C++, C#, Pascal, VBA) 和多种操作系统 (Windows, Linux, Solaris)。ALGLIB功能包括:
- 线性代数(直接算法,EVD / SVD)
- 解算器(线性和非线性)
- 插值
- 优化
- 快速傅里叶变换
- 数值积分
- 线性和非线性最小二乘拟合
- 常微分方程
- 特殊功能
- 统计数据(描述性统计,假设检验)
- 数据分析(分类/回归,包括神经网络)
- 多重精密版线性代数,插值优化和其他算法(使用MPFR浮点运算)
为什么要选择ALGLIB?因为它是:
ALGLIB库不断增强,根据用户的意见定期实现新的功能和改进。最新的版本是3.6.0。
此外,库中包含大量的测试用例,覆盖了所提方法的大部分功能。这将允许你进行测试并将检测到的错误报告给项目作者。
CAlglib类的静态函数应该被用来与库合作 - 所有的库函数作为静态函数被移动到CAlglib系统类。
附件中包括测试用例 脚本testclasses.mq4和testinterfaces.mq4与一个简单的演示脚本usealglib.mq4。同名的包括文件 (testclasses.mqh和testinterfaces.mqh)用于加载测试用例。他们应被放置到 \MQL4\Scripts\Alglib\Testcases\.
注意: testclasses.mq4脚本执行需要相当长的时间(约30分钟)。
以下是有关ALGLIB MQL4移植库包的更详细的信息:
包 | 描述 |
---|---|
alglib.mqh | 该主要库包包括自定义函数。这些函数应该被调用来与库合作。 |
alglibinternal.mqh | 用于操作其他库包的附加类。 |
alglibmisc.mqh | 该软件包包含以下类:
|
ap.mqh | 该包还包含其他包所必需的附加类。 |
bitconvert.mqh | MQL4自身缺少的С++的基本类和函数:
|
complex.mqh | 定义操作复杂数的复杂结构。 |
dataanalysis.mqh | 数据分析类:
|
delegatefunctions.mqh | 该软件包包含为替换代理而创建的类。这些类的对象是在各种库方法中优化的函数。 |
diffequations.mqh | 解常微分方程的类:
|
fasttransforms.mqh | 快速变换类:
|
integration.mqh | 数值积分的类:
|
interpolation.mqh | 插值,逼近和数值分化类:
|
linalg.mqh | 一些线性代数操作的计算类:
|
matrix.mqh | 矩阵类:整数,连续的和复杂的。 |
optimization.mqh | 维和多维优化类:
|
solvers.mqh | 解线性和非线性方程组的类:
|
specialfunctions.mqh | 分布函数,积分和多项式的类:
|
statistics.mqh | 统计数据分析类:
|
代码:
库函数都有对自身用法的详细注释。
//+------------------------------------------------------------------+ //| 分布时机计算: 均值, 方差, | //| 偏度, 峰度. | //| 输入参数: | //| X - 样品 | //| N - N>=0, 样本大小: | //| * 如果赋值,则只前N个元素 | //| 被处理 | //| * 如果未赋值,则自动取值为 | //| X的大小 | //| 输出参数 | //| Mean - 均值. | //| Variance- 方差. | //| Skewness- 偏度 (如果方差为0则取值为0). | //| Kurtosis- 峰度 (如果方差为0则取值为0). | //+------------------------------------------------------------------+ static bool CBaseStat::SampleMoments(const double &cx[],const int n,double &mean, double &variance,double &skewness,double &kurtosis) { //--- 检测 if(!CAp::Assert(n>=0,__FUNCTION__+": the error variable")) return(false); //--- 检测 if(!CAp::Assert(CAp::Len(cx)>=n,__FUNCTION__+": length(x)<n")) return(false); //--- 检测 if(!CAp::Assert(CApServ::IsFiniteVector(cx,n),__FUNCTION__+": x is not finite vector")) return(false); //--- 创建变量 double v=0; double v1=0; double v2=0; double stddev=0; //--- 初始化, 特例 'N=0' mean=0; variance=0; skewness=0; kurtosis=0; //--- 检测 if(n<=0) return(true); //--- 均值 for(int i=0;i<n;i++) mean+=cx[i]; mean/=n; //--- 方差 (使用正确的二过算法) if(n!=1) { //--- 计算 for(int i=0;i<n;i++) v1+=CMath::Sqr(cx[i]-mean); for(int i=0;i<n;i++) v2+=cx[i]-mean; v2=CMath::Sqr(v2)/n; variance=(v1-v2)/(n-1); //--- 计算 stddev=MathSqrt(variance); } else variance=EMPTY_VALUE; //--- 偏度和峰度 if(stddev!=0) { //--- 计算 for(int i=0;i<n;i++) { v=(cx[i]-mean)/stddev; v2=CMath::Sqr(v); skewness+=v2*v; kurtosis+=CMath::Sqr(v2); } //--- 修改值 skewness=skewness/n; kurtosis=kurtosis/n-3; } //--- 成功执行 return(true); }
CAlglib类的静态函数应该被用来与库合作。以下是计算一些交易统计参数的usealglib.mq4函数脚本的源代码 :
//+------------------------------------------------------------------+ //| UseAlglib.mq4 | //| Copyright 2012, MetaQuotes Software Corp. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "2012 版权所有, MetaQuotes软件公司" #property link "http://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| 引入库文件 | //+------------------------------------------------------------------+ #include <Math\Alglib\alglib.mqh> #include <Trade\DealInfo.mqh> #include <Arrays\ArrayDouble.mqh> //+------------------------------------------------------------------+ //| 脚本程序 start 函数 | //+------------------------------------------------------------------+ void OnStart() { //--- 访问交易数据的对象 CDealInfo deal; //--- 存储每笔交易的盈利/亏损的对象 CArrayDouble *profit=new CArrayDouble; //--- 存储余额的对象 CArrayDouble *balance_total=new CArrayDouble; //--- 初始余额 double balance=0; //--- 获取历史数据 HistorySelect(0,TimeCurrent()); //---总交易量 int deals_total=HistoryDealsTotal(); //--- 获取交易盈利和余额数据 for(int i=0;i<deals_total;i++) { //--- 选择第i个交易 deal.SeilectByIndex(i); //--- 获取初始余额 if(deal.DealType()==DEAL_TYPE_BALANCE) { if(NormalizeDouble(deal.Profit()+deal.Swap(),2)>=0.0) if(balance==0.0) balance=deal.Profit(); } //--- 获取盈利和余额 if(deal.DealType()==DEAL_TYPE_BUY || deal.DealType()==DEAL_TYPE_SELL) if(deal.Entry()==DEAL_ENTRY_OUT || deal.Entry()==DEAL_ENTRY_INOUT) { profit.Add(NormalizeDouble(deal.Profit()+deal.Swap()+deal.Commission(),2)); balance_total.Add(balance); balance=balance+NormalizeDouble(deal.Profit()+deal.Swap()+deal.Commission(),2); } } balance_total.Add(balance_total.At(balance_total.Total()-1)+profit.At(balance_total.Total()-1)); //--- 将余额数据拷贝到double型数组 double arr_balance[]; ArrayResize(arr_balance,balance_total.Total()); for(int i=0;i<balance_total.Total();i++) arr_balance[i]=balance_total.At(i); //---将盈利数据拷贝到double型数组 double arr_profit[]; ArrayResize(arr_profit,profit.Total()); for(int i=0;i<profit.Total();i++) arr_profit[i]=profit.At(i); //--- 线性回归 //--- 独立变量个数 int nvars=1; //--- 样品成交量 int npoints=balance_total.Total(); //--- 创建线性回归参数的矩阵 CMatrixDouble xy(npoints,nvars+1); for(int i=0;i<npoints;i++) { xy[i].Set(0,i); xy[i].Set(1,arr_balance[i]); } //--- 检测计算结果 (成功, 不成功)的变量 int info; //--- 存储计算数据所必需的类对象 CLinearModelShell lm; CLRReportShell ar; //--- 存储回归结果的数组 double lr_coeff[]; double lr_values[]; ArrayResize(lr_values,npoints); //--- 计算线性回归率 CAlglib::LRBuild(xy,npoints,nvars,info,lm,ar); //---接收线性回归率 CAlglib::LRUnpack(lm,lr_coeff,nvars); //--- 接收回收线性回归值 for(int i=0;i<npoints;i++) lr_values[i]=lr_coeff[0]*i+lr_coeff[1]; //--- 计算预期回报 double exp_payoff,tmp1,tmp2,tmp3; CAlglib::SampleMoments(arr_profit,exp_payoff,tmp1,tmp2,tmp3); //--- 计算HPR数组 double HPR[]; ArrayResize(HPR,balance_total.Total()-1); for(int i=0;i<balance_total.Total()-1;i++) HPR[i]=balance_total.At(i+1)/balance_total.At(i); //--- 计算HPR标准偏差和数学期望 double AHPR,SD; CAlglib::SampleMoments(HPR,AHPR,SD,tmp2,tmp3); SD=MathSqrt(SD); //--- 计算LR关联 double lr_corr=CAlglib::PearsonCorr2(arr_balance,lr_values); //--- 接收LR标准错误 double lr_stand_err=0; for(int i=0;i<npoints;i++) { double delta=MathAbs(arr_balance[i]-lr_values[i]); lr_stand_err=lr_stand_err+delta*delta; } lr_stand_err=MathSqrt(lr_stand_err/(npoints-2)); //--- 计算Sharpe比率 double sharpe_ratio=(AHPR-1)/SD; //--- 打印 PrintFormat("-----------------------------------------------"); PrintFormat("Correlation function: y = %.2fx + %.2f",lr_coeff[0],lr_coeff[1]); //--- 参数 PrintFormat("Expected Payoff = %.2f",exp_payoff); PrintFormat("AHPR = %.4f",AHPR); PrintFormat("Sharpe Ratio = %.2f",sharpe_ratio); PrintFormat("LR Correlation = %.2f",lr_corr); PrintFormat("LR Standard Error = %.2f",lr_stand_err); PrintFormat("-----------------------------------------------"); //--- 删除对象 delete profit; delete balance_total; } //+------------------------------------------------------------------+
我们得到以下结果:
由MetaQuotes Ltd译自俄语
原代码: https://www.mql5.com/ru/code/11077
FuzzyNet 程序库用于开发模糊模块, 以 C# 编写。当移植到 MQL4 时, 程序库里添加了 8 个隶属函数, 以及 4 个针对马丹尼 (Mamdani) 型系统的去模糊化方法。
OrderTimeAlert该 EA观察市价单, 并自开单时间, 根据预定义时间生成声音信号。