Assista a como baixar robôs de negociação gratuitos
Encontre-nos em Twitter!
Participe de nossa página de fãs
Script interessante?
Coloque um link para ele, e permita que outras pessoas também o avaliem
Você gostou do script?
Avalie seu funcionamento no terminal MetaTrader 5
Bibliotecas

ALGLIB - Numerical Analysis Library - biblioteca para MetaTrader 5

Publicado por:
MetaQuotes
Visualizações:
8320
Avaliação:
(125)
Publicado:
2014.01.15 08:34
Atualizado:
2023.09.08 17:27
Precisa de um robô ou indicador baseado nesse código? Solicite-o no Freelance Ir para Freelance

Autor real:

Sergey Bochkanov. Site do projeto ALGLIB - http://www.alglib.net/. A biblioteca remonta a 1999.

ALGLIB é uma das maiores e mais completas bibliotecas matemáticas

Você precisa fazer uma transformação rápida de Fourier ou resolver um sistema de equações diferenciais? Você executa uma análise de dados complexos tentando reunir todos os métodos em um só lugar, como código-fonte? Então a biblioteca de métodos numéricos ALGLIB é para você!

ALGLIB é atualmente uma das melhores bibliotecas de algoritmos multi-linguagem. Abaixo estão os recursos ALGLIB mencionados no site oficial:

