und werden Sie Mitglied unserer Fangruppe
Veröffentliche einen Link auf das Skript, damit die anderen ihn auch nutzen können
Bewerten Sie es im Terminal MetaTrader 5
ALGLIB - Numerical Analysis Library - Bibliothek für den MetaTrader 5
- Veröffentlicht:
- MetaQuotes
- Ansichten:
- 4170
- Rating:
- Veröffentlicht:
- 2016.05.12 08:51
- Aktualisiert:
- 2023.09.08 17:27
- Benötigen Sie einen Roboter oder Indikator, der auf diesem Code basiert? Bestellen Sie ihn im Freelance-Bereich Zum Freelance
Urheber:
Sergey Bochkanov. ALGLIB project website - http://www.alglib.net/. Die Bibliothek datiert zurück auf 1999.
ALGLIB Ist eine der größten und vollständigsten mathematischen Bibliotheken
Müssen Sie eine schnelle Fourier Transformation durchführen oder eine differentielle Gleichung lösen? Möchten Sie eine komplexe Datenanalyse durchführen und alle dafür notwenigen Methoden an einen Platz zu Verfügung haben? Dann ist die ALGLIB Bibliothek genau das Richtige für Sie!
ALGLIB Ist zurzeit eine der besten Bibliotheken für multi-language Algorithmen. Weiter unten sind die auf der offiziellen ALGLIB Website dargestellten Eigenschaften aufgeführt:
ALGLIB ist eine Cross-Platform Bibliothek für die numerische Datenanalyse. Unterstützt verschiedene Programmiersprachen (C++, C#, Pascal, VBA) Und verschiedene Betriebssysteme (Windows, Linux, Solaris). Die ALGLIB Eigenschaften beinhalten:
- Linear algebra (Direkte Algorithmen, EVD/SVD)
- Funktionen für das Lösen von Gleichungen (linear and nonlinear)
- Interpolation
- Optimierungen
- Fast Fourier Transformationen
- Numerische Integration
- Lineare und nichtlineare Kleinste-Quadrate
- Gewöhnliche Differentialgleichungen
- Spezielle Funktionen
- Statistik (deskriptive Statistik, Hypothesentests )
- Die Datenanalyse (Klassifizierung / Regression, einschließlich neuronaler Netze)
- Mehrere Präzision Versionen der linearen Algebra, Interpolation Optimierung und andere Algorithmen (mit MPFR für Gleitkomma-Berechnungen)
Warum sollte ich ALGLIB verwenden? Weil es:
- portabel ist.. Dieses Bibliothek kann fast überall mit jedem Compiler kompiliert werden (Schauen Sie hier compatibility matrix für weitere Informationen).
- Sie ist einfach zu verwenden. Sie unterstützt sehr viele Programmiersprachen. Man braucht also keine weitere Programmiersprache zu lernen(z.B. FORTRAN) um diese Bibliothek kompilieren und verlinken zu können.
- Sie ist 'Open Source'. Sie kann kostenfrei unter GPL 2+ genutzt werden.
- Sie ist ebenfalls für gewerbliche Nutzer geeignet. Diejenigen, die die ALGLIB Bibliothek kommerziell nutzen wollen, können sich eine Kommerzielle Lizenz kaufen.
Die ALGLIB Bibliothek wird kontinuierlich erweitert. Es werden auf Nachfrage von Benutzern regelmäßig neue Funktionen und Verbesserungen hinzugefügt. Die neueste Version ist 4.0.
Außerdem enthält die Bibliothek eine große Sammlung von Testfällen für den Großteil der vorgeschlagenen Methoden. Dieses erlaubt es Ihnen, Tests durchzuführen und über mögliche auftretende Fehler zu berichten.
Beim Arbeiten mit dieser Bibliothek sollten die statischen Funktionen der CAlglib-Klasse verwendet werden - Alle Funktionen der Bibliothek sind als statische Funktionen in der CAlglib-Klasse enthalten.
Die Test-Skripte testclasses.mq5 und testinterfaces.mq5 sind dem einfachen Demo-Skript usealglib.mq5 beigefügt. Die enthaltenen Dateien mit dem gleichen Namen (testclasses.mqh und testinterfaces.mqh) werden für die Verwendung der Tests gestartet. Sie sollten in das folgende Verzeichnis kopiert werden: \MQL5\Scripts\Alglib\Testcases\.
Hinweis: Die Ausführung des testclasses.mq5 Skriptes benötigt viel Zeit (ca 8 Minuten).
Nachfolgend nun weitere detaillierte Informationen über das ALGLIB MQL5 ported Bibliotheken-Paket:
Pakete | Beschreibung: |
---|---|
alglib.mqh | Dieses Paket mit der Hauptbibliothek enthält die benutzerdefinierten Funktionen. Diese Funktionen sollten für das Arbeiten mit dieser Bibliothek aufgerufen werden. |
alglibinternal.mqh | Eine zusätzliche Klasse für das Arbeiten mit anderen Bibliothek-Paketen. |
alglibmisc.mqh | Dieses Paket beinhaltet die folgenden Klassen:
|
ap.mqh | Dieses Paket enthält ebenfalls weitere Klassen, die für andere Pakete notwendig sind. |
bitconvert.mqh | С++ Basisklassen und Funktionen, die in MQL5 fehlen:
|
dataanalysis.mqh | Klassen für die Datenanalyse:
|
delegatefunctions.mqh | Das Paket enthält die als Ersatz geschaffen Klassen für Delegates. Die Objekte dieser Klassen sind die in mehreren Bibliotheks-Methoden optimierten Funktionen. |
diffequations.mqh | Klasse für das Lösen gewöhnlicher Differentialgleichungen.
|
fasttransforms.mqh | Fast Transformation Klasse:
|
integration.mqh | Klasse für numerische Integration:
|
interpolation.mqh | Interpolation, Annäherung und numerische Differenzierungs-Klassen:
|
linalg.mqh | Klassen für die Berechnung einiger Operationen der linearen Algebra:
|
matrix.mqh | Klassen von Matrizen: integer, kontinuierlich und komplex. |
optimization.mqh | Und mehrdimensionale Optimierungsklassen:
|
solvers.mqh | Klassen für die Lösung von linearen und nichtlinearen Gleichungssystemen:
|
specialfunctions.mqh | Klassen mit Verteilungsfunktionen , Integrale und Polynome:
|
statistics.mqh | Klassen der statistischen Datenanalyse:
|
Code:
Library functions have detailed comments on their usage.
//+---------------------------------------------------------------- // | Die Berechnung der Verteilung Momente: Mittelwert, Varianz, | // | Schiefe, Kurtosis. | //| Eingabe Parameter: | //| X - sample | // | N - N> = 0, Stichprobengröße : | //| * wenn angegeben, nur führende N Elemente von X werden | | //| bearbeitet | //| * wenn nicht angegeben, automatisch ermittelt aus | //| größe von X | //| Ausgabe Parameter | //| Mean - mean. | //| Variance- variance. | //| Skewness- Schiefe (Varianz <> 0; sonst Null). | //| Kurtosis- Kurtosis (Varianz <> 0; andernfalls Null). | //+---------------------------------------------------------------- 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); }
Beim Arbeiten mit dieser Bibliothek sollten die statischen Funktionen der CAlglib-Klasse verwendet werden. Im Folgenden finden Sie den Quellcode des alglib.mq5 Funktion-Skript für die Berechnung von einigen statistischen Handelsparametern:
//+---------------------------------------------------------------- //| 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" //+---------------------------------------------------------------- //| Verbinden der Bibliotheken | //+---------------------------------------------------------------- #include <Math\Alglib\alglib.mqh> #include <Trade\DealInfo.mqh> #include <Arrays\ArrayDouble.mqh> //+---------------------------------------------------------------- //| Script Programm Start Funktion | //+---------------------------------------------------------------- void OnStart() { //--- Objekt für den Zugriff auf Daten von Transaktionen CDealInfo deal; //--- Objekt für das Abspeichern von Profit oder Verlust zu jeder Transaktion CArrayDouble *profit=new CArrayDouble; //--- Objekt für das Abspeichern des Kontostandes CArrayDouble *balance_total=new CArrayDouble; //--- Anfänglicher Kontostand double balance=0; //--- Empfang historischer Daten HistorySelect(0,TimeCurrent()); //--- Gesamt Anzahl der Transaktionen int deals_total=HistoryDealsTotal(); //--- Empfang der Daten über den Profit und den Kontostand der Transaktionen for(int i=0;i<deals_total;i++) { //--- Mit dem i Index zu der Transaktion gehen deal.SelectByIndex(i); //--- Empfangen des anfänglichen Kontostandes if(deal.DealType()==DEAL_TYPE_BALANCE) { if(NormalizeDouble(deal.Profit()+deal.Swap(),2)>=0.0) if(balance==0.0) balance=deal.Profit(); } //--- Empfangen von Profit und Kontostand 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)); //--- Kopieren der Kontostand-Daten in das 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); //--- Kopieren der Profit Daten in das 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); //--- Lineare Regression //--- Anzahl der unabhängigen Variablen int nvars=1; //--- sample volume int npoints=balance_total.Total(); //--- Erstellen der Matrix mit den Parametern für die lineare 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]); } //--- Variabel für das Erfassen des Berechnungsergebnisse (Erfolgreich, nicht erfolgreich) int info; //--- Notwendiges Klassenobjekt für das Abspeichern der berechneten Daten CLinearModelShell lm; CLRReportShell ar; //--- arrays Für das Abspeichern der Regressionsergebnisse double lr_coeff[]; double lr_values[]; ArrayResize(lr_values,npoints); //--- Berechnung der Verhältnisse der linearen Regression CAlglib::LRBuild(xy,npoints,nvars,info,lm,ar); //--- Erhalten der Verhältnis-Ergebnisse der linearen Regression CAlglib::LRUnpack(lm,lr_coeff,nvars); //--- Empfangen der gewonnenen linearen Regressionswerte for(int i=0;i<npoints;i++) lr_values[i]=lr_coeff[0]*i+lr_coeff[1]; //--- Berechnung des erwarteten Payoff double exp_payoff,tmp1,tmp2,tmp3; CAlglib::SampleMoments(arr_profit,exp_payoff,tmp1,tmp2,tmp3); //--- Berechnung des 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); //--- berechnen der Standardabweichung und mathematische Erwartung von HPR double AHPR,SD; CAlglib::SampleMoments(HPR,AHPR,SD,tmp2,tmp3); SD=MathSqrt(SD); //--- Berechnung der LR Correlation double lr_corr=CAlglib::PearsonCorr2(arr_balance,lr_values); //--- Empfangen des LR Standard Errors 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)); //--- Berechnung von 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("-----------------------------------------------"); //--- Löschen von Objekten delete profit; delete balance_total; } //+----------------------------------------------------------------
Jetzt erhalten wir das folgende Ergebnis:
Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalpublikation: https://www.mql5.com/ru/code/1146
Ein alternativer Indikator für die Definition von Trends, basierend auf Ausbruchsbars und Abstände von Extremwerten.
Exp_CMODieses Handelssystem basiert auf den Signalen von dem CMO Oszillator
Ein gleitender Durchschnitt mit doppelter Glättung
T3MA(MTC)Ein Expert Advisor basierend auf dem T3MA-ALARM Indikator