下载MetaTrader 5

请观看如何免费下载自动交易

有趣的脚本?
因此发布一个链接 -
让其他人评价

喜欢这个脚本? 在MetaTrader 5客户端尝试它

2013.11.07 11:41
程序库

ALGLIB - 数值分析库 - MetaTrader 5程序库

| Chinese English Русский Español Deutsch 日本語 Português

发布者:
MetaQuotes Software Corp.
显示:
2493
等级:
投票: 65
\MQL5\Include\Math\Alglib\
alglib.mqh (1381.07 KB)预览
ap.mqh (76.79 KB)预览
complex.mqh (15.03 KB)预览
integration.mqh (122.81 KB)预览
linalg.mqh (716.02 KB)预览
matrix.mqh (24.86 KB)预览
solvers.mqh (150.29 KB)预览
statistics.mqh (399.33 KB)预览
\MQL5\Scripts\Alglib\Testcases\
testclasses.mqh (1382.38 KB)预览
\MQL5\Scripts\Alglib\

原作者:

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?因为它是:

  • 可移植的. 它可以在几乎任何地方使用任何编译器编译(参见兼容性矩阵获取更多信息)。
  • 易用的。它支持多种编程语言。如果你使用一种语言,你并不需要学习另一个语言(例如FORTRAN)来编译和链接外部库。
  • 开源的. 它可以在GPL 2 +协议下免费使用。
  • 也适合商业用户的。那些想要在商业应用中使用ALGLIB的用户可以购买商业许可而没有著佐权的要求。

ALGLIB库不断增强,根据用户的意见定期实现新的功能和改进。最新的版本是3.6.0。

此外,库中包含大量的测试用例,覆盖了所提方法的大部分功能。这将允许你进行测试并将检测到的错误报告给项目作者。


CAlglib类的静态函数应该被用来与库合作 - 所有的库函数作为静态函数被移动到CAlglib系统类。

附件中包括测试用例脚本testclasses.mq5和testinterfaces.mq5与一个简单的演示脚本usealglib.mq5。同名的包括文件(testclasses.mqh和testinterfaces.mqh)用于加载测试用例。他们应被放置到 \MQL5\Scripts\Alglib\Testcases\.

注意: testclasses.mq5脚本执行需要相当长的时间(约30分钟)。

以下是有关ALGLIB MQL5移植库包的更详细的信息:


描述
alglib.mqh
该主要库包包括自定义函数。这些函数应该被调用来与库合作。
alglibinternal.mqh
用于操作其他库包的附加类。
alglibmisc.mqh

该软件包包含以下类:

  1. CHighQualityRand - 高质随机数产生器。
  2. CNearestNeighbor - KD-树 代和结论。
ap.mqh 该包还包含其他包所必需的附加类。
bitconvert.mqh MQL5自身缺少的С++的基本类和函数:
  1. BitConverter - 用来将int和double型数字与位数组互相转换的类。
  2. CInfOrNaN - NaN和正/负无穷的验证和生成类。
  3. ArrayReverse - 反转数组元素的函数。
  4. GetSelectionString - 接收从char型数组元素产生的字符串的函数。
  5. MathSign - 数字符号计算函数。
  6. MathSinh - 双曲正弦计算函数。
  7. MathCosh - 双曲余弦计算函数。
  8. MathTanh - 双曲正切计算函数。
complex.mqh 定义操作复杂数的复杂结构。
dataanalysis.mqh 数据分析类:
  1. CBdSS - 误差函数计算。
  2. CDForest - 操作方案树的森林。
  3. CKMeans - 使用k-means++ 算法的集群。
  4. CLDA - 线性判别分析。
  5. CLinReg - 线性回归。
  6. CMLPBase - 多层感知器(神经网络)。
  7. CLogit - 多项Logit回归。
  8. CMarkovCPD - 人口数据的马尔可夫链。
  9. CMLPTrain - 多层感知器的训练。
  10. CMLPE - 神经网络的合成。
  11. CPCAnalysis - 主成分分析法。
delegatefunctions.mqh 该软件包包含为替换代理而创建的类。这些类的对象是在各种库方法中优化的函数。
diffequations.mqh 解常微分方程的类:
  1. CODESolver - 解常微分方程.
fasttransforms.mqh 快速变换类:
  1. CFastFourierTransform - 快速傅立叶变换。
  2. CCONV - 卷积码。
  3. CCorr - 交叉相关。
  4. CFastHartleyTransform - 快速哈特利变换。
integration.mqh 数值积分的类:
  1. CGaussQ - 高斯正交。
  2. CGaussKronrodQ - 高斯-Kronrod求积公式。
  3. CAutoGK - 自适应积分。
