Assista a como baixar robôs de negociação gratuitos
Encontre-nos em Telegram!
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 - Biblioteca de Análise Numérica - biblioteca para MetaTrader 4

Visualizações:
2482
Avaliação:
(53)
Publicado:
2016.06.24 12:43
Atualizado:
2023.09.12 10:23
Precisa de um robô ou indicador baseado nesse código? Solicite-o no Freelance Ir para Freelance

Real autor:

Sergey Bochkanov. Website do projeto ALGLIB - http://www.alglib.net/. A data da biblioteca é de 1999.

Nota: O Expert Advisor funciona com MetaTrader 4 atualização 555 e superior.

O arquivo deve ser descompactado para: terminal_data_folder.
Os códigos da biblioteca estão localizados no terminal_data_folder\Math\Alglib\
Os códigos da biblioteca estão localizados no terminal_data_folder\MQL4\Scripts\Alglib\

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 num lugar como um código-fonte? Então a biblioteca ALGLIB de métodos numéricos é para você!!

ALGLIB é atualmente uma das melhores bibliotecas de algoritmos de multilinguagem. A seguir estão os recursos da bilbioteca ALGLIB mencionados no site oficial:

ALGLIB é uma biblioteca de processamento multiplataforma de análise numérica e dados. Ela suporta várias linguagens de programação (C++, C #, Pascal, VBA) e vários sistemas operacionais (Windows, Linux, Solaris). As características da ALGLIB incluem:

  • Álgebra Linear (algoritmos diretos, EVD / SVD)
  • Solucionadores (linear e não-linear)
  • Interpolação
  • Optimização
  • Transformação rápida Fourier
  • Integração numérica
  • Lineares e não lineares dos mínimos quadrados ajustadas
  • Equações diferenciais ordinárias
  • Funções especiais
  • Estatística (estatística descritiva, testes de hipóteses)
  • A análise dos 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 o ALGLIB? Por causa disso:

  • Portátil. Ela pode ser compilada em quase qualquer lugar usando qualquer compilador (veja matriz de compatibilidade para mais informações).
  • fácil de usar. Suporta várias linguagens de programação. Se você usar um idioma, você não precisa estudar outro (Fortran, por exemplo) para compilar e linkar uma biblioteca externa.
  • código aberto. Pode ser usado gratuitamente sob GPL 2+.
  • Adequada para usuários comerciais também. Aqueles que querem usar ALGLIB em aplicações comerciais podem comprar a licença comercial, sem exigência de direitos autorais.

A biblioteca ALGLIB está sendo constantemente aprimorada, novas funções e melhorias de acordo com comentários dos usuários são implementados regularmente. A última versão é a 3.6.0.

Além disso, a biblioteca contém uma grande coleção de casos de testes que cobrem a maior parte da funcionalidade dos métodos propostos. Isto lhe permitirá realizar os testes e reportar erros detectados aos autores do projeto.


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

Os testes de casos dos scripts testclasses.mq4 e testinterfaces.mq5 são ligados em conjunto com um simples script de demonstração alglib.mq4. Inclusão de arquivos com o mesmo nome (testclasses.mqh e testinterfaces.mqh) são usados para lançar casos de testes. Devem ser colocados no diretório: \MQL4\Scripts\Alglib\Testcases\.

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

Abaixo está informações mais detalhadas sobre os pacotes da biblioteca portada ALGLIB MQL4:

Pacotes
Descrição
alglib.mqh
O principal pacote da biblioteca incluindo funções personalizadas. Estas funções devem ser chamadas para trabalhar com a biblioteca.
alglibinternal.mqh
classes adicionais para o funcionamento de outros pacotes da biblioteca.
alglibmisc.mqh

O pacote contém as seguintes classes:

  1. CHighQualityRand - gerador de alta qualidade dos números aleatórios.
  2. CNearestNeighbor - KD-geração de árvores e solução.
ap.mqh Este pacote também contém classes adicionais necessárias para outros pacotes.
bitconvert.mqh Classes básicas С++ e funções que estão ausentes no MQL4 como um built-in:
  1. BitConverter - classe para transformar int e figuras tipo double num array de bits e vice-versa.
  2. CInfOrNaN - NaNs e verificações mais/menos de infinito e geração de classe.
  3. ArrayReverse - elementos do array da função inversa.
  4. GetSelectionString - função para receber a seqüência gerada a partir de elementos do array tipo char.
  5. MathSign - função de cálculo do sinal do número.
  6. MathSinh - função de cálculo do seno hiperbólico.
  7. MathCosh - função de cálculo do coseno hiperbólico.
  8. MathTanh - função de cálculo da tangente hiperbólica.
complex.mqh Definição de estruturas complexas para trabalhar com números complexos.
dataanalysis.mqh Classes de análise de dados:
  1. CBdSS - funções de erro de cálculo.
  2. CDForest - trabalhando com a solução do diretório de árvores.
  3. CKMeans - agrupamento usando o algoritmo k-means++.
  4. CLDA - análise discriminante linear.
  5. CLinReg - regressão linear.
  6. CMLPBase - multilayer perceptron (redes neurais).
  7. CLogit - regressão logística multinomial.
  8. CMarkovCPD - Cadeias de Markov para dados populacionais.
  9. CMLPTrain - formação da multilayer perceptron.
  10. CMLPE - conjuntos de redes neurais.
  11. CPCAnalysis - método dos componentes principais.
delegatefunctions.mqh O pacote contém as classes criadas como substituto para os delegates. Os objetos dessas classes são as funções otimizadas em vários métodos da biblioteca.
diffequations.mqh A classe para resolver equações diferenciais ordinárias:
  1. CODESolver - resolve equações diferenciais ordinárias.
fasttransforms.mqh Classes de transformação rápida:
  1. CFastFourierTransform - transformação rápida Fourier.
  2. CConv - convolução.
  3. CCorr - correlação cruzada.
  4. CFastHartleyTransform - transformação rápida 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 Interpolação, aproximação e diferenciação numérica das classes:
  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 unidimensional de spline.
  5. CLSFit - aproximação utilizando o método de cadeia linear ou não linear dos quadrados mínimos.
  6. CPSpline - interpolação paramétrica de spline.
  7. CSpline2D - interpolação bidimensional de spline.
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 valores e vetores próprios.
  3. CMatGen - geração aleatória das matrizes.
  4. CTrFac - decomposições LU e Cholesky.
  5. CRCond - estimativa de um valor de dependência da matriz.
  6. CMatInv - inversão da matriz.
  7. CBdSingValueDecompose - decomposição singular de uma matriz bidiagonal.
  8. CSingValueDecompose - decomposição singular da matriz.
  9. CFbls - soluções rápidas lineares básicas.
  10. CMatDet - cálculo de uma matriz determinante.
  11. CSpdGEVD - encontrar os valores e vetores próprios em matrizes simétricas generalizadas.
  12. CInverseUpdate - matrizes de inversão e atualização.
  13. CSchur - decomposição Issai Schur.
matrix.mqh Classes das matrizes: inteiro, contínuo e complexo.
optimization.mqh Classes de otimização dimensional e multidimensional:
  1. CMinCG - otimização usando o método do gradiente conjugado.
  2. CMinBLEIC - otimização com restrições lineares em forma de equações e inequações.
  3. CMinLBFGS - otimização usando geração sucessiva e classificação de modelo quadrático da função.
  4. CMinQP - programação quadrática com restrições lineares em forma de equações e inequações.
  5. CMinLM - otimização usando 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 - resolve sistemas de equações lineares.
  2. CNlEq - resolve 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 de Bessel de ordem integrante.
  8. CJacobianElliptic - Funções elípticas de Jacobi.
  9. CDawson - integral de Dawson.
  10. CTrigIntegrals - integrais trigonométricas.
  11. CElliptic - integrais elípticas do primeiro e do segundo tipo.
  12. CExpIntegrals - integrais exponenciais.
  13. CFresnel - integrais de Fresnel.
  14. CHermite - polinômios de Hermite.
  15. CChebyshev - polinômios de Chebyshev.
  16. CLaguerre - polinômios de Laguerre.
  17. CLegendre - polinômios de Legendre.
  18. CChiSquareDistr - distribuição 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 de dados estatísticos:
  1. CBaseStat - métodos estatísticos básicos.
  2. CCorrTests - teste da razão de correlação de significância.
  3. CJarqueBera - critério de JarqueBera.
  4. CMannWhitneyU - critério de Mann-Whitney U.
  5. CSignTest - teste do sinal.
  6. CStudentTests - teste t de Student.
  7. CVarianceTests - Teste F e qui-quadrado.
  8. CWilcoxonSignedRank - critério de Wilcoxon W.


Código:

As funções da biblioteca tem comentários detalhados sobre a sua utilização.

//+------------------------------------------------------------------+
//| Cálculo dos momentos de distribuição: média, variânção,          |
//| skewness, kurtosis.                                              |
//| PARÂMETROS DE ENTRADA:                                           |
/|     X        -   amostra                                          |
//|     N       -   N>=0, tamanho da amostra:                        | 
//|                 * Se dados, só os principais N elementos de X são|
//|                   processados                                    |
//|                 * se não for dado, determinar automaticamente do |
//|                   tamanho de X                                   |
//| PARÂMETROS DE SAÍDA                                              |
//|     Mean    -   significa                                        |
//|     Variance-   VARIAÇÃO.                                        |
//|     Skewness-   assimetria(se a variação<>0; do contrário zero). |
//|     Kurtosis-   curtose (se a variação<>0; do contrário zero).   |
//+------------------------------------------------------------------+
static bool CBaseStat::SampleMoments(const double &cx[],const int n,double &mean,
                                     double &variance,double &skewness,double &kurtosis)
  {
//--- Verificação
   if(!CAp::Assert(n>=0,__FUNCTION__+": the error variable"))
      return(false);
//--- Verificação
   if(!CAp::Assert(CAp::Len(cx)>=n,__FUNCTION__+": length(x)<n"))
      return(false);
//--- Verificação
   if(!CAp::Assert(CApServ::IsFiniteVector(cx,n),__FUNCTION__+": x is not finite vector"))
      return(false);
//--- criar variáveis
   double v=0;
   double v1=0;
   double v2=0;
   double stddev=0;
//--- Init, caso especial 'N=0'
   mean=0;
   variance=0;
   skewness=0;
   kurtosis=0;
//--- Verificação
   if(n<=0)
      return(true);
//--- Significa
   for(int i=0;i<n;i++)
      mean+=cx[i];
   mean/=n;
//--- Variação (usando duas passagens corrigidas de algoritmo)
   if(n!=1)
     {
      //--- cálculo
      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);
      //--- cálculo
      stddev=MathSqrt(variance);
     }
   else
      variance=EMPTY_VALUE;
//--- Assimetria e curtose
   if(stddev!=0)
     {
      //--- cálculo
      for(int i=0;i<n;i++)
        {
         v=(cx[i]-mean)/stddev;
         v2=CMath::Sqr(v);
         skewness+=v2*v;
         kurtosis+=CMath::Sqr(v2);
        }
      //--- mudar valores
      skewness=skewness/n;
      kurtosis=kurtosis/n-3;
     }
//--- execução bem-sucedida
   return(true);
  }

