Maschinelles Lernen im Handel: Theorie, Modelle, Praxis und Algo-Trading - Seite 2333

 


....

 

Einfacher, guter Artikel über die Möglichkeiten der genetischen Programmierung

https://blog.ephorie.de/symbolic-regression-genetic-programming-or-if-kepler-had-r

 

Ich habe (für mich) einen coolen Weg gefunden, um meine mql-Skripte auf Python zu testen, sowie einige Funktionen darin erheblich zu beschleunigen, indem ich dll verwende.

Hier ist die ursprüngliche Funktion in mql5, die ich in Python einfügen möchte. Es sucht einfach nach Minima und Maxima eines Kurses anhand seines geglätteten Musters.

void get_loc_extremum(double &x[],double &x2[],double &loc_max[],double &loc_min[],bool real_price)
  {
   int N = ArraySize(x);
   for(int i=1; i<N-1; i++)
     {
      if(x[i-1]<x[i]&& x[i]>x[i+1])
        {
         ArrayResize(loc_max,ArraySize(loc_max)+1);
         if(real_price)
            loc_max[ArraySize(loc_max)-1]=x2[i];
         else
            loc_max[ArraySize(loc_max)-1]=x[i];
        }

      if(x[i-1]>x[i]&& x[i]<x[i+1])
        {

         ArrayResize(loc_min,ArraySize(loc_min)+1);
         if(real_price)
            loc_min[ArraySize(loc_min)-1]=x2[i];
         else
            loc_min[ArraySize(loc_min)-1]=x[i];
        }

     }

Dies geschieht in mehreren Schritten

1. Irgendwo, in Visual Studio oder in Codeblock kompilieren Sie Ihre DLL. In die .cpp-Datei schreiben wir unsere Funktion, in die .h-Datei deklarieren wir sie. Ein Beispiel, das bei mir funktioniert hat, finden Sie im Anhang zu diesem Beitrag. Im Ordner codeblox project file, main .cpp file, main .h file , im Ordner \bin\Debug file my_lib.dll. Kurz gesagt, hier ist der Header der Funktion in c++:

void DLL_EXPORT GetLocalMaxMin(double* x_sm[],double* x_rl[], double* loc_max[], double* loc_min[], int N, bool real_price)
{
...
}

2 Gehen Sie in Python wie folgt vor:

from ctypes import *

my_dll = cdll.LoadLibrary("my_dll/my_lib.dll") 					#загружаем  свою DLL
my_dll.GetLocalMaxMin.argtypes = [POINTER(c_double), 
        POINTER(c_double), POINTER(c_double), POINTER(c_double), c_int, c_bool] #определяем  типы входных аргументов функции через атрибуты ctypes
my_dll.GetLocalMaxMin.restype = None                                            #определяем  типы выходных данных 

...
#  y - список цен
#  y_sm - список сглаженных цен
#  len(y)=len(y_sm) - длина списков одинаковая

x_sm = (c_double * len(y))(*y_sm)    				  #создаем  указатель на массив x_sm размером len(y_sm) предаем туда указатель на массив y_sm
x_rl = (c_double * len(y))(*y)       			       	  #создаем  указатель на массив x_rl размером len(y) предаем туда указатель на массив y
loc_max = (c_double * len(y))()      				  #создаем  указатель на массив loc_max размером len(y) заполный 0.0 
loc_min = (c_double * len(y))()     				  #создаем  указатель на массив loc_min размером len(y) заполный 0.0 
my_dll.GetLocalMaxMin(x_sm, x_rl, loc_max, loc_min, len(y), True) #вызываем  функцию и передаем туда все что насоздавали

print(list(loc_max),list(loc_min)) #смотрим  что получилось

Dies ist nicht die endgültige Wahrheit, haben Sie Ergänzungen, oder andere Optionen, schreiben.

Dateien:
my_lib.zip  36 kb
 
welimorn:

Ich habe (für mich) einen coolen Weg gefunden, um meine mql-Skripte auf Python zu testen und einige Funktionen darin erheblich zu beschleunigen, indem ich dll verwende.

Hier ist die ursprüngliche Funktion in mql5, die ich in Python einfügen möchte. Es sucht einfach nach Minima und Maxima eines Kurses anhand seines geglätteten Musters.

Dies geschieht in mehreren Schritten

1. Irgendwo, in Visual Studio oder in Codeblock kompilieren Sie Ihre DLL. In die .cpp-Datei schreiben wir unsere Funktion, in die .h-Datei deklarieren wir sie. Ein Beispiel, das bei mir funktioniert hat, finden Sie im Anhang zu diesem Beitrag. Im Ordner codeblox project file, main .cpp file, main .h file , im Ordner \bin\Debug file my_lib.dll. Kurz gesagt, hier ist der Header der Funktion in c++:

2 Gehen Sie in Python wie folgt vor:

Dies ist nicht die endgültige Wahrheit, alle Ergänzungen, oder andere Optionen, schreiben.

Was wollen Sie erreichen?
Wenn Geschwindigkeit, dann nicht verwenden
ArrayResize(loc_max,ArraySize(loc_max)+1);

innerhalb der Schleife und einmal vor dem Aufruf der Funktion die gewünschte Größe einstellen, wie in C++ und Python, oder sie mit dem 3.

ArrayResize(loc_max,ArraySize(loc_max)+1, max_size);

Nun wird bei jedem Aufruf von ArrayResize ein neuer Block im Speicher angelegt, der alte Block in diesen kopiert und der alte Block gelöscht. Das ist sehr, sehr langsam.

И

ArraySize(loc_max)

Sie müssen das nicht jedes Mal tun, Sie können es in einer Variablen speichern.


Probieren Sie es aus, vielleicht müssen Sie dann eine einfache Funktion nicht mehr in 3 verschiedene Programmiersprachen übersetzen. Die Entwickler sagen, dass MQL von der Geschwindigkeit her mit C++ vergleichbar und in manchen Dingen sogar schneller ist.

Warum brauchen Sie Python, wenn Sie DLL direkt aus MQL aufrufen können?

Oder haben Sie ein anderes Ziel?
 
elibrarius:
Was wollen Sie erreichen?
Wenn Geschwindigkeit, verwenden Sie nicht

innerhalb der Schleife und 1 Mal vor dem Aufruf der Funktion die Größe wie in C++ und Python festlegen oder mit dem 3. Parameter reservieren

Nun wird bei jedem Aufruf von ArrayResize ein neuer Block im Speicher angelegt, der alte Block in diesen kopiert und der alte Block gelöscht. Das ist sehr, sehr langsam.

И

Sie müssen das nicht jedes Mal tun, Sie können es in einer Variablen speichern.


Probieren Sie es aus, vielleicht müssen Sie dann eine einfache Funktion nicht mehr in 3 verschiedene Programmiersprachen übersetzen. Die Entwickler sagen, dass MQL in der Geschwindigkeit mit C++ vergleichbar und in einigen Dingen sogar schneller ist.

Warum brauchen Sie Python, wenn Sie die DLL direkt aus MQL aufrufen können?

Oder haben Sie ein anderes Ziel?

Die Extremum-Suchfunktion in der Nachricht dient lediglich als Beispiel, um das Prinzip dahinter zu verdeutlichen.

Der Zweck ist, dass es bequem ist, nach den Abhängigkeiten von Merkmalen und Ziel in Python zu suchen und Modelle auszuwählen, während MQL einen guten Tester hat, mit dem Sie, wenn Sie sich nicht selbst betrügen wollen, eine klare Einschätzung Ihrer Ergebnisse erhalten können.

Ich kann gut mit Python arbeiten, aber ich lerne gerade und kann keine Funktion in mql5 mit Schleifen in Python mit Vektorberechnungen schreiben. Das Schreiben von Code ohne sie ist eine Zeitverschwendung, da Python sehr langsam ist. Einige Funktionen können bei jedem Takt aufgerufen werden, was das Auffinden sehr schwierig macht. Ich habe algib überall verwendet, da sie Lösungen sowohl für Python als auch für mql5 haben. Aber wenn es um meine verrückte Fantasie geht, habe ich ein paar Probleme.

Code für mql5 kann leicht in C++ konvertiert und in dll kompiliert werden. Als Ergebnis verwende ich ein und dieselbe Funktion im Tester und im Python-Skript.

 
welimorn:

Die Extremum-Suchfunktion in der Nachricht wird nur als Beispiel angegeben, um das Prinzip zu zeigen.

Der Zweck ist, dass Python für die Suche nach Abhängigkeiten von Merkmalen und Ziel und die Anpassung von Modellen nützlich ist, während MQL einen guten Tester hat, mit dem man, wenn man sich nicht selbst betrügt, eine klare Einschätzung seiner Ergebnisse erhält.


Sie haben also Abhängigkeiten in Python gefunden, das Modell ausgewählt, trainiert und getestet. Und wie testet man sie in einem Prüfgerät? Python ist weder mit dem Tester noch mit MKL5 kompatibel.

 
Wenn die durchschnittliche Positionshaltezeit für einen TS 10 Minuten beträgt. Und die aktuelle Position ist seit 10 Stunden in der Schwebe, dann ist ihr Ergebnis eine Gegenleistung (völlig unsystematisch)?
 
fxsaber:
Wenn die durchschnittliche Positionshaltezeit für den TS 10 Minuten beträgt. Und die aktuelle Position hängt seit 10 Stunden, dann ist ihr Ergebnis ein Gambit (völlig unsystematisch)?

Es kommt darauf an, wie die Logik/Regeln des TS geschrieben sind. Das "vielleicht" ist ein probabilistisches Ergebnis, das nicht durch die Logik der TK bestimmt wird. Wenn die Logik während der gesamten 10 Stunden einwandfrei funktioniert hat, dann handelt es sich um einen seltenen Fall.

 
Valeriy Yastremskiy:

Wenn alle 10 Stunden der Logik definitiv funktioniert haben, ist das nur ein seltener Fall.

Nur weil die Logik funktioniert hat, ist das Ergebnis nicht systemisch.

 
fxsaber:

Nur weil die Logik funktioniert hat, ist das Ergebnis nicht systematisch.

In der Frage wird nicht angegeben, worauf die Gegenleistung und die Systematik anzuwenden sind. Wenn auf TK, dann hängt es von der TK ab, wenn auf äußere Bedingungen, dann sind seltene Fälle von Natur aus nicht systemisch. Und es kann Ausnahmen von der Regel geben. Eurodollar 14 von Mai bis März '15. Es handelt sich nicht um einen systematischen Fall.