Diskussion zum Artikel "Statistische Verteilungen in MQL5 - Nur das Beste aus R" - Seite 4

 
fxsaber:

Was soll der Scheiß?! Die Ziele der Mathe-Bibel sind klar.

Ein robustes mathematisches Modell in R zu finden. Sie haben es gefunden, also haben sie es in R untersucht. Und dann können Sie leicht eine fertige erforschte Lösung (ein Handelsalgorithmus in der Tat) von R zu MQL auf Kosten von bibla und diesem Artikel portieren. Alle Arten von maschinellem Lernen sind immer für die Finanzmärkte geeignet.
Das Schreiben in MQl ist mühsam.)) Es ist einfacher (und zuverlässiger)), die benötigte Funktionalität direkt aus R (und so weiter)) aufzurufen. Renat erwähnte diese Methoden - sie sind nicht die einfachsten und modernsten, aber es gibt sie. Wie kann man zum Beispiel COM-Objekte an MT anhängen? Teilweise kann man das (nicht ganz) - (Verzeihung) über Dichtungen))).
 
СанСаныч Фоменко:

Ich verstehe etwas nicht

Was ist das Ergebnis des Aufrufs der angegebenen Funktion in MQL? Ein Skalar? Ein Vektor?

Hier ist, was wir auf R haben

n <- 2000

>

> k <- seq(0, n, by = 20)

>

> dbinom(k, n, pi/10, log = TRUE)

[1] -754.219687 -660.247472 -592.126636 -534.532344 -483.881605

[6] -438.460449 -397.256529 -359.600217 -325.015561 -293.146935

[11] -263.718651 -236.510862 -211.344286 -188.070044 -166.562645

[16] -146.714976 -128.434635 -111.641185 -96.264050 -82.240889

[21] -69.516303 -58.040813 -47.770020 -38.663934 -30.686405

[26] -23.804662 -17.988917 -13.212041 -9.449276 -6.678001

[31] -4.877524 -4.028903 -4.114796 -5.119322 -7.027950

> a<-dbinom(k, n, pi/10, log = TRUE)

> str(a)

num [1:101] -754 -660 -592 -535 -484 ...

D.h. der Aufruf der Funktion in R ergibt einen Vektor, der mit der universellen Methode plot gezeichnet werden kann

> plot(a)

Legen Sie die aktualisierte Datei bitte in /Include/Math/Stat ab.

Sie fügt eine überladene Funktion für den Vektor + einen zusätzlichen log_mode Parameter hinzu.

Hier ist eine Analogie zu Ihren Berechnungen, die vollständig mit den Ergebnissen von R übereinstimmt:

#include <Math/Stat/Binomial.mqh>

void OnStart(void)
  {
   double    vars[101];
   double    results[101];
   const int N=2000;
//--- 
   for(int i=0;i<=N;i+=20)
      vars[i/20]=i;

   MathProbabilityDensityBinomial(vars,N,M_PI/10,true,results);
      
   for(int i=0;i<ArraySize(results);i++)
      Print(results[i]);
//---
  }

Schlussfolgerung:

-754.2196869142003
-660.2474717208812
-592.1266359491199
-534.5323437511825 
...

Wir arbeiten jetzt daran, Vektoroperationen hinzuzufügen, um in der Syntax so nah wie möglich an R zu sein.

Natürlich werden wir viele neue Unit-Tests in die Auslieferung aufnehmen.

Dateien:
Binomial.mqh  19 kb
 

Übrigens sind Aussagen über die Optimierung der Geschwindigkeit mathematischer Bibliotheken in R stark übertrieben.

Dies ist das Ergebnis von frontalem Schreiben von Code und wildem System-Overhead aufgrund der Arbeit mit dynamischen Objekten/Entitäten. Im Gegensatz zu R arbeitet MQL5 mit klar typisierten Arrays und kompiliert Code in nativem x64. Dies ist ein enormer Vorteil und ermöglicht es Ihnen, sogar gegen DLL-Implementierungen von Funktionen in R zu gewinnen.


