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 4

Visualizzazioni:
490
Valutazioni:
(53)
Pubblicato:
2021.11.15 16:26
Aggiornato:
2023.09.12 10:30
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 a prima del 1999.

Nota: L'Expert Advisor lavora con MetaTrader4 build 555 o superiore.

L'archivio deve essere scompattato in: terminal_data_folder.
I codici della libreria sono posizionati in terminal_data_folder\Math\Alglib\
Gli esempi degli script di test sono posizionati in terminal_data_folder\MQL4\Scripts\Alglib\

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è è:

  • 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 3.6.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.mq4 e testinterfaces.mq4 script test sono allegati insieme ad un semplice script di prova usealglib.mq4. I file inclusi 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 30 minuti).

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

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 classi aggiuntive neccessarie per altri pacchetti.
bitconvert.mqh Classi e funzioni di base in C++ che sono assenti in MQL4 come integrate:
  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.
complex.mqh Definisce strutture complesse per lavorare con numeri complessi.
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 create 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 veloce di Fourier .
  2. CConv - convoluzione.
  3. CCorr - correlazione incrociata.
  4. CFastHartleyTransform - trasformata veloce di Hartley .
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.mq4 per il calcolo di alcuni parametri statistici del trading:

//+------------------------------------------------------------------+
//|                                                    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
//+------------------------------------------------------------------+
//| Include libraries                                                |
//+------------------------------------------------------------------+
#include <Math\Alglib\alglib.mqh>
#include <Arrays\ArrayDouble.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- object for storage of profit/loss data for each order
   CArrayDouble *profit=new CArrayDouble;
//--- object for storage of balance data
   CArrayDouble *balance_total=new CArrayDouble;
//--- initial balance
   double        balance=0;
//--- historical data request
//--- get total amount ot orders
   int orders_total=OrdersHistoryTotal();
//--- get profit data
   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();
      //--- initial balance
      if(order_type==6) // OP_BALANCE=6
        {
         if(NormalizeDouble(OrderProfit()+OrderSwap(),2)>=0.0)
            if(balance==0.0)
               balance=OrderProfit();
        }
      //--- add order profit
      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));
//--- copy balance data to the array of double type
   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 profit data to the array of double type
   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;
//--- number of points
   int npoints=balance_total.Total();
//--- creating parameters matrix, used for 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 coefficients
   CAlglib::LRBuild(xy,npoints,nvars,info,lm,ar);
//--- get linear regression coefficients
   CAlglib::LRUnpack(lm,lr_coeff,nvars);
//--- get the recovered linear regression values
   for(int i=0;i<npoints;i++)
      lr_values[i]=lr_coeff[0]*i+lr_coeff[1];
//--- calculation of Expected Payoff
   double exp_payoff,tmp1,tmp2,tmp3;
   CAlglib::SampleMoments(arr_profit,exp_payoff,tmp1,tmp2,tmp3);
//--- calculation of 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);
//--- calculation of the standard deviation and mean of the HPR
   double AHPR,SD;
   CAlglib::SampleMoments(HPR,AHPR,SD,tmp2,tmp3);
   SD=MathSqrt(SD);
//--- calculation of LR Correlation
   double lr_corr=CAlglib::PearsonCorr2(arr_balance,lr_values);
//--- calculation of 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));
//--- calculation of Sharpe Ratio
   double sharpe_ratio=(AHPR-1)/SD;
//--- print
   PrintFormat("-----------------------------------------------");
   PrintFormat("Linear regression: 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:

Risultati test Alglib



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

OBJ_EDIT_Example OBJ_EDIT_Example

Esempio di lavorazione con l'oggetto grafico OBJ_EDIT.

OBJ_Label_Example OBJ_Label_Example

Esempio di come lavorare con l'oggetto grafico OBJ_LABEL.

Zigzag R Zigzag R

Una versione ottimizzata dell'indicatore ZigZag, che è stato incluso nella MT4 rilasciata dal 2005 (e in MT3.83).

SignalsDemo SignalsDemo

L'Expert Advisor mostra le proprietà dei segnali,consente di modificare le impostazioni della copia del segnale e sottoscrivere o disiscrivere il segnale di trade selezionato.