Funções de classe estática CAglib deve ser usada para trabalhar com a biblioteca. Abaixo a função usealglib.mq5 de código fonte do script para cálculo de alguns parâmetros estatísticos de negociação:

//+------------------------------------------------------------------+
//|                                                    UseAlglib.mq4 |
//|                        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"
#property strict
//+------------------------------------------------------------------+
//| Bibliotecas incluídas                                            |
//+------------------------------------------------------------------+
#include <Math\Alglib\alglib.mqh>
#include <Arrays\ArrayDouble.mqh>
//+------------------------------------------------------------------+
//| função de início do programa Script                              |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- objeto para o armazenamento dos dados de lucro/perda para cada ordem
   CArrayDouble *profit=new CArrayDouble;
//--- objeto para o armazenamento dos dados do balanço
   CArrayDouble *balance_total=new CArrayDouble;
//--- balanço inicial
   double        balance=0;
//--- solicitação de dados históricos
//--- obter a quantidade total das ordens
   int orders_total=OrdersHistoryTotal();
//--- obter dados de lucro
   for(int i=0;i<orders_total;i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
        {
         Print("Error in OrderSelect (",GetLastError(),")");
         return;
        }
      int order_type=OrderType();
      //--- balanço inicial
      if(order_type==6) // OP_BALANCE=6
        {
         if(NormalizeDouble(OrderProfit()+OrderSwap(),2)>=0.0)
            if(balance==0.0)
               balance=OrderProfit();
        }
      //--- adicionar o lucro da ordem
      if(order_type==OP_BUY || order_type==OP_SELL)
        {
         double order_profit=OrderProfit()+OrderSwap()+OrderCommission();
         profit.Add(NormalizeDouble(order_profit,2));
         balance_total.Add(balance);
         balance=balance+NormalizeDouble(order_profit,2);
        }
     }