Hier ist ein Test basierend auf dem obigen Beispiel: R 3.3.1 x64

install.packages("microbenchmark")

library(microbenchmark)
n <- 2000
k <- seq(0,n,by=20)
res <- microbenchmark(a<-dbinom(k, n, pi/10, log = TRUE))
print(res)



Unit: microseconds
                                 expr    min     lq     mean median    uq    max neval
 a <- dbinom(k, n, pi/10, log = TRUE) 20.167 20.168 20.88726 20.469 20.77 35.819   100

Der dreifache Durchlauf ergab eine Mindestzeit von 20 Mikrosekunden.

Derselbe Test in MQL5:

#include <Math/Stat/Binomial.mqh>

void OnStart(void)
  {
   double    vars[101];
   double    results[101];
   const int N=2000;
//--- 
   for(int i=0;i<=N;i+=20)
      vars[i/20]=i;

   ulong msc=GetMicrosecondCount();
   MathProbabilityDensityBinomial(vars,N,M_PI/10,true,results);
   msc=GetMicrosecondCount()-msc;
      
   Print("Time: ",msc," msc");
//---
  }


2016.10.10 21:21:12.156 new (Si-12.16,H1)       Time: 10 msc

MQL5 zählt doppelt so schnell: 10 Mikrosekunden gegenüber 20 Mikrosekunden in R.

Berechnet auf i7-4930k, Windows 10 x64, MetaTrader 5 x64, keine Virtualisierungen und keine externe Last.

 
Renat Fatkhullin:

Übrigens sind Aussagen über die Optimierung der Geschwindigkeit mathematischer Bibliotheken in R stark übertrieben.

Dies ist das Ergebnis von frontalem Schreiben von Code und wildem System-Overhead aufgrund der Arbeit mit dynamischen Objekten/Entitäten. Im Gegensatz zu R arbeitet MQL5 mit klar typisierten Arrays und kompiliert Code in nativem x64. Dies ist ein enormer Vorteil und ermöglicht es Ihnen, sogar gegen DLL-Implementierungen von Funktionen in R zu gewinnen.


Hier ist ein Test basierend auf dem obigen Beispiel: R 3.3.1 x64

Der dreifache Durchlauf ergab eine Mindestzeit von 20 Mikrosekunden.

Derselbe Test in MQL5:

MQL5 zählt doppelt so schnell: 10 Mikrosekunden gegenüber 20 Mikrosekunden in R.

Berechnet auf i7-4930k, Windows 10 x64, MetaTrader 5 x64, keine Virtualisierungen und keine externe Last.

Glückwunsch!!! Ein klarer Sieg, auf beiden Seiten.
 
Renat Fatkhullin:

Übrigens sind Aussagen über die Optimierung der Geschwindigkeit mathematischer Bibliotheken in R stark übertrieben.

Dies ist das Ergebnis von frontalem Schreiben von Code und wildem System-Overhead aufgrund der Arbeit mit dynamischen Objekten/Entitäten. Im Gegensatz zu R arbeitet MQL5 mit klar typisierten Arrays und kompiliert Code in nativem x64. Dies ist ein enormer Vorteil und ermöglicht es Ihnen, sogar gegen DLL-Implementierungen von Funktionen in R zu gewinnen.


Hier ist ein Test basierend auf dem obigen Beispiel: R 3.3.1 x64

Der dreifache Durchlauf ergab eine Mindestzeit von 20 Mikrosekunden.

Derselbe Test in MQL5:

MQL5 zählt doppelt so schnell: 10 Mikrosekunden vs. 20 Mikrosekunden in R.

Berechnung auf i7-4930k, Windows 10 x64, MetaTrader 5 x64, keine Virtualisierungen und keine externe Last.