ALGLIB é uma multi-plataforma para análise numérica e biblioteca de processamento de dados. Ela suporta várias linguagens de programação (C++, C#, Pascal, Visual Basic for Applications) e vários sistemas operacionais (Windows, Linux, Solaris). Características de ALGLIB:

  • Álgebra Linear (algoritmos diretos, EVD/SVD)
  • Solucionadores (linear e não-linear)
  • Interpolação
  • Otimização
  • Transformação rápida de Fourier
  • Integração numérica
  • Mínimos quadrados lineares e não lineares
  • Equações diferenciais ordinárias
  • Funções especiais
  • Estatística (estatística descritiva, testes de hipóteses)
  • Análise de dados (classificação/regressão, incluindo redes neurais)
  • Várias versões de precisão de álgebra linear, otimização de interpolação e outros algoritmos (usando MPFR para cálculos de ponto flutuante)

Por que escolher ALGLIB? Por se tratar de:

  • portabilidade. Ela pode ser compilada em qualquer lugar usando quase todo o compilador (ver matriz de compatibilidade para mais informações).
  • fácil de usar. Ela suporta várias linguagens de programação. Se você usar uma linguagem, você não precisa estudar uma outra (Fortran, por exemplo) para compilar e linkar uma biblioteca externa.
  • open source. Ela pode ser usada gratuitamente sob a licença GPL 2+.
  • adequada também para usos comerciais. Aqueles que querem usar ALGLIB em aplicações comerciais podem comprar uma licença comercial sem exigência de copyleft.

A biblioteca ALGLIB está sendo constantemente aprimorada, novas funções e melhorias, de acordo com os comentários dos usuários, são implementadas regularmente. A versão mais recente é 4.0.

Além disso, a biblioteca contém uma grande coleção de casos que cobre a maior parte das funcionalidades dos métodos propostos. Isso permitirá que você realize testes e informe os erros encontrados aos autores do projeto.


As funções estáticas da classe CAlglib devem ser usadas para se trabalhar com a biblioteca, pois todas as funções da biblioteca são movidas para a classe de sistema CAlglib como funções estáticas.

Os scripts de casos de teste, testclasses.mq5 e testinterfaces.mq5, estão ligados em um script de demonstração usealglib.mq5. Arquivos Include de mesmo nome (testclasses.mqh e testinterfaces.mqh) são usados ​​para iniciar os casos de teste. Eles devem ser colocados em \MQL5\Scripts\Alglib\Testcases\.

Nota: a execução do script testclasses.mq5 leva muito tempo (cerca de 8 minutos).

Abaixo está uma informação mais detalhada sobre os pacotes de bibliotecas portados ALGLIB MQL5:

Pacotes
Descrição
alglib.mqh
O pacote da biblioteca principal inclui funções personalizadas. Estas funções devem ser chamadas para se trabalhar com a biblioteca.
alglibinternal.mqh
Classes adicionais para a operação de outros pacotes de bibliotecas.
alglibmisc.mqh

O pacote contém as seguintes classes:

  1. CHighQualityRand - gerador de números aleatórios de alta qualidade.
  2. CNearestNeighbor - Geração e solução de KD-trees.
ap.mqh O pacote contém também classes adicionais necessárias para outros pacotes.
bitconvert.mqh Classes básicas С++ e funções que estão ausentes em MQL5 como built-in:
  1. BitConverter - classe para transformar valores tipo double e int em uma matriz de bits e vice-versa.
  2. CInfOrNaN - NaNs, verificação infinita mais/menos e geração de classe.
  3. ArrayReverse - elementos da matriz de função inversa.
  4. GetSelectionString - função para receber a string gerada a partir de elementos da matriz tipo char.
  5. MathSign - função de cálculo de sinal de número.
  6. MathSinh - função de cálculo de seno hiperbólico.
  7. MathCosh - função de cálculo de cosseno hiperbólico.
  8. MathTanh - função de cálculo de tangente hiperbólica.
dataanalysis.mqh Classes para análise de dados:
  1. CBdSS - funções de cálculo de erro.
  2. CDForest - trabalhando com florestas de árvores de solução.
  3. CKMeans - clusterização usando algoritmo k-means++.
  4. CLDA - análise discriminante linear.
  5. CLinReg - regressão linear.
  6. CMLPBase - perceptron multicamadas (redes neurais).
  7. CLogit - regressão logit multinomial.
  8. CMarkovCPD - Cadeias de Markov para dados populosos.
  9. CMLPTrain - treinamento de perceptron multicamadas.
  10. CMLPE - conjuntos de redes neurais.
  11. CPCAnalysis - método de componentes principais.
delegatefunctions.mqh O pacote contém classes criadas como substitutas de outras. Os objetos dessas classes são funções otimizadas em vários métodos da biblioteca.
diffequations.mqh Classe para a solução de equações diferenciais ordinárias:
  1. CODESolver - resolução de equações diferenciais ordinárias.
fasttransforms.mqh Classes de transformação rápida:
  1. CFastFourierTransform - transformação rápida de Fourier.
  2. CConv - convolução.
  3. CCorr - correlação cruzada.
  4. CFastHartleyTransform - transformação rápida de Hartley.
integration.mqh Classes para integração numérica:
  1. CGaussQ - quadratura de Gauss.
  2. CGaussKronrodQ - fórmulas de quadratura Gauss–Kronrod.
  3. CAutoGK - integrador adaptativo.
interpolation.mqh Classes de interpolação, aproximação e de diferenciação numérica:
  1. CIDWInt - interpolação e aproximação pela distância média ponderada inversa.
  2. CRatInt - interpolação racional.
  3. CPolInt - interpolação polinomial.
  4. CSpline1D - interpolação de spline unidimensional.
  5. CLSFit - aproximação usando o método dos mínimos quadrados lineares ou não-lineares.
  6. CPSpline - interpolação de spline paramétrica.
  7. CSpline2D - interpolação de spline bidimensional.
linalg.mqh Classes para o cálculo de algumas operações de álgebra linear:
  1. COrtFac - Decomposições QR/LQ, decomposições de Hessenberg, bem como de matrizes bi e tridiagonais.
  2. CEigenVDetect - encontrar os autovalores e autovetores.
  3. CMatGen - geração de matrizes aleatórias.
  4. CTrFac - decomposições LU e Cholesky.
  5. CRCond - estimativa de um valor de dependência de matriz.
  6. CMatInv - inversão de matriz.
  7. CBdSingValueDecompose - decomposição singular de uma matriz bidiagonal.
  8. CSingValueDecompose - matriz de decomposição singular.
  9. CFbls - soluções lineares básicas rápidas.
  10. CMatDet - cálculo de determinante de matriz.
  11. CSpdGEVD - encontrar autovalores e autovetores de matrizes simétricas generalizadas.
  12. CInverseUpdate - matrizes de inversão e atualização.
  13. CSchur - decomposição de Issai Schur.
matrix.mqh Classes de matrizes: inteira, contínua e complexa.
optimization.mqh Classes de otimização dimensionais e multidimensionais:
  1. CMinCG - otimização utilizando o método do gradiente conjugado.
  2. CMinBLEIC - otimização com restrições lineares na forma de equações e inequações.
  3. CMinLBFGS - otimização usando geração e classificação do modelo quadrático da função sucessiva.
  4. CMinQP - programação quadrática com restrições lineares na forma de equações e inequações.
  5. CMinLM - otimização utilizando o algoritmo de Levenberg-Marquardt.
  6. CMinComp - funções de compatibilidade com versões anteriores.
solvers.mqh Classes para resolver sistemas de equações lineares e não-lineares:
  1. CDenseSolver - resolução de sistemas de equações lineares.
  2. CNlEq - resolução de sistemas de equações não-lineares.
specialfunctions.mqh Classes de funções de distribuição, integrais e polinômios:
  1. CGammaFunc - função Gamma.
  2. CIncGammaF - função Gamma incompleta.
  3. CBetaF - função Beta.
  4. CIncBetaF - função Beta incompleta.
  5. CPsiF - função-psi.
  6. CAiryF - função Airy.
  7. CBessel - Funções integrais de Bessel.
  8. CJacobianElliptic - Funções elípticas Jacobianas.
  9. CDawson - integral de Dawson.
  10. CTrigIntegrals - integrais trigonométricas.
  11. CElliptic - integrais elípticas de primeira e de segunda ordem.
  12. CExpIntegrals - integrais exponenciais.
  13. CFresnel - integrais de Fresnel.
  14. CHermite - polinômios Hermite.
  15. CChebyshev - polinômios Chebyshev.
  16. CLaguerre - polinômios Laguerre.
  17. CLegendre - polinômios Legendre.
  18. CChiSquareDistr - distribuição de qui-quadrado.
  19. CBinomialDistr - distribuição binomial.
  20. CNormalDistr - distribuição normal.
  21. CPoissonDistr - distribuição Poisson.
  22. CStudenttDistr - distribuição t de Student.
  23. CFDistr - distribuição F.
statistics.mqh Classes de análise estatística dos dados:
  1. CBaseStat - métodos estatísticos básicos.
  2. CCorrTests - teste de correlação de significância.
  3. CJarqueBera - Critério de Jarque-Bera.
  4. CMannWhitneyU - Critério U de Mann-Whitney.
  5. CSignTest - teste de sinal.
  6. CStudentTests - teste t de Student.
  7. CVarianceTests - teste F e do qui quadrado.
  8. CWilcoxonSignedRank - Critério W de Wilcoxon.


Código:

As funções da biblioteca possuem comentários detalhados sobre os seus usos.

//+------------------------------------------------------------------+
//| Calculation of the distribution moments: mean, variance,         |
//| skewness, kurtosis.                                              |
//| INPUT PARAMETERS:                                                |
//|     X       -   sample                                           |
//|     N       -   N>=0, sample size:                               |
//|                 * if given, only leading N elements of X are     |
//|                   processed                                      |
//|                 * if not given, automatically determined from    |
//|                   size of X                                      |
//| OUTPUT PARAMETERS                                                |
//|     Mean    -   mean.                                            |
//|     Variance-   variance.                                        |
//|     Skewness-   skewness (if variance<>0; zero otherwise).       |
//|     Kurtosis-   kurtosis (if variance<>0; zero otherwise).       |
//+------------------------------------------------------------------+
static bool CBaseStat::SampleMoments(const double &cx[],const int n,double &mean,
                                     double &variance,double &skewness,double &kurtosis)
  {
//--- check
   if(!CAp::Assert(n>=0,__FUNCTION__+": the error variable"))
      return(false);
//--- check
   if(!CAp::Assert(CAp::Len(cx)>=n,__FUNCTION__+": length(x)<n"))
      return(false);
//--- check
   if(!CAp::Assert(CApServ::IsFiniteVector(cx,n),__FUNCTION__+": x is not finite vector"))
      return(false);
//--- create variables
   double v=0;
   double v1=0;
   double v2=0;
   double stddev=0;
//--- Init, special case 'N=0'
   mean=0;
   variance=0;
   skewness=0;
   kurtosis=0;
//--- check
   if(n<=0)
      return(true);
//--- Mean
   for(int i=0;i<n;i++)
      mean+=cx[i];
   mean/=n;
//--- Variance (using corrected two-pass algorithm)
   if(n!=1)
     {
      //--- calculation
      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);
      //--- calculation
      stddev=MathSqrt(variance);
     }
   else
      variance=EMPTY_VALUE;
//--- Skewness and kurtosis
   if(stddev!=0)
     {
      //--- calculation
      for(int i=0;i<n;i++)
        {
         v=(cx[i]-mean)/stddev;
         v2=CMath::Sqr(v);
         skewness+=v2*v;
         kurtosis+=CMath::Sqr(v2);
        }
      //--- change values
      skewness=skewness/n;
      kurtosis=kurtosis/n-3;
     }
//--- successful execution
   return(true);
  }