//---
   balance_total.Add(balance_total.At(balance_total.Total()-1)+profit.At(balance_total.Total()-1));
//--- copiar os dados do balanço para o array do tipo 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);
//--- copiar dados de lucro para o array do tipo double
   double arr_profit[];
   ArrayResize(arr_profit,profit.Total());
   for(int i=0;i<profit.Total();i++)
      arr_profit[i]=profit.At(i);
//--- regressão linear
//--- número de variáveis independentes
   int nvars=1;
//--- número de pontos
   int npoints=balance_total.Total();
//--- criação de matriz dos parâmetros, utilizado na regressão linear
   CMatrixDouble xy(npoints,nvars+1);
   for(int i=0;i<npoints;i++)
     {
      xy[i].Set(0,i);
      xy[i].Set(1,arr_balance[i]);
     }
//--- variável para a detecção de resultado dos cálculos (bem sucedido, sem sucesso)
   int info;
//--- classe de objetos necessários para armazenar dados calculados
   CLinearModelShell lm;
   CLRReportShell    ar;
//--- arrays para armazenar os resultados da regressão
   double lr_coeff[];
   double lr_values[];
   ArrayResize(lr_values,npoints);
//--- calcula os coeficientes de regressão linear
   CAlglib::LRBuild(xy,npoints,nvars,info,lm,ar);
