Unisciti alla nostra fan page
ALGLIB - Libreria di Analisi Numerica - libreria per MetaTrader 5
- Pubblicati da::
- MetaQuotes
- Visualizzazioni:
- 621
- Valutazioni:
- 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:
|
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:
|
dataanalysis.mqh | Classe di analisi dati:
|
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:
|
fasttransforms.mqh | Classi per trasformazioni veloci:
|
integration.mqh | Classi per l'integrazione numerica:
|
interpolation.mqh | Classi di interpolazione, approssimazione e differenzazione numerica:
|
linalg.mqh | Classe per il calcolo di alcune operazioni di algebra lineare:
|
matrix.mqh | Classe di matrici: intere,continue e complesse. |
optimization.mqh | Classe di ottimizzazione dimensionale e multidimensionale:
|
solvers.mqh | Classi per la risoluzione di sistemi di equazioni lineari e non lineari:
|
specialfunctions.mqh | Classi di funzioni di distribuzione, integrali e polinomi:
|
statistics.mqh | Classi di analisi di dati statistici:
|
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
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 RealeIntroducendo l'esempio di visualizzazione dei risultati di ottimizzazione in tempo reale ( dinamica della curva di bilancio e parametri statistici dell' Expert Advisor ).
L'Expert Advisor Moving Average (Media Mobile) trada quando il prezzo attraversa la MA
Esempio di MACDL'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.