interpolation.mqh 插值,逼近和数值分化类:
  1. CIDWInt - 逆加权平均距离的插值和逼近.
  2. CRatInt - 关系插值.
  3. CPolInt - 多项式插值。
  4. CSpline1D - 一维样条插值。
  5. CLSFit - 线性或非线性最小二乘法近似。
  6. CPSpline - 参数化样条插值。
  7. CSpline2D - 二维样条插值。
linalg.mqh 一些线性代数操作的计算类:
  1. COrtFac - QR / LQ分解,Hessenberg分解,以及双向和三对角矩阵。
  2. CEigenVDetect - 寻找特征值和特征向量。
  3. CMatGen - 随机矩阵生成.
  4. CTrFac - LU和乔莱斯基分解。
  5. CRCond - 矩阵依赖值评估。
  6. CMatInv - 矩阵求逆。
  7. CBdSingValueDecompose - 双对角矩阵的奇异值分解。
  8. CSingValueDecompose - 矩阵奇异值分解。
  9. CFbls - 快速基本线性解决方案。
  10. CMatDet - 矩阵行列式计算。
  11. CSpdGEVD - 寻找广义对称矩阵的特征值和特征向量。
  12. CInverseUpdate - 矩阵反演和更新。
  13. CSchur - 一斋舒尔分解。
matrix.mqh 矩阵类:整数,连续的和复杂的。
optimization.mqh 维和多维优化类:
  1. CMinCG - 利用共轭梯度法优化。
  2. CMinBLEIC - 方程和不等式形式的线性约束优化。
  3. CMinLBFGS -使用二次函数模型的连续生成和分类进行优化。
  4. CMinQP - 方程和不等式形式的线性约束二次规划
  5. CMinLM - 使用Levenberg-Marquardt算法优化。
  6. CMinComp - 向后兼容的函数。
solvers.mqh 解线性和非线性方程组的类:
  1. CDenseSolver - 解线性方程组.
  2. CNlEq - 解非线性方程组
specialfunctions.mqh 分布函数,积分和多项式的类:
  1. CGammaFunc - 伽玛函数。
  2. CIncGammaF - 不完全伽玛函数.
  3. CBetaF - 贝塔函数。
  4. CIncBetaF - 不完全β函数。
  5. CPsiF - psi-函数.
  6. CAiryF - Airy函数.
  7. CBessel - 积分序列的Bessel函数.
  8. CJacobianElliptic - Jacobi椭圆函数。
  9. CDawson - 道森积分。
  10. CTrigIntegrals - 三角积分。
  11. CElliptic - 椭圆积分的第一类和第二类。
  12. CExpIntegrals - 指数积分。
  13. CFresnel - 菲涅尔积分。
  14. CHermite - 埃尔米特多项式。
  15. CChebyshev - 切比雪夫多项式。
  16. CLaguerre - 拉盖尔多项式。
  17. CLegendre - 勒让德多项式。
  18. CChiSquareDistr - 卡方分布。
  19. CBinomialDistr - 二项分布。
  20. CNormalDistr - 正态分布。
  21. CPoissonDistr - 泊松分布。
  22. CStudenttDistr - 学生t-分布。
  23. CFDistr - F-分布。
statistics.mqh 统计数据分析类:
  1. CBaseStat - 基本统计法.
  2. CCorrTests - 测试关联比重。
  3. CJarqueBera - JarqueBera标准。
  4. CMannWhitneyU - Mann-Whitney U-标准。
  5. CSignTest - 符号测试。
  6. CStudentTests - 学生t测试。
  7. CVarianceTests - F测试和卡方测试。
  8. CWilcoxonSignedRank - 魏氏W-标准。


代码:

库函数都有对自身用法的详细注释。

//+------------------------------------------------------------------+
//| 分布时机计算: 均值, 方差,                                           |
//| 偏度, 峰度.                                                       |
//| 输入参数:                                                         |
//|     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.mq5函数脚本的源代码 :

//+------------------------------------------------------------------+
//|                                                    UseAlglib.mq5 |
//|                        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 Software Corp. 撰写的俄文原文
官方代码: https://www.mql5.com/ru/code/1146

IndicatorParameters() 用法示例 IndicatorParameters() 用法示例

这个专家交易演示了使用 IndicatorParameters()函数来获取关于输入参数的数量,类型及其数值的信息。

EA_OBJPROP_CHART_ID EA_OBJPROP_CHART_ID

该EA交易是像传统图表那样操作OBJ_CHART对象的示例。您可以设置自定义颜色设置,附加指标等。

XRSX_BB_HTF XRSX_BB_HTF

该指示器是一个修改后的 RSI 版本,可以放置在图表上且具有另一个时间帧。它也允许用户改变 RSI 和信号线的平滑算法。

XMACD_HTF XMACD_HTF

标准MACD版本,可以设置一个与图表不同的指标时间帧。它也允许交易者选择柱状线和信号线的平滑算法。