//--- obtem coeficientes de regressão linear
   CAlglib::LRUnpack(lm,lr_coeff,nvars);
//--- obtem os valores de regressão linear recuperados
   for(int i=0;i<npoints;i++)
      lr_values[i]=lr_coeff[0]*i+lr_coeff[1];
//--- cálculo do Resultado Esperado
   double exp_payoff,tmp1,tmp2,tmp3;
   CAlglib::SampleMoments(arr_profit,exp_payoff,tmp1,tmp2,tmp3);
//--- cálculo do array 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);
//--- cálculo do desvio padrão e a média de HPR
   double AHPR,SD;
   CAlglib::SampleMoments(HPR,AHPR,SD,tmp2,tmp3);
   SD=MathSqrt(SD);
//--- cálculo de correlação LR
   double lr_corr=CAlglib::PearsonCorr2(arr_balance,lr_values);
//--- cálculo do 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));
//--- cálculo do Índice Sharpe
   double sharpe_ratio=(AHPR-1)/SD;
//--- impressão
   PrintFormat("-----------------------------------------------");
   PrintFormat("Linear regression: y = %.2fx + %.2f",lr_coeff[0],lr_coeff[1]);
//--- parâmetros
   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("-----------------------------------------------");
//--- excluir objetos
   delete profit;
   delete balance_total;
  }
//+------------------------------------------------------------------+

Nós receberemos o seguinte resultado (dependendo dos resultados de sua negociação):

Resultado do teste Alglib

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

OBJ_EDIT_Example OBJ_EDIT_Example

Exemplo de trabalho com o objeto gráfico OBJ_EDIT.

OBJ_Label_Example OBJ_Label_Example

Exemplo de trabalha com o objeto gráfico OBJ_LABEL.

a_informer a_informer

É colocado o Stop Loss e Take Profit a uma determinada distância. Exibe o status atual das ordens abertas. Para o fechamento da ordem é preciso apenas selecionar e mover a etiqueta à esquerda.

VR---Overturn VR---Overturn

O Advisor pode ser negociado em dois modos: Martingale e Antimartingale ...