As funções estáticas da classe CAlglib devem ser usadas para se trabalhar com a biblioteca. Abaixo está o código-fonte do script usealglib.mq5 para o cálculo de alguns parâmetros estatísticos de negociação:

//+------------------------------------------------------------------+
//|                                                    UseAlglib.mq5 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Connecting the libraries                                         |
//+------------------------------------------------------------------+
#include <Math\Alglib\alglib.mqh>
#include <Trade\DealInfo.mqh>
#include <Arrays\ArrayDouble.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- object to access data on deals
   CDealInfo     deal;
//--- object for storing profit/loss of each deal
   CArrayDouble *profit=new CArrayDouble;
//--- objects for storing the balance
   CArrayDouble *balance_total=new CArrayDouble;
//--- initial balance
   double        balance=0;
//--- receive history
   HistorySelect(0,TimeCurrent());
//--- total amount of deals
   int deals_total=HistoryDealsTotal();
//--- receive data on deals' profit and balance
   for(int i=0;i<deals_total;i++)
     {
      //--- move to the deal having i index
      deal.SelectByIndex(i);
      //--- receive initial balance
      if(deal.DealType()==DEAL_TYPE_BALANCE)
        {
         if(NormalizeDouble(deal.Profit()+deal.Swap(),2)>=0.0)
            if(balance==0.0)
               balance=deal.Profit();
        }
      //--- receive profit and balance
      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));
