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 - Numerical Analysis Library - biblioteca para MetaTrader 5
- Publicado por:
- MetaQuotes
- Visualizações:
- 8320
- Avaliação:
- 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:
|
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:
|
dataanalysis.mqh | Classes para análise de dados:
|
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:
|
fasttransforms.mqh | Classes de transformação rápida:
|
integration.mqh | Classes para integração numérica:
|
interpolation.mqh | Classes de interpolação, aproximação e de diferenciação numérica:
|
linalg.mqh | Classes para o cálculo de algumas operações de álgebra linear:
|
matrix.mqh | Classes de matrizes: inteira, contínua e complexa. |
optimization.mqh | Classes de otimização dimensionais e multidimensionais:
|
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 estatística dos dados:
|
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
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.
BubblesAndDropsO indicador mostra as direções possíveis do movimento de preço.
"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árioEste indicador calcula e mostra diariamente os preços máximos e mínimos, exibindo-os como dois conjuntos de linhas.