Guarda come scaricare robot di trading gratuitamente
Ci trovi su Twitter!
Unisciti alla nostra fan page
Script interessante?
Pubblica il link!
lasciare che altri lo valutino
Ti è piaciuto lo script? Provalo nel Terminale MetaTrader 5
Librerie

ALGLIB - Libreria di Analisi Numerica - libreria per MetaTrader 5

Pubblicati da::
MetaQuotes
Visualizzazioni:
535
Valutazioni:
(125)
Pubblicato:
2021.11.01 12:40
Aggiornato:
2023.09.08 17:29
Hai bisogno di un robot o indicatore basato su questo codice? Ordinalo su Freelance Vai a Freelance

Autore :

Sergey Bochkanov. Sito web progetto ALGLIB - http://www.alglib.net/. La libreria risale al back to 1999.

ALGLIB è una delle maggiori e complete librerie matematiche

Hai bisogno di fare velocemente una trasformata di Fourier o di risolvere un sistema di equazioni differenziali? Vuoi performare una complessa analisi di dati provando a raccogliere tutti i metodi in un unico posto come codice sorgente? Allora la libreria di funzioni numeriche ALGLIB è per te!

ALGLIB è al momento una delle migliori librerie di algoritmi multi lingua. Di seguito sono riportate le funzionalità di ALGLIB menzionate sul sito Web ufficiale:

