Neuer MetaTrader 5 Build 3620: Verbesserungen am Web-Terminal, ONNX-Unterstützung und schnelle Matrix-Multiplikationen in MQL5

 

Die neue Version der aktualisierten MetaTrader 5-Plattform wird am Freitag, den 10. März 2023, veröffentlicht.

Das Update bietet Verbesserungen des Webterminals. Wir haben eine Reihe von Farbvorlagen für die Webterminal-Schnittstelle implementiert und das Fenster für die Spezifikation von Symbolen verbessert.

Der neue MetaTrader 5 Build 3620: Verbesserungen am Web-Terminal und schnelle Matrixmultiplikationen in MQL5

Außerdem bietet die neue Version die Allgemeine Matrixmultiplikation (GeMM) in MQL5. Dieser Algorithmus beschleunigt die Berechnungen auf den meisten Prozessoren. Der neue Algorithmus wird derzeit von der Methode matrix::GeMM unterstützt.

Wir haben auch Unterstützung für Operationen mit ONNX-Modellen in MQL5 implementiert. Dies wird die Verwendung von neuronalen Netzen in Expert Advisors erheblich erleichtern.

Die neue Version realisiert folgende Änderungen:


MetaTrader 5 Client Terminal Build 3620

  1. Terminal: Die Berechnung des Gesamtgewinns in den Handelsberichten wurde korrigiert.
  2. Terminal: Aktualisierte Daten für Handelsinstrumente, die über das Fenster Market Watch verfügbar sind.
  3. Terminal: Korrigiert wurde der Start der Handelsplattform unter Wine 7.0.1 auf Linuxsystemen
  4. Terminal: Das Hinzufügen von Symbolen zur Markttiefe über die Suchleiste wurde korrigiert. Ein über die Beschreibung gefundenes Symbol konnte nicht durch Anklicken der entsprechenden Zeile in die Liste aufgenommen werden.
  5. MQL5: Die Unterstützung für Operationen mit ONNX-Modellen (Open Neural Network Exchange) wurde hinzugefügt.

    ONNX ist ein Open-Source-Format für Modelle des maschinellen Lernens. Dieses Format wird von vielen Plattformen unterstützt, darunter Chainer, Caffee2 und PyTorch. Erstellen Sie ein ONNX-Modell mit Hilfe spezieller Tools, integrieren Sie es in Ihre MQL5-Anwendung und nutzen Sie es, um Handelsentscheidungen zu treffen.

    Beschreibungen aller unterstützten Funktionen finden Sie in der Dokumentation. Ein Beispiel für ein ONNX-Testmodell finden Sie unter „öffentliche Projekte“ im MetaEditor. Suchen Sie das Projekt ONNX.Price.Prediction in „Toolbox \ Öffent,iche Projekte“ und wählen Sie im Kontextmenü die Option Teilnehmen. Das Projekt wird auf Ihren Computer heruntergeladen und erscheint im Navigator:


    Ein Beispiel für die Arbeit mit einem ONNX-Modell in öffentlichen Projekten


    Kompilieren Sie das Projekt und lassen Sie es auf EURUSD H1 laufen, um das Ergebnis zu sehen.

    Neben dem Modell und dem MQL5-Code, der es ausführt, enthält das Projekt auch das Python-Skript PricePredictionTraining.py. Es zeigt, wie Sie selbst ein ONNX-Modell erstellen können. Um das Skript auszuführen, installieren Sie Python auf Ihrem Computer und die erforderlichen Module über die Eingabeaufforderung:

    python.exe -m pip install --upgrade pip
    python -m pip install --upgrade tensorflow
    python -m pip install --upgrade pandas
    python -m pip install --upgrade scikit-learn
    python -m pip install --upgrade matplotlib
    python -m pip install --upgrade tqdm
    python -m pip install --upgrade metatrader5
    python -m pip install --upgrade onnx==1.12
    python -m pip install --upgrade tf2onnx
    Anweisungen zur Verwendung von ONNX finden Sie in der Dokumentation.

  6. MQL5: Unterstützung für General Matrix Multiplikation (GeMM) hinzugefügt. Dieser Algorithmus beschleunigt die Berechnungen auf einigen Prozessortypen durch parallelisierte Aufgaben und optimierte Nutzung der L1/L2/L3-Caches. Die Berechnungsgeschwindigkeit ist vergleichbar mit gängigen Paketen wie der Math Kernel Library (MKL) and OpenBLAS. Ausführliche Vergleichstests werden demnächst veröffentlicht.

    Der neue Algorithmus wird derzeit von der Methode matrix::GeMM unterstützt. Wenn Ihr Prozessor die Befehle AVX and FMA unterstützt (die meisten nach 2013 veröffentlichten Prozessoren unterstützen diese Befehle), wird der Algorithmus automatisch aktiviert.

  7. MQL5: Es wurde die Möglichkeit hinzugefügt, Matrizen und Vektoren zur einer DLL zu übertragen. Dies ermöglicht den Import von Funktionen, die die entsprechenden Typen verwenden, aus externen Variablen.

    Matrizen und Vektoren werden an eine DLL als Zeiger auf einen Puffer übergeben. Um zum Beispiel eine Matrix vom Typ float zu übergeben, muss der entsprechende Parameter der aus der DLL exportierten Funktion einen Pufferzeiger vom Typ float aufnehmen. Zum Beispiel:

    MQL5
    #import "mmlib.dll"
    bool sgemm(uint flags,matrix<float> &C,const matrix<float> &A,const matrix<float> &B,ulong M,ulong N,ulong K,float alpha,float beta);
    #import
    C++
    extern "C" __declspec(dllexport) bool sgemm(UINT flags,float *C,const float *A,const float *B,UINT64 M,UINT64 N,UINT64 K,float alpha,float beta)
    Zusätzlich zu den Puffern sollten Sie Matrix- und Vektorgrößen für eine korrekte Verarbeitung übergeben.

  8. MQL5: Die neue Funktion CopySeries zum Kopieren von synchronisierten Zeitreihen aus MqlRates in separate Arrays hinzugefügt.

    Die Funktion CopySeries ermöglicht es, mit einem einzigen Aufruf nur die erforderlichen Zeitreihen in verschiedene spezifizierte Arrays zu erhalten, wobei alle Zeitreihendaten synchronisiert werden. Das bedeutet, dass alle Werte in den resultierenden Arrays bei einem bestimmten Index N zum selben Balken des angegebenen Symbol/Zeitrahmenpaares gehören. Daher muss der Programmierer die empfangenen Zeitreihen nicht zusätzlich mit der Eröffnungszeit der Balken synchronisieren.

    Im Gegensatz zu CopyRates, das den gesamten Satz von Zeitreihen als MqlRates-Array zurückgibt, ermöglicht die Funktion CopySeries, bestimmte erforderliche Zeitreihen in separaten Arrays zu erhalten. Dies kann durch die Angabe einer Kombination von Flags geschehen, um den Typ der Zeitreihe auszuwählen. Die Reihenfolge der an die Funktion übergebenen Arrays muss mit der Reihenfolge der Felder in der MqlRates-Struktur übereinstimmen:

    struct MqlRates
      {
       datetime time;         // period beginning time
       double   open;         // open price
       double   high;         // high price for the period
       double   low;          // low price for the period
       double   close;        // close price
       long     tick_volume;  // tick volume
       int      spread;       // spread
       long     real_volume;  // exchange volume
      }

    Wenn Sie also die Werte der Zeitreihen „time“, „close“ und „real_volume“ für die letzten 100 Balken des aktuellen Symbols/Zeitrahmens abrufen möchten, sollten Sie den folgenden Aufruf verwenden:

    datetime  time[];
    double    close[];
    long      volume[];
    CopySeries(NULL,0,0,100,COPY_RATES_TIME|COPY_RATES_CLOSE|COPY_RATES_VOLUME_REAL,time,close,volume);
    

    Die Reihenfolge der Arrays „time, close, volume“ muss mit der Reihenfolge der Felder in der Struktur MqlRates übereinstimmen. Die Reihenfolge der Werte in der Maske rates_mask wird nicht berücksichtigt. Die Maske könnte auch folgendermaßen aussehen:

    COPY_RATES_VOLUME_REAL|COPY_RATES_TIME|COPY_RATES_CLOSE

    Beispiel

    //--- input parameters
    input datetime InpDateFrom=D'2022.01.01 00:00:00';
    input datetime InpDateTo  =D'2023.01.01 00:00:00';
    input uint     InpCount   =20;
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart(void)
      {
    //--- arrays to get timeseries from the Rates structure
       double   open[];
       double   close[];
       float    closef[];
       datetime time1[], time2[];
    //---request close prices to a double array
       ResetLastError();
       int res1=CopySeries(NULL, PERIOD_CURRENT, 0, InpCount,
                           COPY_RATES_TIME|COPY_RATES_CLOSE, time1, close);
       PrintFormat("1. CopySeries  returns %d values. Error code=%d", res1, GetLastError());
       ArrayPrint(close);
       
    
    //--- now also request open prices; use float array for close prices
       ResetLastError();
       int res2=CopySeries(NULL, PERIOD_CURRENT, 0, InpCount,
                           COPY_RATES_TIME|COPY_RATES_CLOSE|COPY_RATES_OPEN, time2, open, closef);
       PrintFormat("2. CopySeries  returns %d values. Error code=%d", res2, GetLastError());
       ArrayPrint(closef);
    //--- compare the received data
       if((res1==res2) && (time1[0]==time2[0]))
         {
          Print("  | Time             |    Open      | Close double | Close float |");
          for(int i=0; i<10; i++)
            {
             PrintFormat("%d | %s |   %.5f    |   %.5f    |   %.5f   |",
                         i, TimeToString(time1[i]), open[i], close[i], closef[i]);
            }
         }
    /*  Result
            1. CopySeries  returns 0 values. Error code=0
            [ 0] 1.06722 1.06733 1.06653 1.06520 1.06573 1.06649 1.06694 1.06675 1.06684 1.06604
            [10] 1.06514 1.06557 1.06456 1.06481 1.06414 1.06394 1.06364 1.06386 1.06239 1.06247
            2. CopySeries  returns 0 values. Error code=0
            [ 0] 1.06722 1.06733 1.06653 1.06520 1.06573 1.06649 1.06694 1.06675 1.06684 1.06604
            [10] 1.06514 1.06557 1.06456 1.06481 1.06414 1.06394 1.06364 1.06386 1.06239 1.06247
              | Time             |    Open      | Close double | Close float |
            0 | 2023.03.01 17:00 |   1.06660    |   1.06722    |   1.06722   |
            1 | 2023.03.01 18:00 |   1.06722    |   1.06733    |   1.06733   |
            2 | 2023.03.01 19:00 |   1.06734    |   1.06653    |   1.06653   |
            3 | 2023.03.01 20:00 |   1.06654    |   1.06520    |   1.06520   |
            4 | 2023.03.01 21:00 |   1.06520    |   1.06573    |   1.06573   |
            5 | 2023.03.01 22:00 |   1.06572    |   1.06649    |   1.06649   |
            6 | 2023.03.01 23:00 |   1.06649    |   1.06694    |   1.06694   |
            7 | 2023.03.02 00:00 |   1.06683    |   1.06675    |   1.06675   |
            8 | 2023.03.02 01:00 |   1.06675    |   1.06684    |   1.06684   |
            9 | 2023.03.02 02:00 |   1.06687    |   1.06604    |   1.06604   |
    */
      }
  9. MQL5: Die Operation der Funktion OrderSend wurde korrigiert. Die Funktionsabfrage konnte ein falsches Auftragsticket zurückgeben, wenn das gleiche Konto gleichzeitig auf mehreren Plattformen verwendet wurde.
  10. MQL5: Der Import von EX5-Bibliotheken wurde korrigiert. Ein Fehler trat auf, wenn der Name der importierten Bibliothek mit dem Namen der Datei übereinstimmte, in die sie importiert wurde.
  11. MetaEditor: Das Senden von Push-Benachrichtigungen im Rahmen eines „shared projects“ wurde hinzugefügt. Mit der neuen Option können Nutzer über Änderungen in Projekteinstellungen und Dateien benachrichtigt werden. Um Benachrichtigungen zu aktivieren, geben Sie Ihre MetaQuotes-ID unter dem Abschnitt „Einstellungen \ Sicherheit“ Ihres titleMQL5.community-Profilstitle ein.


    Push-Benachrichtigungen über Projektaktualisierungen


  12. MetaEditor: Aktualisierte Dateisymbole im Navigator. Neue, einfachere Metaphern werden sie verständlicher machen.
  13. Tester: Es wurde ein Fehler behoben, der dazu führte, dass der Eingabe-String-Parameter abgeschnitten wurde, wenn er das Zeichen „|“ enthielt.
  14. Behoben wurde ein Fehler in den Absturzprotokollen.