und ich bekam einen Fehler((

'vars' - Parameterumwandlung nicht erlaubt

 
ivanivan_11:

und ich bekam eine Fehlermeldung((

'vars' - Parameterumwandlung nicht erlaubt

Sie müssen die aktualisierte Datei von https://www.mql5.com/ru/forum/97153/page4#comment_2882502 nehmen .

Dort wurde eine überschriebene Funktion für Vektoren hinzugefügt.

 
Renat Fatkhullin:

Sie müssen die aktualisierte Datei von https://www.mql5.com/ru/forum/97153/page4#comment_2882502 übernehmen.

Es gibt eine neu definierte Funktion für Vektoren.

Ja, danke. es funktioniert so. es hat bei mir so funktioniert. ich muss dir gleich sagen, dass ich MT unter vyne, 32bit, laufen lasse. deshalb vermute ich, was die Antwort sein wird - 64bit ist schneller))) um jede Verwirrung zu vermeiden - R ist auch 32bit.



 
ivanivan_11:

Ja, danke. es funktioniert so. es funktionierte für mich so. ich muss sagen, dass ich MT unter wyne, 32bit laufen lasse. also was wird die Antwort sein, ich kann raten - 64bit ist schneller))))

Das ist nicht ernst gemeint.

Unter wyne, und sogar 32 Bit. Für 32 Bit verwendet MT5 einen alten Compiler ähnlich wie MT4. Er ist ein paar Dutzend Mal langsamer als 64-Bit-Code, der von einem neuen Compiler speziell für die 64-Bit-Version von MT5 erstellt wird. Wir haben einen Bericht veröffentlicht, in dem wir die Geschwindigkeit von 32- und 64-Bit-MQL5-Programmen vergleichen.

Jedes MQL5-Programm enthält eigentlich zwei Kopien des kompilierten Codes: 32-Bit für alte Systeme, um die Kompatibilität zu gewährleisten, und 64-Bit für neue Systeme.

Wir haben die Entwicklung von 32-Bit-Compilern vollständig aufgegeben, da sie keinen Sinn und keine Zukunft hat.

Deshalb sollten Sie nur 64-Bit-Versionen von MetaTrader 5 verwenden, wenn Sie die maximale Leistung erhalten wollen.


Übrigens, eine Information für diejenigen, die auf MT4 sitzen - auch dort ist die Geschwindigkeit der MQL4-Code-Ausführung ein paar Dutzend Mal langsamer als im 64-Bit-MetaTrader 5.

 
Andrey Dik:
Herzlichen Glückwunsch! Ein klarer Sieg, auf beiden Seiten.

Die Berechnung ist doppelt so schnell wie eine vergleichbare R-Berechnung mit Kompilierung (der erste Durchlauf von R ist eine Byte- bzw. Jit-Kompilierung, so dass sie max>1,5 avg und min~=avg hat) ?

naja, Leistung... :-)

 
Maxim Kuznetsov:

Berechnung doppelt so schnell wie die gleiche R-Berechnung mit Kompilierung (der erste Durchlauf von R ist Byte- bzw. Jit-Kompilierung, hat also max>1,5 avg und min~=avg) ?

naja, Leistung... :-)

R brauchte die minimale Zeit über viele Durchläufe, nicht den ersten Durchlauf und die maximale Zeit.

Also nein, "Kaltstart" erklärt es hier nicht. Und selbst in einer Umgebung, in der der gesamte Bibliothekscode in einer DLL enthalten ist. Da gibt es praktisch nichts zum Aufwärmen.

Was es aber erklärt:

  1. Das Fehlen von Overhead bei dynamischen Objekten wie in R aufgrund der Arbeit mit rein typisierten Double-Daten
  2. Ein furchtbar effizienter Compiler in MQL5. Es ist wirklich beängstigend, sich den resultierenden asm-Code anzusehen.
  3. Vorhandensein von MQL5-Bibliotheken im Quellcode, die es erlauben, ihren Code direkt an der Aufrufstelle zu inlinen und die Konst-Umgebung der aufgerufenen Stelle maximal zu nutzen.

    Hier hat der Compiler sehr viel Spielraum im Vergleich zu eigentlich nicht optimierten Implementierungen in DLLs, die keine Chance haben, die Umgebung zu lernen und sich darauf einzustellen.