Neues MetaTrader 5 Build 1485: zusätzliche Testmodi und Charts in der Standardbibliothek

Die Reihenfolge der Anzeige von Eintragungen im Journal des Terminals und MetaEditors geändert

24 November 2016

Terminal

  1. Die Reihenfolge der Anzeige von Eintragungen im Journal des Terminals und MetaEditors geändert. Früher wurden am Anfang des Journals die neuesten Einträge angezeigt, und jetzt - die ältesten. Die umgekehrte Reihenfolge ist beim Lesen des Journals geläufiger und benutzerfreundlicher.



    Darüber hinaus kann man jetzt die Spalten "Zeit" und "Quelle" über das Kontextmenü ausblenden.

  2. Im Hedging-Modus wird nun das Ticket einer geschlossenen Position für Orders und Geschäfte in der Handelshistorie angezeigt. Dies erleichtert die Suche nach zusammenhängende Eröffnungs- und Schlusstransaktionen.



  3. Es wurde ein Fehler behoben, der zum Kopieren von SL/TP Ebenen aus einer vorhandenen Position in eine neue Position auf dem gleichen Symbol führte. Der Fehler trat bei der Verwendung von Funktionen des Ein-Klick-Handels (z.B., Panel auf dem Chart, Marktübersicht-Fenster) im Hedging-Modus auf.
  4. Die Anzeige von Objekten "Pfeile" wurde auf Bildschirmen mir hoher Auflösung korrigiert (4К).

MQL5

  1. Es wurde die Funktion ArrayPrint für die Ausgabe von Arrays einfacher Typen und Strukturen ins Journal hinzugefügt.
    void  ArrayPrint(
       const void&   array[],             // Output Array
       uint          digits=_Digits,      // Anzahl von Dezimalstellen nach dem Komma
       const string  separator=NULL,      // Trennzeichen zwischen den Werten der Felder einer Struktur
       ulong         start=0,             // Index des ersten ausgegebenen Elements
       ulong         count=WHOLE_ARRAY,   // Anzahl der ausgegebenen Elemente
       ulong         flags=ARRAYPRINT_HEADER|ARRAYPRINT_INDEX|ARRAYPRINT_LIMIT|ARRAYPRINT_ALIGN    
       );
    ArrayPrint gibt nicht alle Felder eines Struktur-Arrays im Journal aus – Felder-Arrays und Pointer-Arrays von Objekten werden ausgelassen. Für die Ausgabe aller Felder einer solcher Struktur wird eine eigene Funktion mit der gewünschten Formatierung benötigt..
    //--- ibt die Werte der letzten zehn Balken aus 
       MqlRates rates[];
       if(CopyRates(_Symbol,_Period,1,10,rates))
         {
          ArrayPrint(rates);
          Print("Überprüfung\n[time]\t[open]\t[high]\t[low]\t[close]\t[tick_volume]\t[spread]\t[real_volume]");
          for(int i=0;i<10;i++)
            {
             PrintFormat("[%d]\t%s\t%G\t%G\t%G\t%G\t%G\t%G\t%I64d\t",i,
             TimeToString(rates[i].time,TIME_DATE|TIME_MINUTES|TIME_SECONDS),
             rates[i].open,rates[i].high,rates[i].low,rates[i].close,
             rates[i].tick_volume,rates[i].spread,rates[i].real_volume);
            }
         }
       else
          PrintFormat("CopyRates failed, error code=%d",GetLastError());
    //--- Beispiel für den Output
    /*
                        [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
       [0] 2016.11.09 04:00:00 1.11242 1.12314 1.11187 1.12295         18110       10   17300175000
       [1] 2016.11.09 05:00:00 1.12296 1.12825 1.11930 1.12747         17829        9   15632176000
       [2] 2016.11.09 06:00:00 1.12747 1.12991 1.12586 1.12744         13458       10    9593492000
       [3] 2016.11.09 07:00:00 1.12743 1.12763 1.11988 1.12194         15362        9   12352245000
       [4] 2016.11.09 08:00:00 1.12194 1.12262 1.11058 1.11172         16833        9   12961333000
       [5] 2016.11.09 09:00:00 1.11173 1.11348 1.10803 1.11052         15933        8   10720384000
       [6] 2016.11.09 10:00:00 1.11052 1.11065 1.10289 1.10528         11888        9    8084811000
       [7] 2016.11.09 11:00:00 1.10512 1.11041 1.10472 1.10915          7284       10    5087113000
       [8] 2016.11.09 12:00:00 1.10915 1.11079 1.10892 1.10904          8710        9    6769629000
       [9] 2016.11.09 13:00:00 1.10904 1.10913 1.10223 1.10263          8956        7    7192138000
       Überprüfung
       [time] [open] [high] [low] [close] [tick_volume] [spread] [real_volume]
       [0] 2016.11.09 04:00:00 1.11242 1.12314 1.11187 1.12295 18110 10 17300175000 
       [1] 2016.11.09 05:00:00 1.12296 1.12825 1.1193 1.12747 17829 9 15632176000 
       [2] 2016.11.09 06:00:00 1.12747 1.12991 1.12586 1.12744 13458 10 9593492000 
       [3] 2016.11.09 07:00:00 1.12743 1.12763 1.11988 1.12194 15362 9 12352245000 
       [4] 2016.11.09 08:00:00 1.12194 1.12262 1.11058 1.11172 16833 9 12961333000 
       [5] 2016.11.09 09:00:00 1.11173 1.11348 1.10803 1.11052 15933 8 10720384000 
       [6] 2016.11.09 10:00:00 1.11052 1.11065 1.10289 1.10528 11888 9 8084811000 
       [7] 2016.11.09 11:00:00 1.10512 1.11041 1.10472 1.10915 7284 10 5087113000 
       [8] 2016.11.09 12:00:00 1.10915 1.11079 1.10892 1.10904 8710 9 6769629000 
       [9] 2016.11.09 13:00:00 1.10904 1.10913 1.10223 1.10263 8956 7 7192138000 
    */

  2. Es wurde ein Fehler in der Addition von Zeilen vom Typ S1=S2+S1 behoben.
  3. Das Verhalten der Funktion ArrayResize wurde geändert. Bei der Übergabe des Wertes -1 als reserve_size Parameter macht die Funktion den unbenutzten (reservierten) Speicher frei, wenn die Array-Größe dabei nicht erhöht wird. Die Setzung der neuen Array-Größe auf 0 mit dem Wert reserve_size=-1 ist gleich dem Aufruf von ArrayFree. Das neue Verhalten lässt die Verwendung des Speichers in MQL5-Programmen optimieren.
    void OnStart()
      {
       int arr[];
    //--- wie viel Speicherplatz ursprünglich verwendet wurde 
       Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB");
    //--- wie viel Speicherplatz für das Array mit der Größe 1 verwendet wurde, aber mit Reserve
       ArrayResize(arr,1,1024*1024);
       Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB");
    //--- nach der Vergrößerung des Arrays wird der Speicherplatz dank der Reserve nicht geändert
       ArrayResize(arr,1024*512,1024*1024);
       Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB");
    //--- nach der Reduzierung des Arrays verändert sich die Speichergröße nicht
       ArrayResize(arr,1);
       Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB");
    //--- der vom Array nicht genutzte Speicherplatz wird durch das Löschen der Reserve frei
       ArrayResize(arr,1,-1);
       Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB");
      }

  4. Der Standardbibliothek wurden Funktionen für das Zeichnen von Charts hinzugefügt. Um diese zu nutzen, fügen Sie die Datei MQL5\Include\Graphics\Graphic.mqh in Ihr Projekt hinzu.
    Zeichnen eines Charts aus 3 Datenreihen mithilfe von GraphPlot:
    #include <Graphics/Graphic.mqh>
    
    double Func1(double x) { return MathPow(x,2); }
    double Func2(double x) { return MathPow(x,3); }
    double Func3(double x) { return MathPow(x,4); }
    
    void OnStart()
      {
       GraphPlot(Func1,Func2,Func3,-2,2,0.05,CURVE_LINES);
      }
    
    Das Ergebnis:


    Zeichnen eines Charts basierend auf einem Datenarray mithilfe von GraphPlot:
    #include <Math/Stat/Binomial.mqh>
    #include <Graphics/Graphic.mqh>
    
    void OnStart(void)
      {
       double    vars[101];
       double    results[101];
       const int N=2000;
    //---  
       MathSequence(0,N,20,vars);
       MathProbabilityDensityBinomial(vars,N,M_PI/10,true,results);
       ArrayPrint(results,4);
       GraphPlot(results);
    //---
      }
    Das Ergebnis:



  5. Die Funktionen für das Arbeiten mit mathematischer Statistik in der Standardbibliothek wurden aktualisiert. Es wurde eine große Überprüfung der Qualität und Genauigkeit aller Funktionen sowohl in der MQL5-Version, als auch in der Ausgangssprache R durchgeführt. Für die Kontrolle der Genauigkeit und der Geschwindigkeit werden zusammen mit der statischen Bibliothek Unit-Test verteilt. Diese sind im Verzeichnis \MQL5\Scripts\UnitTests\Stat verfügbar.

    • TestStat.mq5 — Testskript für die Überprüfung von Berechnungsergebnissen
    • TestPrecision.mq5 — testet die Genauigkeit von Berechnungen
    • TestBenchmark.mq5 — Test mit der Leistungsmessung