//--- copy data on the balance to double type array
   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);
//--- copy data on profit to double type array
   double arr_profit[];
   ArrayResize(arr_profit,profit.Total());
   for(int i=0;i<profit.Total();i++)
      arr_profit[i]=profit.At(i);
//--- linear regression
//--- number of independent variables
   int nvars=1;
//--- sample volume
   int npoints=balance_total.Total();
//--- create the matrix of parameters for the linear regression
   CMatrixDouble xy(npoints,nvars+1);
   for(int i=0;i<npoints;i++)
     {
      xy[i].Set(0,i);
      xy[i].Set(1,arr_balance[i]);
     }
//--- variable for detecting calculations result (successful, unsuccessful)
   int info;
//--- class objects necessary for storing data on calculations
   CLinearModelShell lm;
   CLRReportShell    ar;
//--- arrays for storing regression results
   double lr_coeff[];
   double lr_values[];
   ArrayResize(lr_values,npoints);
//--- calculate linear regression ratios
   CAlglib::LRBuild(xy,npoints,nvars,info,lm,ar);
//--- receive linear regression ratios
   CAlglib::LRUnpack(lm,lr_coeff,nvars);
//--- receive recovered linear regression values
   for(int i=0;i<npoints;i++)
      lr_values[i]=lr_coeff[0]*i+lr_coeff[1];
//--- calculate Expected Payoff
   double exp_payoff,tmp1,tmp2,tmp3;
   CAlglib::SampleMoments(arr_profit,exp_payoff,tmp1,tmp2,tmp3);
//--- calculate HPR array
   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);
//--- calculate standard deviation and math expectation from HPR
   double AHPR,SD;
   CAlglib::SampleMoments(HPR,AHPR,SD,tmp2,tmp3);
   SD=MathSqrt(SD);
//--- calculate LR Correlation
   double lr_corr=CAlglib::PearsonCorr2(arr_balance,lr_values);
//--- receive LR Standard Error
   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));
//--- calculate Sharpe Ratio
   double sharpe_ratio=(AHPR-1)/SD;
//--- print
   PrintFormat("-----------------------------------------------");
   PrintFormat("Correlation function: y = %.2fx + %.2f",lr_coeff[0],lr_coeff[1]);
//--- parameters
   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 objects
   delete profit;
   delete balance_total;
  }
//+------------------------------------------------------------------+

Temos então o seguinte resultado:


Traduzido do russo pela MetaQuotes Ltd.
Publicação original: https://www.mql5.com/ru/code/1146

AML Adaptive Market Level AML Adaptive Market Level

O indicador Adaptive Market Level (Nível do Mercado Adaptativo) exibe o preço de referência do estado atual do mercado. O nível é deslocado apenas se houve uma tendência no movimento dos preços.

BubblesAndDrops BubblesAndDrops

O indicador mostra as direções possíveis do movimento de preço.

Ask Bid Ticks Ask Bid Ticks

"AskBidTicks" é uma solução de alta precisão para dados de tick em tempo real com a finalidade de análise da microestrutura. Ele exporta preços tick a tick para um arquivo CSV. Ele funciona com o tempo do computador local.

Intervalo Diário Intervalo Diário

Este indicador calcula e mostra diariamente os preços máximos e mínimos, exibindo-os como dois conjuntos de linhas.