Python scikitlearn model zu MQL5 importieren

Einloggen oder registrieren, um einen Kommentar zu schreiben
Bayne
554
Bayne  
Hey, 
Habe ein trainiertes Machine learning model aus scikit learn (Python).

Wie kann ich dies in MQL5 Code importieren?
(Oder zumindest in Code umwandeln und die ";" manuell setzen)

Carl Schreiber
Moderator
8038
Carl Schreiber  
Hier sollte es stehen: Mt5 & Python
Integration von MetaTrader 5 und Python: Daten senden und empfangen
Integration von MetaTrader 5 und Python: Daten senden und empfangen
  • www.mql5.com
Ein Netzwerk-Socket ist ein Endpunkt der Prozesskommunikation über ein Computernetzwerk. Die Standardbibliothek von MQL5 enthält eine Gruppe von Socket-Funktionen, die eine Low-Level-Schnittstelle für die Arbeit im Internet bieten. Dies ist eine gemeinsame Schnittstelle verschiedenster Programmiersprachen, da sie Systemaufrufe auf...
Bayne
554
Bayne  
Carl Schreiber:
Hier sollte es stehen: Mt5 & Python
" Leider ist die aktuelle Implementierung des Socket-Clients in MetaTrader 5 nicht für den Betrieb im Strategy-Tester geeignet, so dass kein vollständiges Testen und Messen der Leistung dieser Lösung durchgeführt wurde. Lassen Sie uns auf weitere Updates der Socket-Funktionen warten."

hätte mir das lesen wohl ersparen können.

Hoffentlich war der letzte Monat Scikit-learn erfahrungen sammeln nicht umsonst, kennt vllt jmd eine möglichkeit wie ich mein model (bevorzuge Regressionsmodelle) in code umwandeln kann?

Carl Schreiber
Moderator
8038
Carl Schreiber  

Dann kann ich Dir nur die neuen Befehle in MT5 empfehlen:

https://www.mql5.com/de/docs/integration/python_metatrader5

Dokumentation zu MQL5: Integration / MetaTrader für Python
Dokumentation zu MQL5: Integration / MetaTrader für Python
  • www.mql5.com
