Participe de nossa página de fãs
Coloque um link para ele, e permita que outras pessoas também o avaliem
Avalie seu funcionamento no terminal MetaTrader 5
ALGLIB - Biblioteca de Análise Numérica - biblioteca para MetaTrader 4
- Visualizações:
- 2644
- Avaliação:
- 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:
|
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:
|
complex.mqh | Definição de estruturas complexas para trabalhar com números complexos. |
dataanalysis.mqh | Classes de análise de dados:
|
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:
|
fasttransforms.mqh | Classes de transformação rápida:
|
integration.mqh | Classes para integração numérica:
|
interpolation.mqh | Interpolação, aproximação e diferenciação numérica das classes:
|
linalg.mqh | Classes para o cálculo de algumas operações de álgebra linear:
|
matrix.mqh | Classes das matrizes: inteiro, contínuo e complexo. |
optimization.mqh | Classes de otimização dimensional e multidimensional:
|
solvers.mqh | Classes para resolver sistemas de equações lineares e não lineares:
|
specialfunctions.mqh | Classes de funções de distribuição, integrais e polinômios:
|
statistics.mqh | Classes de análise de dados estatísticos:
|
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):
Traduzido do russo pela MetaQuotes Ltd.
Publicação original: https://www.mql5.com/ru/code/11077
Exemplo de trabalho com o objeto gráfico OBJ_EDIT.
OBJ_Label_ExampleExemplo de trabalha com o objeto gráfico OBJ_LABEL.
É 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---OverturnO Advisor pode ser negociado em dois modos: Martingale e Antimartingale ...