MetaTrader 5 Web Terminal Build 3620

  1. Es wurden vorbereitete Farbvorlagen für die Webterminal-Schnittstelle hinzugefügt. Die Vorlagen wirken sich auf die Anzeige der Balken und Linien im Chart sowie auf die Preise im Market Watch und in der Kontodarstellung aus. Unser Designteam hat auf der Grundlage Ihrer Vorschläge und traditioneller Farbkombinationen Farbvorlagen vorbereitet.


    Neue Webterminal-Farbvorlagen


  2. Das Fenster für die Spezifikation von Symbolen wurde neu gestaltet. Die Daten der Handelsinstrumente wurden zur besseren Übersichtlichkeit in logische Blöcke gegliedert.


    Aktualisiertes Fenster für die Spezifikation von Handelsinstrumenten


  3. Das Eröffnen von Echtgeldkonten über das Webterminal wurde korrigiert. Der Server konnte nach dem Ausfüllen eines Registrierungsformulars einen Fehler zurückgeben.
  4. Ein Fehler im Handelsdialog wurde behoben. Wenn der Nutzer eine Position durch Drücken der X-Taste im Toolbox-Fenster schloss, während der Dialog zur Positionsänderung geöffnet war, wurde der Inhalt des Dialogs nicht zurückgesetzt. Nach der Aktualisierung wird der Dialog in diesem Fall automatisch auf einen neuen Modus für die Auftragserteilung zurückgesetzt.
  5. Die Anzeige des Feldes „Server“ im Kontoverwaltungsdialog wurde korrigiert.
  6. Die Anzeige des aktuellen Zeitrahmens in der Symbolleiste wurde korrigiert.
  7. Die Anzeige der Volumina in Bezug auf die Einheiten des Basiswerts im Handelsdialog wurde korrigiert.
  8. Die Änderung der Stop-Loss- und Take-Profit-Ebenen wurde korrigiert. Die Änderung eines der Werte kann unter bestimmten Bedingungen den zweiten Wert zurücksetzen.
  9. Die Anzeige von Warnungen vor Investitionsrisiken wurde korrigiert.