ALGLIB è una libreria di analisi numerica ed elaborazione dati multipiattaforma. Supporta molti linguaggi di programmazione (C++, C#, Pascal, VBA) e molti sistemi operativi (Windows, Linux, Solaris). Funzionalità incluse in ALGLIB:

  • Algebra lineare (algoritmi diretti, EVD/SVD)
  • Risolutori (lineari e non lineari)
  • interpolazione
  • Ottimizzazione
  • Trasformate veloci di Fourier
  • Integrazione numerica
  • Raccordo lineare e non lineare dei minimi quadrati
  • Equazioni differenziali ordinarie
  • Funzioni speciali
  • Statistiche (statistiche descrittive, test di ipotesi)
  • Analisi dei dati (classificazione/regressione, compreso le reti neurali)
  • Versioni multiple di precisione di algebra lineare, ottimizzazione dell'interpolazione e altri algoritmi (usando MPFR per calcoli in virgola mobile)

Perchè scegliere ALGLIB? Perchè e:

  • portabile Può essere compilata quasi ovunque utilizzando quasi qualsiasi compilatore (vedere compatibilità matrice per maggiori informazioni).
  • facile da utilizzare. Supporta molti linguaggi di programmazione. Se utilizzi un linguaggio, non hai bisogno di studiarne un'altro (FORTRAN, per esempio) per compilare e collegare una libreria esterna.
  • codice sorgente aperto. Può essere utilizzata gratuitamente sotto GPL 2+.
  • adatta anche agli utenti per uso commerciale. Coloro che desiderano utilizzare ALGLIB in applicazioni commerciali possono acquistare la licenza commerciale senza obbligo di copyleft.

La libreria ALGLIB viene costantemente migliorata, nuove funzioni e miglioramenti in base ai commenti degli utenti vengono implementati regolarmente. L'ultima versione è la 4.0.

Inoltre, la libreria contiene un'ampia raccolta di casi di test che coprono la maggior parte delle funzionalità dei metodi proposti. Ciò ti consentirà di portare i test e segnalare gli errori rilevati agli autori del progetto.


Le funzioni statiche della classe CAlglib dovrebbero essere utilizzate per lavorare con la libreria - tutte le funzioni della libreria vengono spostate nella classe di sistema CAlglib come funzioni statiche.

testclasses.mq5 e testinterfaces.mq5 script test sono allegati insieme ad un semplice script di prova usealglib.mq5. I file in Include con lo stesso nome (testclasses.mqh e testinterfaces.mqh) sono utilizzati per avviare i test. Dovranno essere collocati in \MQL5\Scripts\Alglib\Testcases\.

Nota: l'esecuzione dello script testclasses.mq5 richiede parecchio tempo (circa 8 minuti).

Di seguito maggiori informazioni dettagliate circa il pacchetto della libreria ALGLIB portato in MQL5:

Pacchetti
Descrizione
alglib.mqh
Il pacchetto della libreria principale include funzioni personalizzate. Queste funzioni dovrebbero essere chiamate per lavorare con la libreria.
alglibinternal.mqh
Classe aggiuntiva per le operazioni di altre librerie.
alglibmisc.mqh

Il pacchetto contiene le seguenti classi:

  1. CHighQualityRand - Generatore di numeri casuali di alta qualità.
  2. CNearestNeighbor -Generazione e soluzione di alberi KD.
ap.mqh Il paccheto contiene anche claasi aggiuntive neccessarie per altri pacchetti.
bitconvert.mqh Classi e funzioni di base in C++ che sono assenti in MQL5 ad integrare:
  1. BitConverter - classe per trasformare cifre di tipo int e double in un vettore di bit e viceversa.
  2. CInfOrNaN - classe di generazione e verifica NaNs e plus/minus infiniti.
  3. ArrayReverse - funzione di inversione degli elementi di un vettore.
  4. GetSelectionString - funzione per ricevere le stringhe generate dagli elementi di un vettore di tipo char.
  5. MathSign - funzione di calcolo del segno numerico.
  6. MathSinh - funzione di calcolo del seno iperbolico.
  7. MathCosh - funzione di calcolo del coseno iperbolico.
  8. MathTanh - funzione di calcolo della tangente iperbolica.
dataanalysis.mqh Classe di analisi dati:
  1. CBdSS - funzioni sugli errori di calcolo.
  2. CDForest: lavorare con le forests trees delle soluzioni.
  3. CKMeans - raggruppa utilizzando l'algoritmo k-means++.
  4. CLDA - analisi discriminante lineare.
  5. CLinReg - regressione lineare.
  6. CMLPBase - perceptron multistrato (reti neurali).
  7. CLogit - regressione logit multinomiale.
  8. CMarkovCPD - Catene di Markov per dati sulla popolazione.
  9. CMLPTrain - addestramento del perceptron multistrato.
  10. CMLPE - insiemi di reti neurali.
  11. CPCAnalysis - metodo delle componenti principali.
delegatefunctions.mqh Il pacchetto contiene le classi come sostituzione dei delegati. Gli oggetti di queste classi sono funzioni ottimizzate nei metodi di molte librerie.
diffequations.mqh La classe per risolvere ordinarie equazioni differenziali:
  1. CODESolver - per risolvere ordinarie equazioni differenziali
fasttransforms.mqh Classi per trasformazioni veloci:
  1. CFastFourierTransform - trasformata di Fourier veloce.
  2. CConv - convoluzione.
  3. CCorr - correlazione incrociata.
  4. CFastHartleyTransform - trasformata di Hartley veloce.
integration.mqh Classi per l'integrazione numerica:
  1. CGaussQ - Quadratura gaussiana.
  2. CGaussKronrodQ - Formule di quadratura di Gauss–Kronrod.
  3. CAutoGK - integratore adattivo.
interpolation.mqh Classi di interpolazione, approssimazione e differenzazione numerica:
  1. CIDWINt - interpolazione e approssimazione tramite la distanza media ponderata inversa.
  2. CRatInt - interpolazione razionale.
  3. CPolInt - interpolazione polinomiale.
  4. CSpline1D - interpolazione spline unidimensionale
  5. CLSFit - approssimazione utilizzando il metodo dei minimi quadrati lineari o non lineari.
  6. CPSpline - interpolazione spline parametrica.
  7. CSpline2D - interpolazione spline bidimensionale.
linalg.mqh Classe per il calcolo di alcune operazioni di algebra lineare:
  1. COrtFac - Decomposizioni QR/LQ, decomposizioni di Hessenberg, nonché di matrici bi- e tridiagonali.
  2. CEigenVDetect - trova gli autovalori e gli autovettori.
  3. CMatGen - generazione di matrici casuali.
  4. CTrFac - decomposizioni LU e Cholesky.
  5. CRCond - stima di un valore dipendente dalla matrice.
  6. CMatInv - inversione di matrici.
  7. CBdSingValueDecompose - decomposizione ai valori singolari di una matrice bidiagonale.
  8. CSingValueDecompose - decomposizione ai valori singolari di una matrice.
  9. CFbls - soluzioni lineari di base rapide.
  10. CMatDet - calcolo di un determinante di matrice.
  11. CSpdGEVD - trovare gli autovalori e gli autovettori in matrici simmetriche generalizzate.
  12. CInverseUpdate - inversione e aggiornamento matrici.
  13. CSchur - Decomposizione di Issai Schur.
matrix.mqh Classe di matrici: intere,continue e complesse.
optimization.mqh Classe di ottimizzazione dimensionale e multidimensionale:
  1. CMinCG - ottimizzazione utilizzando il metodo del gradiente coniugato.
  2. CMinBLEIC - ottimizzazione con vincoli lineari sotto forma di equazioni e disequazioni.
  3. CMinLBFGS - ottimizzazione mediante generazione e classificazione successive del modello quadratico della funzione.
  4. CMinQP - programmazione quadratica con vincoli lineari sotto forma di equazioni e disequazioni.
  5. CMinLM - ottimizzazione mediante algoritmo di Levenberg-Marquardt.
  6. CMinComp - funzioni di compatibilità con le versioni precedenti.
solvers.mqh Classi per la risoluzione di sistemi di equazioni lineari e non lineari:
  1. CDenseSolver - risoluzione di sistemi di equazioni lineari.
  2. CNlEq - risoluzione di sistemi di equazioni non lineari.
specialfunctions.mqh Classi di funzioni di distribuzione, integrali e polinomi:
  1. CGammaFunc - Funzione gamma.
  2. CIncGammaF - funzione Gamma incompleta.
  3. CBetaF - Funzione beta.
  4. CIncBetaF - funzione beta incompleta.
  5. CPsiF - funzione psi.
  6. CAiryF - funzione di Airy.
  7. CBessel - Funzioni di Bessel di ordine integrale.
  8. CJacobianElliptic - Funzioni ellittiche Jacobiane.
  9. CDawson - Integrale di Dawson.
  10. CTrigIntegrals - integrali trigonometrici.
  11. CEellittico - integrali ellittici di primo e secondo tipo.
  12. CExpIntegrals - integrali esponenziali.
  13. CFresnel - Integrali di Fresnel.
  14. CHermite - Polinomi di Hermite.
  15. CChebyshev - Polinomi di Chebyshev.
  16. CLaguerre - polinomi di Laguerre.
  17. CLegendre - polinomi di Legendre.
  18. CChiSquareDistr - distribuzione chi-quadrato.
  19. CBinomialDistr - distribuzione binomiale.
  20. CNormalDistr - distribuzione normale.
  21. CPoissonDistr - Distribuzione di Poisson.
  22. CStudenttDistr - Distribuzione t di Student.
  23. CFDistr - Distribuzione F.
statistics.mqh Classi di analisi di dati statistici:
  1. CBaseStat - metodi statistici di base.
  2. CCorrTests - test per la significatività del rapporto di correlazione.
  3. C Jarque Bera - Criterio Jarque Bera.
  4. CMannWhitneyU - Criterio U di Mann-Whitney.
  5. CSignTest - test di segno.
  6. CStudentTests - t-tests di Student.
  7. CVarianceTests - F-test e chi-quadrato test.
  8. CWilcoxonSignedRank -criterio W di Wilcoxon.


Codice:

Le fuzioni della libreria sono commentate in modo dettagliato per il loro uso.

//+------------------------------------------------------------------+
//| 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);
  }