Tester

  1. Die Einstellungen der Verzögerung bei der Ausführung von Handelsaufträgen wurden beim Testen erweitert. Nun kann man einen Handelsroboter unter noch vielfältigeren Bedingungen testen: von einem idealen Fall ohne Verzögerungen bis zu einer beliebigen Verzögerung, gesetzt vom Nutzer.


    Früher war nur der Modus zufälliger Verzögerungen verfügbar.

  2. Es wurde der Fehler der Generierung des Tickvolumens von Balken beim Testen im Modus OHLC M1 behoben.
  3. ]Die Eintragung der Eröffnungszeit von Ordern und Positionen wurde genau bis auf Millisekunden beim Handel im Hedging-Modus korrigiert.
  4. Es wurde der Fehler "old tick" (Tick veraltet) behoben, der bei Mehrwährungstests oder Multitimeframe-Tests im Modus anhand echter Ticks auftrat.
  5. Die Funktion CopyTicks wurde beschleunigt, wenn die abgefragten Ticks aus einer Datenbank auf einer Platte gelesen werden.

MetaEditor

  1. Dem Datei-Kontextmenü im Navigator und der Toolbox wurden Befehle für das Arbeiten mit dem MQL5 Storage hinzugefügt.



  2. Es wurde ein Fehler behoben, der zur Beeinträchtigung der Integrität der lokalen Datenbank von MQL5 Storage bei der Arbeit mit mehr als 1024 Dateien im Repositorium führte.
  3. Es wurden Fehler bei der Anzeige von Daten des Profilings in Quellcode-Dateien behoben.
  4. Die Anzeige von Alerts wurde im Preischart korrigiert.

Die Dokumentation wurde aktualisiert.