Die Aktualisierung wird über das Live-Update-System verfügbar sein.

 

Ich sehe heute morgen etwas merkwürdige Nachrichten vom Terminal:

  1. 6:29: New version (3601) available)
  2. 6:30 download von mt5w64 , mt5wide64 , mt5wst64
  3. 7:42 Check for beta version
            you are using the latest version
  4. The version check shows build 3588 is running

Irgendwie widersprechen sich alle Nachrichten zusammen genommen?

Hier könnte man noch etwas verbessern ;)

Außerdem, immer wenn ich auf "Hilfe" => "Über" klicke erscheint das Schild mit der Version (ohne Hinweis, ob beta oder release) und/aber im Journal wird gleichzeitig ausgedruckt:

2023.03.04 08:16:14.970 LiveUpdate      check for release version
2023.03.04 08:16:15.119 LiveUpdate      you are using the latest version

Es läuft aber die Beta-Version :(

 

Man könnte auch mal endlich diesen Fehler beheben. Der ist schon ewig drin.

Das selbe Menü     Deals Trades ....was denn nun ?


 

Ich (B.3621, Win 10) habe im Zuge einer EA-Entwicklung immer wieder den Debugger (EurUsd,...) gestartet und das hat jedes Mal auch im Terminal ein neues Chart-Fenster aufgemacht.

Statt alle jetzt einzeln anwählen und dann mit Ctrl+F4  löschen zu müssen, dachte ich ich klicke einfach auf das vorher gesicherte Profil des Terminals (ohne die Charts durch den Debugger) und alls überzähligen Chart würden verschwinden - aber nein, nix passiert :(

Es wäre schön, wenn das Terminal auch so auf ein Profil reagieren würde.