Le funzioni statiche della classe CAlglib dovrebbero essere usate per lavorare con la libreria. Di seguito il codice sorgente della funzione dello script usealglib.mq5 per il calcolo di alcuni parametri statistici del trading:

//+------------------------------------------------------------------+
//|                                                    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;
  }
//+------------------------------------------------------------------+

Ricevendo i risultati seguenti:



Tradotto dal russo da MetaQuotes Ltd.
Codice originale https://www.mql5.com/ru/code/1146

Esempio dell'uso di  IndicatorParameters() Esempio dell'uso di IndicatorParameters()

Questo Expert Advisor illustra l'uso della funzione IndicatorParameters() per ricavare le informazioni sul numero dei parametri d'entrata, il loro tipo e valori.

Visualizzazione dei Risultati di Ottimizzazione in Tempo Reale Visualizzazione dei Risultati di Ottimizzazione in Tempo Reale

Introducendo l'esempio di visualizzazione dei risultati di ottimizzazione in tempo reale ( dinamica della curva di bilancio e parametri statistici dell' Expert Advisor ).

Media Mobile Media Mobile

L'Expert Advisor Moving Average (Media Mobile) trada quando il prezzo attraversa la MA

Esempio di MACD Esempio di MACD

L'esempio di Expert Advisor MACD trada all'incrocio delle linee main e signal dell'MACD. Questo Expert Advisor è un esempio di approccio orietato agli oggetti nello sviluppo di un EA.