MT5Tick(time=datetime.datetime(2019, 4, 1, 3, 2, 3, 512000), bid=1.5764200000000002, ask=1.57837, last=0.0, volume=0.0, flags=134) MT5Tick(time=datetime.datetime(2019, 4, 1, 3, 2, 8, 70000), bid=1.57643, ask=1.57837, last=0.0, volume=0.0, flags=130...
Bayne
554
Bayne  
sehe leider keine funktion wie ich ein signal an den MT5 wieder zurückschicken kann :( ist das machbar, sodass ich den strategytester verwenden kann?
Carl Schreiber
Moderator
8038
Carl Schreiber  

Dann würde ich folgenden einfachsten Workaround vorschlagen:

Mach eine Ram-Disk und lass Python eine Datei darauf schreiben und im MT5-Programm prüfst Du, wenn nötig, ob sie existiert, dann lesen und löschen - ist schneller als auf normale HDs schreiben und lesen und fast so schnell wir Sockets oder gemeinsame Speicher: Auch die müssen prüfen ob was da ist, dann bereitstellen und löschen.

Du musst dazu die Win-Api-Funktionen verwenden (außerhalb des MT5-Sandkastens), aber die sind auch etwas schneller und das alles hat den Vorteil von Standardlösungen: Leicht zu lesen und zu verstehen auch nach Jahren ;)

PS.: Ich habe noch mal gesucht/gefragt - im Augenblick gibt es nur diese Lösung (oder so ähnliche)
Bayne
554
Bayne  
Würde so der strategy Tester zusammen mit dem Modell nutzbar sein ?
Carl Schreiber
Moderator
8038
Carl Schreiber  
Bayne:
Würde so der strategy Tester zusammen mit dem Modell nutzbar sein ?

In der Hilfe stht nix, was dagagen spricht, aber es steht nicht immer alles da.

Es arbeitet aber immer nur ein Timer für einen EA, aber den kann man wohl an- und abschalten.

Also vom EA aus:

  1. Job an Python schicken
  2. MSecTimer anstellen
  3. im Timer nachschauen, ob die Ergebnisdatei existiert
  4. wenn ja Timer löschen (oder auf gaaaanz lang stellen), Datei  lesen und  löschen.

Hab's aber nicht ausprobiert!

Überprüf den Timeraufruf zu mindest beim ersten Mal mit Ausdrucken im Journal mit Laufnummer und Zeitangabe, denn sleep funktioniert(e) soweit ich mich erinnere nicht im Tester - das steht aber nicht (mehr?) in der (aktuellen) Hilfe.

Christian
2740
Christian  
Bayne:

hätte mir das lesen wohl ersparen können.

Hoffentlich war der letzte Monat Scikit-learn erfahrungen sammeln nicht umsonst, kennt vllt jmd eine möglichkeit wie ich mein model (bevorzuge Regressionsmodelle) in code umwandeln kann?

Ach Bayne ......wie soll man dir nur helfen.


Das was du möchtest geht nur wenn DU programmieren gelernt hast.

Es gibt kein "Schuppdiewupp-PythonCode-to-MQl5-Converter".

Und ja ...sie war umsonst.


Teste mal diese Seite und berichte ob du den Indikator zum laufen gebracht hast.

https://roffild.com/PythonDLL.html

MetaTrader 5 (MQL5) + Python 3 DLL for Forex, CFD and Futures
  • roffild.com
Use MetaTrader with Python 3 on financial stock exchanges, Forex, CFD and Futures. From MetaTrader, you can get quotes in Python, but no complete connection between them. This post is one of the developers (RU). The main idea and the difference of this wrapper: a data exchange between the MQL and Python via pre-created function. This is the...
Christian
2740
Christian  
Carl Schreiber:

Überprüf den Timeraufruf zu mindest beim ersten Mal mit Ausdrucken im Journal mit Laufnummer und Zeitangabe, denn sleep funktioniert(e) soweit ich mich erinnere nicht im Tester - das steht aber nicht (mehr?) in der (aktuellen) Hilfe.

Sleep wurd glaube ich wieder zugelassen , hatte da was gelesen.

Bzw kann sowas genutzt werden

   bool noPrint = false;
   
   unsigned int viSleepUntilTick = GetTickCount() + 2000; //2000 milliseconds
   while(GetTickCount() < viSleepUntilTick) 
        {
           if (!noPrint){
            printf("Sleeping 2000 msec ...");
            noPrint = true; }
             
        }  
Bayne:
sehe leider keine funktion wie ich ein signal an den MT5 wieder zurückschicken kann :( ist das machbar, sodass ich den strategytester verwenden kann?

Du musst noch warten. MQ hat angekündigt das mehr API-Befehle folgen.

Aktuell geht nur Daten von MQL5 nach Python.

Da die aktuellen API-Befehle ja ohne EA also direkt an den MT5 gehen könnte dann folgen das man über die SERVICES eine Schnittstelle "bauen" kann.

Ist aber nur Spekulation.

Chris70
24
Chris70  

Hallo Bayne,

Ich stand mal vor genau dem gleichen Problem und kann Dir daher vielleicht etwas helfen. Ich hatte mich auch mal in Python eingearbeitet spezifisch mit dem Ziel, Machine-Learning-Komponenten (neuronale Netze, Zeitreihenanalyse mit LSTM-Zellen, Regression...) in Python umzusetzen und die Resultate aus MT5 abzufragen. Die Kommunikation hatte ich über .csv-Dateien gelöst. Ergebnis nach vielen Experimenten: es ist alles hickhack. Letztlich habe ich den Python-Exkurs wieder verlassen und die genannten Machine-Learning-Module direkt in MQL5 umgesetzt. Es handelt sich hier um die Kernkomponenten meiner EAs, daher tue ich mich etwas schwer, den Code hier für lau zu verschenken (darf man zickig von mir finden ;-) ), ich kann mir aber vorstellen, dass ich trotzdem ein paar hilfreiche Tipps geben kann:

Falls Du einigermaßen Englisch sprichst: es gibt von der Uni Stanford einen gratis-Kurs (verfügbar über coursera.com) von Prof. Andrew Ng (ja.. der Nachname ist wirklich so kurz und hat keine Vokale). Dieser Kurs ist didaktisch absolut genial und damit sollte es nicht schwer fallen, den nötigen Code für wichtige Elemente aus dem Bereich des machine learnings selbst zu schreiben.

Du hast spezifisch nach Regressions-Modellen gefragt. Da gibt es ja einmal die lineare Regression und dann die polynome Regression als Sonderfall der linearen Regression (andererseits ist lineare Regression nichts anderes als polynome Regression erster Ordnung). Ich gebe Dir daher den Tipp, von vorneherein nur Code für polynome Regression zu schreiben. Will man dann mal ein lineares Modell verwenden, setzt man dann halt die Potenz auf 1. Warum ich das empfehle: ganz einfach weil ich im Backtesting mit verschiedenen Potenzen rumprobiert habe und immer wieder festgestellt habe, dass man mit höheren Potenzen zu besseren (=rentableren) Modellen kommt. Ich verwende meist die Potenz 5, was kein relevantes Performance-Problem darstellt.

Bei der linearen und polynomen Regression gibt es ja verschiedene Methoden zur Lösung, einmal das "normale" Verfahren als Matrixoperation und dann die iterative Methode.

"Normal" wäre in dem Fall nach der Formel:     Theta (=coefficient vector) at cost function minimum = (X_transp*X)^-1 * X_transp * Y.   Dabei ergibt sich allerdings ein Problem: die Matrix-Transposition ist keine Kunst, der nötige Schritt einer Matrix-Inversion ist allerdings recht kompliziert umzusetzen und ich wüsste auch nicht, dass jemand eine solche Funktion schon mal online für MQL5 verfügbar gemacht hat (sonst bin ich interessiert). Hier hat Python einen Vorteil, denn dort gibt es die Matrix-Inversion bereits als fertige Funktion und das Ganze ist sehr flott.

Die iterative Methode ist andererseits nicht allzu schwer umzusetzen. Meine Erfahrung zeigt, dass mehr als ~30 Iterationen Quatsch sind und zu keinen wirklich anderen Kurven führen. Die Lernrate alpha setze ich dabei meist auf 0.5. Dies ist im Vergleich zu anderen Gradient-Descent-Verfahren wie z.B. Mulitlayer-Perceptron-Modellen ein krass hoher Wert, jedoch bei der polynomen Regression kein Problem. Man kommt ohne große Rechenleistung zu perfekten Kurven, ohne dass in der Praxis ein "exploding gradient"-Problem auftritt.

Ich führe die Regressions-Berechnungen mit jeder neuen Kerze durch (also nicht mit jedem Tick) und habe so keinerlei Performance-Probleme. Das war in der Kombination MQL5+Python WESENTLICH schlechter (=untauglich).

Es sind nur wenige zusätzliche Code-Zeilen, zugleich auch immer Varianz, Standardabweichung und r_squared mitzuberechnen. Aus +/- Vielfachen der Standardabweichung lassen sich dann Regressions-"Kanäle" zeichnen. Übrigens ist ein Bollinger-Band ja auch irgendwie nur ein Spezielfall eines solchen Kanals, denn polynome Regression nullter Ordnung ist nichts anderes als das arithmetische Mittel (und ganz viele arithmetische Mittel bilden einen Moving Average, +/- n StdDev = Bollinger). Jeder erfahrene Trader weiß, dass Bollinger-Bänder zwar eine nette Idee sind, aber allein nicht profitabel. Mit polynomen Regressionskanälen sind hingegen recht gute Handelssysteme möglich (funktioniert bei mir v.a. im EURUSD und USDJPY). Ich verwende den Ausbruch aus diesen Kanälen als Handelssignal und definiere dann SL, break-even-Schwelle und TP als Vielfache der Standardabweichung.

Wie gesagt, ich will mein System nicht einfach verschenken, ein wenig Arbeit muss man sich selber machen, doch ich kann Dich nur ermutigen, weiter mit Regressions-Modellen zu arbeiten und habe hier EINEN Weg beschrieben, wie es definitiv funktioniert.

Ich weiß, ich habe hier etwas weiter ausgeholt, doch ich vermute, dass für den Threadersteller irgendein praktischer Nutzen dabei sein wird (das war an Christian und Carl ;-) damit ich nicht wieder einen drüber kriege und mein Beitrag ausgelagert wird ;-) )

12
Einloggen oder registrieren, um einen Kommentar zu schreiben