Was ist neu im MetaTrader 5

Die Aktualisierungen der Plattformen für den Desktop, Mobile und Web

21 Februar 2019
MetaTrader 5 Plattform Build 2005: Wirtschaftskalender, MQL5-Programme als Dienste und eine API für die Sprache R

Terminal

  1. Komplett überarbeiteter, integrierter Wirtschaftskalender.

    Der Wirtschaftskalender ist unsere eigene Lösung. Er bietet Ihnen über 600 Finanznachrichten und Indikatoren der 13 größten Volkswirtschaften der Welt: USA, Europäische Union, Japan, Großbritannien, Kanada, Australien, China unter andere. Die relevanten Daten werden aus offenen Quellen in Echtzeit erhoben.

    Die neue Version bietet aktualisierte Inhalte und erweiterte Ereignisfilter: nach Zeit, Priorität, Währungen und Ländern.

    Die Daten des Kalenders können jetzt aus MQL5 Programmen abgerufen werden. Bitte sehen Sie weiter unten die Details.




  2. Es gibt eine neue Art von MQL5-Anwendungen — Dienste. Dieser neue Typ ermöglicht die Erstellung von benutzerdefinierten Preisfeeds für das Terminal, d.h. die Integration von Preisen aus externen Systemen in Echtzeit, genau so wie sie auf den Handelsservern der Makler implementiert sind.

    Im Gegensatz zu Expert Advisors, Indikatoren und Skripten sind Dienste nicht an ein bestimmten Chart gebunden. Solche Anwendungen laufen im Hintergrund und werden beim Start des Terminals automatisch gestartet (es sei denn, eine solche Anwendung wurde erzwungenermaßen gestoppt).

    Dienste können von einem neuen Abschnitt im Navigatorfenster aus verwaltet werden:





    So erstellen Sie die Dienste
    Um die Vorlage eines Dienstes zu erstellen, verwenden Sie die entsprechende Option des MQL5 Assistenten. Die Dienste haben einen Einstiegspunkt Onstart, ähnlich wie Skripte. Hier können Sie eine endlose Datenempfangs- und -bearbeitungsschleife mit Netzwerkfunktionen implementieren.

    So starten Sie die Dienste
    Um mehrere Kopien von Expert Advisors oder Indikatoren mit unterschiedlichen Parametern auszuführen, müssen diese auf verschiedenen Charts gestartet werden. In diesem Fall werden verschiedene Programminstanzen erstellt, die dann unabhängig voneinander arbeiten. Die Dienste sind nicht an einen Chart gebunden, daher wurde ein spezieller Mechanismus für das Erstellen einer Instanz eines Dienstes implementiert.

    Wählen Sie einen Dienst im Navigator aus und klicken Sie in dessen Kontextmenü auf "Dienst hinzufügen". Dies öffnet einen standardmäßigen MQL5-Programmdialog, in dem Sie den Handel und den Zugriff auf Signale aktivieren/deaktivieren sowie die Parameter einstellen können.




    Die Instanz eines Dienstes kann über ein entsprechendes Menü gestartet und gestoppt werden. Um alle Instanzen zu verwalten, verwenden Sie das Menü der Dienste.

  3. Ein Lernprogramm wurde implementiert.

    Die neuen Merkmale helfen Anfängern dabei zu lernen, was man mit der Plattform alles machen kann. Wir haben über 100 interaktive Tipps zu den wichtigsten Funktionen der Plattform hinzugefügt.

    • Tipps werden nahtlos als Fortschrittsbalken auf der Symbolleiste angezeigt und lenken den Benutzer nicht ab.
    • Tipps erscheinen nur für die Aktionen, die Sie noch nie auf der Plattform durchgeführt haben.
    • Alle Tipps enthalten interaktive Links, über die Sie zu den relevanten Elementen der Schnittstelle navigieren können. So kann beispielsweise ein Handelsdialog oder ein Menü mit dem gewünschten Programm direkt vom Tipp aus gestartet werden.

    Der ausgefüllte Bereich des Fortschrittsbalkens erhöht sich, wenn Sie geeignete Aktionen durchführen und das Training fortsetzen.




  4. Die Handelskontenhistorie kann als Positionen dargestellt werden. Die Plattform sammelt Daten über die Transaktionen (Deals), die sich auf die Position beziehen (Eröffnung, Volumenzunahme, teilweises oder vollständiges Schließen) und gruppiert die Informationen in einem einzigen Datensatz. So können Sie auf Positionsdetails zugreifen: Zeit der Eröffnung und des Schließens, Volumen, Preis und Ergebnis. Diese effiziente Präsentationsform steht nun in Berichten der Historie zur Verfügung, die in Dateien exportiert werden.




  5. Hinzugefügt wurde ein neues API, das das Abrufen MetaTrader 5 Terminaldaten durch Anwendungen ermöglicht, die die Sprache R verwenden.

    Wir haben ein spezielles Paket für MetaTrader vorbereitet. Es enthält eine DLL, für die Interaktion zwischen R und dem MetaTrader 5 Terminal, inkl. Dokumentation und Hilfsdateien. Wir schließen die Paketregistrierung im CRAN Repository ab, danach wird es zum Download und zur Installation zur Verfügung stehen.




    Das Paket kann mit einem speziellen Befehl installiert werden:
    R CMD INSTALL --build MetaTrader

    Die folgenden Befehle zur Datenanforderung sind verfügbar:

    • MT5Initialize initialisiert und stellt die Verbindung mit dem MetaTrader 5 Terminal her. Bei Bedarf wird das Terminal während der Befehlsausführung gestartet.
    • MT5Shutdown deinstalliert und trennt die Verbindung vom MetaTrader 5.
    • MT5Version ruft die Terminalversion MetaTrader 5 ab.
    • MT5TerminalInfo ruft den Status und die Parameter der Terminalverbindung zum Server eines Brokers ab (Kontonummer und Serveradresse).
    • MT5WaitTerminal wartet auf das MetaTrader 5 Terminal, um sich mit dem Server eines Brokers zu verbinden.
    • MT5CopyTicksFrom(symbol, from, count, flags) kopiert die angegebene Anzahl von Ticks ab dem angegebenen Datum. Der Zeitpunkt wird in Millisekunden seit 01.01.1970 angegeben.
    • MT5CopyTicksRange(Symbol, from, to, flags) kopiert Ticks aus dem angegebenen Zeitraum. Die Zeitpunkte werden seit 01.01.1970 in Millisekunden angegeben.
    • MT5CopyRatesFrom(Symbol, timeframe, from, count) kopiert die angegebene Anzahl von Ein-Minuten-Balken ab dem angegebenen Datum. Der Zeitpunkt wird in Sekunden seit dem 01.01.1970 angegeben.
    • MT5CopyRatesFromPos(symbol, timeframe, start_pos, count) kopiert Ein-Minuten-Balken von der angegebenen Position relativ zum letzten Balken.
    • MT5CopyRatesFromRange(Symbol, timeframe, date_from, date_to) kopiert die entsprechenden Balken des angegebenen Zeitraums. Der Zeitpunkt wird in Sekunden seit dem 01.01.1970 angegeben.

    Die Liste der unterstützten Befehle wird weiter ergänzt.

  6. Optimierter Dialog Close By zum Schließen einer Position durch eine entgegengesetzte Position. Nun wird der Dialog auch bei einer großen Anzahl von offenen Positionen nicht verlangsamt.
  7. Behoben wurde ein Berechnungsfehler bei synthetischen Symbolen, aufgrund dessen Daten gelegentlich übersprungen werden konnten.
  8. Wenn ein nutzerdefiniertes Symbol gelöscht wird, werden nun auch Dateien mit der Historie der Ticks und Balken gelöscht. Dadurch wird das Aufhäufen ungenutzter Daten auf der Festplatte vermieden.
  9. Korrigiert wurde die Darstellung der Suchergebnisse auf Bildschirmen mit hoher DPI-Auflösung.

MQL5

  1. Integrierter Zugriff auf die Daten des Wirtschaftskalenders aus MQL5-Programmen.

    Neue Funktionen

    CalendarCountryById — Anrufen der Länderbeschreibung auf Grund des Identifikators.
    bool CalendarCountryById(
       const long           country_id,    // Länder-ID
       MqlCalendarCountry&  country        // Länderbeschreibung
       );
    
    CalendarEventById — Abrufen der Ereignisbeschreibung auf Grund des Identifikators.
    bool CalendarEventById(
       const long           event_id,      // Ereignis-ID
       MqlCalendarEvent&    event          // Ereignisbeschreibung
       );
    
    CalendarValueById — Abrufen der Wertbeschreibung des Ereignisses auf Grund des Identifikators.
    bool CalendarValueById(
       const long           value_id,      // Werte-ID
       MqlCalendarValue&    value          // Wertbeschreibung
       );
    
    CalendarEventByCountry — Abrufen eines Arrays der verfügbaren Ereignisse eines Landes.
    bool CalendarEventByCountry(
       string               country_code,  // Länder-Code
       MqlCalendarEvent&    events[]       // Array der Ereignisse
       );
    
    CalendarEventByCurrency — Abrufen eines Arrays der verfügbaren Ereignisse, die eine Währung beeinflussen.
    bool CalendarEventByCurrency(
       string               currency,      // Währung
       MqlCalendarEvent&    events[]       // Array der Ereignisse
       );
    
    CalendarValueHistoryByEvent — Abrufen eines Arrays mit den Werten einer angegebenen Zeitspanne, nach dem Ereignis-Identifikator.
    bool CalendarValueHistoryByEvent(
       ulong                event_id,      // Ereignis-ID
       MqlCalendarValue&    values[],      // Array der Werte
       datetime             datetime_from, // Anfangszeitpunkt der Zeitspanne
       datetime             datetime_to=0  // Endzeitpunkt der Zeitspanne
       );
    
    CalendarValueHistory — Abrufen eines Arrays von Werten der angegebenen Zeitspanne mit allen Ereignissen, gefiltert nach Land und/oder Währung.
    bool CalendarValueHistory(
       MqlCalendarValue&    values[],          // Array der Werte
       datetime             datetime_from,     // Anfangszeitpunkt der Zeitspanne
       datetime             datetime_to=0,     // Endzeitpunkt der Zeitspanne
       string               country_code=NULL, // Länder-Code
       string               currency=NULL      // Währung
       );
    
    CalendarValueLastByEvent — Abrufen eines Array der letzten Ereigniswerte nach Identifikator. Diese Funktion ermöglicht das Abrufen der Werte, die seit der letzten Anforderung erschienen sind. Für diesen Vorgang wird zusätzlich der In/Out-Parameter "change_id" verwendet.

    Bei jeder Änderung der Kalenderdatenbank wird die Eigenschaft "change_id" (die letzte Änderungskennung) aktualisiert. Bei der Datenanfrage geben Sie "change_id" an und das Terminal gibt Ereignisse zurück, die nach dieser Zeit aufgetreten sind, sowie den aktuellen Wert "change_id", der für die nächste Anfrage verwendet werden kann. Geben Sie beim ersten Funktionsaufruf für "change_id" Null an: Die Funktion gibt keine Ereignisse zurück, sondern die aktuelle "change_id" für weitere Anfragen.
    bool CalendarValueHistory(
       ulong                event_id,          // Ereignis-ID
       ulong&               change_id,         // letzte Änderungs-ID des Kalenders
       MqlCalendarValue&    values[]           // Array der Werte
       );
    
    CalendarValueLast — Abrufen eines Arrays der letzten Werte aller Ereignisse, gefiltert nach Land und/oder Währung. Diese Funktion ermöglicht das Abrufen der Werte, die seit der letzten Anforderung erschienen sind. Ähnlich wie bei CalendarValueLastByEvent wird die Eigenschaft "change_id" für die Anforderung verwendet.
    bool CalendarValueHistory(
       ulong                event_id,          // Ereignis-ID
       ulong&               change_id,         // letzte Änderungs-ID des Kalenders
       MqlCalendarValue&    values[],          // Array der Werte
       string               country_code=NULL, // Länder-Code
       string currency=NULL                    // Währung
       );
    

    Neue Strukturen

    MqlCalendarCountry — Beschreibung der Länder.
    struct MqlCalendarCountry
      {
       ulong             id;                        // Länder-ID in ISO 3166-1
       string            name;                      // Text-Name des Landes
       string            code;                      // Code-Name des Landes in ISO 3166-1 alpha-2
       string            currency;                  // Währungscode des Landes
       string            currency_symbol;           // Symbol/Zeichen der Landeswährung
       string            url_name;                  // Ländername, der in der URL von mql5.com verwendet wird
      };
    
    MqlCalendarEvent — Ereignisbeschreibung
    struct MqlCalendarEvent
      {
       ulong                          id;           // Ereignis-ID
       ENUM_CALENDAR_EVENT_TYPE       type;         // Ereignis-Typ
       ENUM_CALENDAR_EVENT_SECTOR     sector;       // Sektor, zu dem das Ereignis gehört
       ENUM_CALENDAR_EVENT_FREQUENCY  frequency;    // Häufigkeit der Ereignisveröffentlichung
       ENUM_CALENDAR_EVENT_TIMEMODE   time_mode;    // Zeitmodus der Ereignisveröffentlichung
       ulong                          country_id;   // Länder-ID
       ENUM_CALENDAR_EVENT_UNIT       unit;         // Einheit der Ereigniswerte
       ENUM_CALENDAR_EVENT_IMPORTANCE importance;   // Wichtigkeit des Ereignisses
       ENUM_CALENDAR_EVENT_MULTIPLIER multiplier;   // Multiplikator der Wichtigkeit des Ereignisses
       uint                           digits;       // Dezimalstellen des Ereigniswertes
       string                         source_url;   // URL der Quelle
       string                         event_code;   // Ereignis-Code
       string                         name;         // Text-Name des Ereignisses in der Sprache des Terminals
      };
    
    MqlCalendarValue — Wertbeschreibung des Ereignisses.
    struct MqlCalendarValue
      {
       ulong             id;                        // Werte-ID
       ulong             event_id;                  // Ereignis-ID
       datetime          time;                      // Datum und Zeit des Ereignisses
       datetime          period;                    // Zeitperiode, für den das Ereignis veröffentlicht wird
       int               revision;                  // Revision des veröffentlichten Indikators in Relation zur Berichtsperiode
       long              actual_value;              // aktueller Ereigniswert
       long              prev_value;                // vorheriger Ereigniswert
       long              revised_prev_value;        // revidierter, vorheriger Ereigniswert
       long              forecast_value;            // prognostizierter Ereigniswert
       ENUM_CALENDAR_EVENT_IMPACRT impact_type;     // mögliche Auswirkung auf den Währungskurs
      };
    

    Neue Enumerationen

    enum ENUM_CALENDAR_EVENT_FREQUENCY
      {
       CALENDAR_FREQUENCY_NONE            =0,   // nicht bekannt
       CALENDAR_FREQUENCY_WEEK            =1,   // wöchentlich
       CALENDAR_FREQUENCY_MONTH           =2,   // monatlich
       CALENDAR_FREQUENCY_QUARTER         =3,   // vierteljährlich
       CALENDAR_FREQUENCY_YEAR            =4,   // jährlich
       CALENDAR_FREQUENCY_DAY             =5,   // täglich
      };
    
    enum ENUM_CALENDAR_EVENT_TYPE
      {
       CALENDAR_TYPE_EVENT                =0,   // Ereignis (Sitzung, Rede etc.)
       CALENDAR_TYPE_INDICATOR            =1,   // Indikator
       CALENDAR_TYPE_HOLIDAY              =2,   // Feiertag
      };
    
    enum ENUM_CALENDAR_EVENT_SECTOR
      {
       CALENDAR_SECTOR_NONE               =0,   // kein Sektor bestimmt
       CALENDAR_SECTOR_MARKET             =1,   // Markt
       CALENDAR_SECTOR_GDP                =2,   // BIP
       CALENDAR_SECTOR_JOBS               =3,   // Arbeitsstellen
       CALENDAR_SECTOR_PRICES             =4,   // Preise
       CALENDAR_SECTOR_MONEY              =5,   // Geld
       CALENDAR_SECTOR_TRADE              =6,   // Handel
       CALENDAR_SECTOR_GOVERNMENT         =7,   // Regierung
       CALENDAR_SECTOR_BUSINESS           =8,   // Geschäft
       CALENDAR_SECTOR_CONSUMER           =9,   // Verbraucher
       CALENDAR_SECTOR_HOUSING            =10,  // Wohnen
       CALENDAR_SECTOR_TAXES              =11,  // Steuern
       CALENDAR_SECTOR_HOLIDAYS           =12,  // Feiertage
      };
      
    enum ENUM_CALENDAR_EVENT_IMPORTANCE
      {
       CALENDAR_IMPORTANCE_NONE           =0,   // nicht bestimmt
       CALENDAR_IMPORTANCE_LOW            =1,   // niedrig
       CALENDAR_IMPORTANCE_MODERATE       =2,   // mittel
       CALENDAR_IMPORTANCE_HIGH           =3,   // hoch
      };
    
    enum ENUM_CALENDAR_EVENT_UNIT
      {
       CALENDAR_UNIT_NONE                 =0,   // ohne Einheit
       CALENDAR_UNIT_PERCENT              =1,   // Prozent
       CALENDAR_UNIT_CURRENCY             =2,   // Landeswährung
       CALENDAR_UNIT_HOUR                 =3,   // Anzahl der Stunden
       CALENDAR_UNIT_JOB                  =4,   // Anzahl der Arbeitsstellen
       CALENDAR_UNIT_RIG                  =5,   // Anzahl der Förderanlagen
       CALENDAR_UNIT_USD                  =6,   // US-Dollar
       CALENDAR_UNIT_PEOPLE               =7,   // Anzahl der Leute
       CALENDAR_UNIT_MORTGAGE             =8,   // Anzahl der Hypotheken
       CALENDAR_UNIT_VOTE                 =9,   // Anzahl der Stimmen
       CALENDAR_UNIT_BARREL               =10,  // Anzahl der Barrels
       CALENDAR_UNIT_CUBICFEET            =11,  // Volumen in Kubikfuß
       CALENDAR_UNIT_POSITION             =12,  // Anzahl der Arbeitsstellen
       CALENDAR_UNIT_BUILDING             =13   // Anzahl der Gebäude
      };
      
    enum ENUM_CALENDAR_EVENT_MULTIPLIER
      {
       CALENDAR_MULTIPLIER_NONE           =0,   // kein Multiplikator
       CALENDAR_MULTIPLIER_THOUSANDS      =1,   // Tausend
       CALENDAR_MULTIPLIER_MILLIONS       =2,   // Million
       CALENDAR_MULTIPLIER_BILLIONS       =3,   // Milliarde
       CALENDAR_MULTIPLIER_TRILLIONS      =4,   // Billion
      };
      
    enum ENUM_CALENDAR_EVENT_IMPACRT
      {
       CALENDAR_IMPACT_NA                 =0,   // nicht vorhanden
       CALENDAR_IMPACT_POSITIVE           =1,   // positive
       CALENDAR_IMPACT_NEGATIVE           =2,   // negative
      };
    
    enum ENUM_CALENDAR_EVENT_TIMEMODE
      {
       CALENDAR_TIMEMODE_DATETIME         =0,   // die exakte Veröffentlichungszeit der Quelle
       CALENDAR_TIMEMODE_DATE             =1,   // Das Ereignis dauert den ganzen Tag
       CALENDAR_TIMEMODE_NOTIME           =2,   // die Quelle veröffentlicht keinen Ereigniszeitpunkt
       CALENDAR_TIMEMODE_TENTATIVE        =3,   // die Quelle veröffentlicht nur das Datum und keinen genauen Zeitpunkt der Veröffentlichung
      };
    

    Neue Fehlernummern

    ERR_CALENDAR_MORE_DATA             =5400,   // das Array ist für alle Ergebnisse zu klein (Werte, die hineinpassen, werden zurückgegeben)
    ERR_CALENDAR_TIMEOUT               =5401,   // Timeout für das Warten auf die Antwort der Kalenderdaten
    ERR_CALENDAR_NO_DATA               =5402,   // Daten nicht gefunden
    

  2. Korrekturen und Verbesserungen der Betriebsgeschwindigkeit in Bezug auf die Historie von Ticks und Balken.
  3. Korrekturen und signifikante Verbesserungen der Betriebsgeschwindigkeit im Zusammenhang mit Funktionen zur Änderung der Historie von Ticks und Balken von nutzerdefinierten Handelssymbolen, CustomTicks* und CustomRates*.
  4. Neue Funktionen zur Datenkonvertierung.

    CharArrayToStruct weist einen Array vom Typ uchar einer POD-Struktur zu.
    bool  CharArrayToStruct(
       void&         struct_object,    // Struktur
       const uchar&  char_array[],     // Array
       uint          start_pos=0       // Startposition im Array
       );
    
    StructToCharArray weist einer POD-Struktur einem Array vom Typ uchar zu.
    bool  StructToCharArray(
       const void&  struct_object,     // Struktur
       uchar&       char_array[],      // Array
       uint         start_pos=0        // Startposition im Array
       );
    

  5. Hinzugefügt wurde die Funktion MathSwap, mit der Reihung der Bytes von ushort, uint und ulong zu ändern.
    ushort MathSwap(ushort value);
    uint   MathSwap(uint   value);
    ulong  MathSwap(ulong  value);
    

  6. Hinzugefügt wurden Netzwerkfunktionen, um TCP-Verbindungen zu entfernten Hosts über System-Sockets herzustellen:

    • SocketCreate erstellt einen Socket mit angegebenen Flags und gibt dessen Handle zurück.
    • SocketClose schließt den Socket.
    • SocketConnect verbindet sich mit dem Server, inkl. einer Timeout-Steuerung.
    • SocketIsConnected prüft, ob der Socket aktuell verbunden ist.
    • SocketIsReadable ermittelt die Anzahl der Bytes, die aus dem Socket gelesen werden können.
    • SocketIsWritable prüft, ob das Schreiben von Daten auf diesen Socket zum aktuellen Zeitpunkt möglich ist.
    • SocketTimeouts setzt die Zeit eines Timeouts für den Empfang und das Senden von Daten für das Objekt eines System-Sockets.
    • SocketRead liest Daten von einem Socket.
    • SocketSend schreibt Daten in einen Socket.
    • SocketTlsHandshake initiiert eine sichere TLS (SSL) Verbindung mit dem angegebenen Host über das TLS-Handshake Protokoll.
    • SocketTlsCertificate erhält Informationen über das Zertifikat, das für die sichere Netzwerkverbindung verwendet wird.
    • SocketTlsRead liest Daten von einer sicheren TLS-Verbindung.
    • SocketTlsReadAvailable liest alle verfügbaren Daten von einer sicheren TLS-Verbindung.
    • SocketTlsSend sendet Daten über eine sichere TLS-Verbindung.

    Die Adresse des Hosts, zu dem die Verbindung über Netzwerkfunktionen hergestellt wird, muss in den Terminaleinstellungen explizit zur Liste der zulässigen Adressen hinzugefügt werden.

    Neue Fehlernummern wurden für die Arbeit mit den Netzwerkfunktionen hinzugefügt:

    • ERR_NETSOCKET_INVALIDHANDLE (5270): Ungültiges Socket-Handle an die Funktion übergeben.
    • ERR_NETSOCKET_TOO_MANY_OPENED (5271): Zu viele Sockets sind offen (maximal 128)
    • ERR_NETSOCKET_CANNOT_CONNECT (5272): Fehler bei der Verbindung zum entfernten Host
    • ERR_NETSOCKET_IO_ERROR (5273): Fehler beim Senden/Empfangen der Daten vom Socket
    • ERR_NETSOCKET_HANDSHAKE_FAILED (5274): Fehler beim sicheren Verbindungsaufbau (TLS-Handshake)
    • ERR_NETSOCKET_NO_CERTIFICATE (5275) — keine Daten über das Zertifikat für die sichere Verbindung

  7. Hinzugefügt wurden neue Funktionen für Zeichenkettenoperationen:

    StringReserve kehrt den Speicherpuffer der angegebenen Größe einer Zeichenkette um.
    bool  StringReserve(
       string&        string_var,          // Zeichenkette
       uint           new_capacity         // Puffergröße für die Zeichenkette
       );
    
    StringSetLength legt die Anzahl der Buchstaben einer Zeichenkette fest.
    bool  StringSetLength(
       string&        string_var,          // Zeichenkette
       uint           new_length           // neue Länge der Zeichenkette
       );
    

  8. Hinzugefügt wurden neue Funktionen für Arrays:

    ArrayRemove entfernt die angegebene Anzahl der Elemente aus dem Array ab dem angegebenen Index.
    bool  ArrayRemove(
       void&         array[],              // Array irgendeines Typs
       uint          start,                // Startindex für das Entfernen
       uint          count=WHOLE_ARRAY     // Anzahl der Elemente
       );
    
    ArrayInsert fügt in das Empfängerarray ab dem angegebenen Index eine bestimmte Anzahl von Elementen aus einem Quellarray ein.
    bool  ArrayInsert(
       void&         dst_array[],          // Zielarray
       const void&   src_array[],          // Quellarray
       uint          dst_start,            // Index des Zielarrays, ab dem eingefügt werden soll
       uint          src_start=0,          // Index im Quellarray, ab dem aus dem Quellarray kopiert werden soll
       uint          count=WHOLE_ARRAY     // Anzahl der einzufügenden Elemente
       );
    
    ArrayReverse kehrt in einem Array eine angegebene Anzahl von Elemente ab dem angegebenen Index um.
    bool  ArrayReverse(
       void&         array[],              // Array irgendeines Typs
       uint          start=0,              // Startindex der Umkehrung
       uint          count=WHOLE_ARRAY     // Anzahl der Elemente
       );
    

  9. Den Funktionen CustomRatesUpdate, CustomRatesReplace, CustomTicksAdd und CustomTicksReplace wurde der neue Parameter "uint count" hinzugefügt. Er ermöglicht die Angabe der Anzahl der Elemente des übergebenen Arrays, die von der Funktion verwendet werden sollen. Der Wert WHOLE_ARRAY wird standardmäßig für den Parameter verwendet. Das bedeutet, dass das gesamte Array verwendet wird.
  10. Hinzugefügt wurde die Funktion CustomBookAdd, um den Status der Markttiefe für ein benutzerdefiniertes Symbol zu übergeben. Die Funktion erlaubt die Übertragung der Markttiefe als ob die Preise vom Server des Brokers kommen.
    int  CustomBookAdd(
       const string        symbol,            // Symbolname
       const MqlBookInfo&  books[]            // Array der Beschreibungen der Elemente der Markttiefe (DOM)
       uint                count=WHOLE_ARRAY  // Anzahl der zu verwendenden Elemente
       );
    
  11. Hinzugefügt wurde Überladungen der Funktion CustomSymbolCreate. Dies ermöglicht das Erstellen eines benutzerdefinierten Handelssymbols, das auf einem bestehenden Symbol basiert. Nach dem Erstellen kann jede Symboleigenschaft mit entsprechenden Funktionen bearbeitet werden.
    bool  CustomSymbolCreate(
       const string        symbol_name,       // Name des nutzerdefiniertes Symbol
       const string        symbol_path="",    // Name der Gruppe, in der das Symbol erzeugt wird
       const string        symbol_origin=NULL // Symbolname, auf dessen Basis das nutzerdefinierte Symbole erstellt wird
       );
    
    Der Name des Symbols, dessen Eigenschaften für das nutzerdefinierte Symbol kopiert werden sollen, wird im Parameter "symbol_origin" angegeben.

  12. Die Funktion StringToTime, die die Zeichenkette mit Datum/Uhrzeit in einen Datumszeitwert umwandelt, wurde aktualisiert. Jetzt unterstützt sie folgenden Datumsformate:

    • yyyy.mm.dd [hh:mi]
    • yyyy.mm.dd [hh:mi:ss]
    • yyyymmdd [hh:mi:ss]
    • yyyymmdd [hhmiss]
    • yyyy/mm/dd [hh:mi:ss]
    • yyyy-mm-dd [hh:mi:ss]

  13. Neue Eigenschaften der TERMINAL_VPS in der Enumeration ENUM_TERMINAL_INFO_INTEGER; sie zeigt, dass das Terminal auf dem Server MetaTrader Virtual Hosting (MetaTrader VPS) läuft. Wenn eine Anwendung auf einem Hosting-Server läuft, können Sie alle ihre visuellen Funktionen deaktivieren, da der virtuelle Server keine grafische Benutzeroberfläche hat.
  14. Die neuen Eigenschafte SYMBOL_EXIST in der Enumeration ENUM_SYMBOL_INFO_INTEGER bedeutet, dass das Symbol mit diesem Namen gibt.
  15. Die Typisierung bei der Verwendung von vorab-deklarierten Template-Funktionen wurde korrigiert.
  16. Hinzugefügt wurde einer Neu-Initialisierung der Indikatoren beim Wechsel des Handelskontos.
  17. Optimierte StringSplit.
  18. Fehler in der Standardbibliothek behoben.

Tester

  1. Hinzugefügt wurde die Funktion TesterStop — routinemäßige frühzeitiges Beenden eines Expert Advisors auf einen Testagenten. Jetzt können Sie ein Testende erzwingen, nachdem eine angegebene Anzahl von Verlustpositionen, ein vorgegebener Drawdownwert oder anderes Kriterien erreicht wurde.

    Die mit dieser Funktion beendete Tests gelten als erfolgreich. Nach dem Funktionsaufruf wird die während des Tests erhaltene Handelshistorie und alle Handelsstatistiken an das Terminal übergeben.

  2. Deaktivierte wurde die Möglichkeit, Expert Advisors in der MQL5 Cloud Network im Modus anhand realer Ticks zu testen und zu optimieren. Dieser Modus kann nur von lokalen Agenten und lokalen Netzwerkfarmen verwendet werden.
  3. Verbesserte Arbeit mit Indikatoren bei der visuellen Prüfung. Jetzt werden Preisdiagramm und Indikatorlinien synchron gezeichnet, auch bei maximaler Visualisierungsgeschwindigkeit.
  4. Optimiertes und deutlich beschleunigtes Testen und Optimieren.
  5. Das Debugging von Indikatoren mit historischen Daten wurde korrigiert. Nun können die Funktionen OnInit und OnDeinit eines Indikators korrekt debuggt werden.
  6. Schnellerer Zugriff auf historische Daten beim Testen von Expert Advisors mit verschiedenen Währungen.
  7. Behoben wurde ein gelegentliches Einfrieren des visuellen Testers während des Debuggens mit historischen Daten.
  8. Schnellerer Start der Optimierungsläufe bei der Bearbeitung eines Aufgabenpakets durch einen Agenten.
  9. Die Richtlinie zur Verteilung von Aufgabenpaketen an die Testagenten wurde geändert. Die Paketgröße wurde erhöht und damit die Belastung des Netzwerkes deutlich reduziert.
  10. Das Verhalten der Optionen, die die Verwendung von lokalen, Netzwerk- und Cloud-Agenten ermöglichen, wurde geändert. Wenn Sie nun die Optionen ausschalten, wird die Bearbeitung der erhaltenen Aufgaben normal beendet, aber neuen Aufgaben werden nicht mehr erteilt. In früheren Versionen war das Verhalten ähnlich dem Befehl "Disable", der den Agentenbetrieb sofort beendete.




MetaEditor

  1. Hinzugefügt wurde die Unterstützung von Nicht-ANSI-Zeichen im Debugger. Jetzt werden die Ausdrücke korrekt angezeigt, auch wenn der Variablenname in Kyrillisch angegeben ist.
  2. Korrigiert wurde die Anzeige der Suchergebnisse auf Bildschirmen mit hoher DPI-Auflösung.

Die Übersetzung der Benutzeroberfläche ins Kroatische wurde hinzugefügt.

Die Dokumentation wurde aktualisiert.

26 Oktober 2018
Neue MetaTrader 5 Plattform build 1930: Schwebende Chartfenster und .Net Bibliotheken in MQL5

Terminal

  1. Jetzt können Sie die Charts der Finanzsymbole vom Fenster des Handelsterminals ablösen.

    Diese Funktion ist praktisch, wenn Sie mehrere Monitore verwenden. Jetzt können Sie das Hauptfenster der Plattform auf einem Monitor einstellen, um Ihren Kontostand zu kontrollieren, und Ihre Charts auf den zweiten Bildschirm verschieben, um die Marktsituation zu beobachten. Um ein Diagramm vom Terminal zu lösen, deaktivieren Sie die Option Docked in dessen Kontextmenü. Verschieben Sie anschließend das Diagramm auf den gewünschten Monitor.





    Eine separate Symbolleiste auf abgelösten Charts ermöglicht die Anwendung von analytischen Objekten und Indikatoren, ohne zwischen den Monitoren wechseln zu müssen. Verwenden Sie das Kontextmenü der Symbolleiste, um den Satz der verfügbaren Befehle zu managen oder auszublenden.

  2. Aktualisiert vollständig die integrierte Chats. Jetzt werden Gruppendialoge und Kanäle unterstützt. Führen Sie private Gespräche mit einer Gruppe von Personen in einer einheitlichen Umgebung, ohne zwischen verschiedenen Dialogen zu wechseln, und erstellen Sie Kanäle nach Ihren Interessen und Sprachen. Kommunizieren Sie mit Kollegen und Freunden der MQL5.community, ohne die Website zu besuchen.

    Gruppen-Chats und Kanäle können öffentlich oder privat sein. Derjenige, der sie erstellt entscheidet, ob es möglich ist, sich ihnen frei oder nur auf Einladung anzuschließen. Sie können Moderatoren auch Kanälen und Chats für zusätzliche Kommunikationskontrolle zuordnen.




  3. Ergänzt wurde die Unterstützung einer erhöhten Volumengenauigkeit beim Handel mit Kryptowährungen. Nun ist das Mindestvolumen der Handelsgeschäfte 0,000000000001 Lots. Die Markttiefe, die Zeit und der Umsatz sowie andere Oberflächenelemente bieten nun die Möglichkeit, Volumina mit einer Genauigkeit von 8 Dezimalstellen darzustellen.

    Das Mindestvolumen und dessen Änderungsstufen hängen von den Einstellungen des Finanzinstrumentes ab, die vom Broker festgelegt werden.




  4. Hinzugefügt wurde eine Registerkarte der veröffentlichten Artikel der MQL5.community zum Fenster Werkzeuge. Über 600 detailliertes Materialien über die Entwicklung von Handelsstrategien in MQL5 sind nun erreichbar ohne das Terminal verlassen zu müssen. Neue Artikel werden jede Woche veröffentlicht.




  5. Hinzugefügt wurde die Unterstützung einer erweiterten Authentifizierung mittels Zertifikat bei einem Betrieb auf Linux/Wine.
  6. Korrigiert wurde die Darstellung der Markttiefe, wenn sie auf eine Ebene begrenzt ist.
  7. Hinzugefügt wurde der Befehl "Sichern als Bild" zur Standard-Symbolleiste. Jetzt ist es viel einfacher, Charts zu fotografieren und in der Community zu teilen.




  8. Korrigiert wurde die Zeitverschiebung beim Importieren von Bars und Ticks. Bisher wurde die Verschiebung in einigen Fällen nicht angewendet.




  9. Korrigiert wurde das Einfrieren des Terminals im Falle einer großen Anzahl an Nachrichten im Wirtschaftskalender.

MQL5

  1. Hinzugefügt wurde die direkte Unterstützung für .NET-Bibliotheken mit "Smart"-Funktionen-Import. Jetzt können .NET-Bibliotheken verwendet werden, ohne spezielle Wrapper zu schreiben - der MetaEditor macht es jetzt selbst.

    Um mit .NET-Bibliotheksfunktionen zu arbeiten, importieren Sie einfach die DLL selbst, ohne bestimmte Funktionen zu definieren. MetaEditor importiert automatisch alle Funktionen, mit denen man arbeiten kann:
    • Einfache Strukturen (einfache, alte Daten oder POD, plain old data) — Strukturen, die nur einfache Datentypen beinhalten.
    • 'Public static' Funktionen mit Parametern, bei denen nur einfache Typen und POD-Strukturen oder deren Arrays verwendet werden.

    Um Funktionen aus der Bibliothek aufzurufen, importieren Sie sie einfach:
    #import "TestLib.dll"
    
    //+------------------------------------------------------------------+
    //| Startfunktion eines Skripts                                      |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       int x=41;
       TestClass::Inc(x);
       Print(x);
      }
    Der C#-Code der Funktion Inc() aus TestClass schaut wie folgt aus:
    public class TestClass
    {
       public static void Inc(ref int x)
       {
        x++;
       }
    }
    Als Ergebnis der Ausführung gibt das Skript den Wert 42 zurück.

    Die Arbeit an der Unterstützung der .NET Bibliotheken wird fortgesetzt. Deren Möglichkeiten werden in der Zukunft erweitert werden.

  2. Ergänzt wurde die Unterstützung der Funktionen der Standardbibliothek WinAPI. Jetzt muss nicht die Bibliothek nicht mehr manuell importiert werden und, für eine Verwendung der Funktionen des Betriebssystems, die Funktionssignatur im MQL5-Programm angeführt werden. Man muss einfach nur die Headerdatei aus dem Verzeichnis MQL5\Include\WinAPI einbinden.

    Die Funktionen sind in einzelnen Dateien entsprechend ihrer Verwendung gruppiert:

    • libloaderapi.mqh — Arbeit mit Ressourcen
    • memoryapi.mqh — Arbeit mit Speicher
    • processenv.mqh — Arbeit mit dem Arbeitsumfeld
    • processthreadsapi.mqh — Arbeit mit Prozessen
    • securitybaseapi.mqh — Arbeit mit dem Sicherheitssystem
    • sysinfoapi.mqh — Abfrage von Systeminformationen
    • winbase.mqh — Allgemeine Funktionen
    • windef.mqh — Konstante, Strukturen und Enumerationen
    • wingdi.mqh — Arbeit mit Grafikobjekten
    • winnt.mqh — Arbeit mit Sonderfällen (exceptions)
    • winreg.mqh — Arbeit mit der Registry
    • winuser.mqh — Arbeit mit Windows und der Schnittstelle
    • errhandlingapi.mqh — Fehlerbehandlung
    • fileapi.mqh — Arbeit mit Dateien
    • handleapi.mqh — Arbeit mit Handles
    • winapi.mqh — Einbinden aller Funktionen (WinAPI Headerdatei)

    Das Einbinden funktioniert nur auf einer 64-Bit-Architektur.

  3. Hinzugefügt wurde die Unterstützung der Spezifizierer inline, __inline und __forceinline beim Parsen von Code. Die Anwesenheit der Spezifizierer im Code verursacht keine Fehler und hat keinen Einfluss auf die Kompilierung. Im Moment vereinfacht diese Funktion die Übertragung von С++ Code nach MQL5.
    Weitere Informationen über Spezifizierer finden Sie unter MSDN.

  4. Deutlich optimierte Ausführung von MQL5-Programmen. In einigen Fällen kann die Leistungssteigerung 10% erreichen. Kompilieren Sie Ihre Programme mit der neuen MetaEditor-Version erneut, damit laufen sie schneller.
    Leider werden neue Programme aufgrund dieser zusätzlichen Optimierung nicht mit früheren Terminalversionen kompatibel sein. Programme, die in MetaEditor Version 1910 und später kompiliert wurden, können in Terminalversionen unter 1880 nicht gestartet werden. Programme, die in früheren MetaEditor-Versionen kompiliert wurden, können auf neuen Terminals ausgeführt werden.

  5. Signifikant optimierte multiple MQL5-Funktionen.
  6. Hinzugefügt wurden neue Eigenschaften zum Anheften/Ablösen der Charts vom Hauptfenster des Terminals und der Kontrolle von deren Position.

    Hinzugefügt wurden folgende Eigenschaften der Enumeration ENUM_CHART_PROPERTY_INTEGER:

    • CHART_IS_DOCKED - das Chartfenster ist angeheftet. Ist dessen Wert 'false', dann kann der Chart aus dem Terminalbereich abgelöst werden.
    • CHART_FLOAT_LEFT — die linke Koordinate des abgelösten Chartfensters, relativ zum virtuellen Bildschirm.
    • CHART_FLOAT_TOP — die obere Koordinate des abgelösten Chartfensters, relativ zum virtuellen Bildschirm.
    • CHART_FLOAT_RIGHT — die rechte Koordinate des abgelösten Chartfensters, relativ zum virtuellen Bildschirm.
    • CHART_FLOAT_BOTTOM — die untere Koordinate des abgelösten Chartfensters, relativ zum virtuellen Bildschirm.

    Hinzugefügt wurden folgende Funktionen zur Enumeration ENUM_TERMINAL_INFO_INTEGER:

    • TERMINAL_SCREEN_LEFT — die linke Koordinate des virtuellen Bildschirms. Ein virtueller Bildschirm ist ein Rechteck, der alle Monitore umfasst. Wenn ein System zwei Monitore hat, aufgereiht von rechts nach links, befindet sich die linke Koordinate des virtuellen Bildschirms möglicherweise an der Grenze der beiden Monitore.
    • TERMINAL_SCREEN_TOP — die obere Koordinate des virtuellen Bildschirms.
    • TERMINAL_SCREEN_WIDTH — Breite des Terminals.
    • TERMINAL_SCREEN_HEIGHT — Höhe des Terminals.
    • TERMINAL_LEFT — die linke Koordinate des Terminals relativ zum virtuellen Bildschirm.
    • TERMINAL_TOP — die obere Koordinate des Terminals relativ zum virtuellen Bildschirm.
    • TERMINAL_RIGHT — die rechte Koordinate des Terminals relativ zum virtuellen Bildschirm.
    • TERMINAL_BOTTOM — die untere Koordinate des Terminals relativ zum virtuellen Bildschirm.

  7. Hinzugefügt wurde das Feld 'volume_real' zu den Strukturen MqlTick und MqlBookInfo. Damit kann man jetzt mit einer erhöhten Genauigkeit des Volumens arbeiten. Der Wert von 'volume_real' hat eine höhere Priorität als 'volume'. Der Server wird diesen Wert verwenden, wenn angegeben.

    struct MqlTick
      {
       datetime         time;          // Aktualisierungszeit des letzten Preises
       double           bid;           // Aktueller Bid-Preis
       double           ask;           // Aktueller Ask-Preis
       double           last;          // Aktueller Preis der letzten Transaktion (Last)
       ulong            volume;        // Volumen des letzten aktuellen Preises
       long             time_msc;      // Letzte Preisaktualisierung in Millisekunden
       uint             flags;         // Tick-Flags
       double           volume_real;   // Volumen des aktuelle Preises (Last) mit höherer Genauigkeit
      };

    struct MqlBookInfo
      {
       ENUM_BOOK_TYPE   type;            // Order-Typ der Enumeration ENUM_BOOK_TYPE
       double           price;           // Preis
       long             volume;          // Volumen
       double           volume_real;     // Volumen mit höherer Genauigkeit
      };

  8. Hinzugefügt wurden neue Eigenschaften zur Enumeration ENUM_SYMBOL_INFO_DOUBLE:

    • SYMBOL_VOLUME_REAL — Volumen der letzten abgeschlossenen Transaktion;
    • SYMBOL_VOLUMEHIGH_REAL — der maximale Wert des Transaktionsvolumens des aktuellen Tags;
    • SYMBOL_VOLUMELOW_REAL — der minimale Wert des Transaktionsvolumens des aktuellen Tags.

    Verwenden Sie die Funktion SymbolInfoDouble zur Abfrage dieser Eigenschaften.

  9. Hinzugefügt wurde die Eigenschaft MQL_FORWARD zur Enumeration ENUM_MQL_INFO_INTEGER — Flag für das Programm im Vorwärtstest.
  10. Hinzugefügt wurde die Eigenschaft pack( integer_value ) für Strukturen. Das ermöglicht die Angleichung der Felder innerhalb einer Struktur einzurichten, was bei der Arbeit mit einer DLL erforderlich sein kann. Die Werte 1, 2 ,4 ,8 und 16 sind für integer_value
    möglich. Wenn die Eigenschaft nicht definiert ist, wird die Standardausrichtung von 1 Byte verwendet - pack(1).
    .
    Verwendungsbeispiel:
    //+------------------------------------------------------------------+
    //| Standard-Packing                                                 |
    //+------------------------------------------------------------------+
    struct A
      {
       char              a;
       int               b;
      };
    //+------------------------------------------------------------------+
    //| besonderes Packing                                               |
    //+------------------------------------------------------------------+
    struct B pack(4)
      {
       char              a;
       int               b;
      };
    //+------------------------------------------------------------------+
    //| Startfunktion eines Skripts                                      |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       Print("sizeof(A)=",sizeof(A));
       Print("sizeof(B)=",sizeof(B));
      }
    //+------------------------------------------------------------------+
    Ergebnis:
    sizeof(A)=5
    sizeof(B)=8
    Weiter Informationen über die Angleichung innerhalb von Strukturen in MSDN.

  11. Entspanntere Bedingungen für die Auswertung von Enumerationen. Bei einer impliziten Umwandlung ersetzt der Compiler automatisch den Wert der korrekten Enumeration und zeigt eine Warnung an.

    Für folgenden Code:
    enum Main
      {
       PRICE_CLOSE_,
       PRICE_OPEN_
      };
    
    input Main Inp=PRICE_CLOSE;
    //+------------------------------------------------------------------+
    //| Start function                                                   |
    //+------------------------------------------------------------------+
    void OnStart()
      {
      }
    zeigt der Compiler eine Warnung:
    implicit conversion from 'enum ENUM_APPLIED_PRICE' to 'enum Main'
    'Main::PRICE_OPEN_' instead of 'ENUM_APPLIED_PRICE::PRICE_CLOSE' will be used
    Zuvor wurde in diesem Fall der folgende Fehler erzeugt:
    'PRICE_CLOSE' - cannot convert enum
    Der Compiler zeigt den Fehler nur noch an, wenn Enumerationen in den Funktionsparametern falsch verwendet werden.

  12. Die Kompilierung von Template-Funktionen wurde korrigiert. Bei der Verwendung überladener Template-Funktionen wird nun nur noch die notwendige Überladung und nicht mehr alle vorhandenen instanziiert.
    class X {  };
    
    void f(int)  {  }
      
    template<typename T>
    void a(T*) { new T(2); }  // vorher hat der Compiler hier einen Fehler ausgeworfen
      
    template<typename T>
    void a()  { f(0); }
      
      
    void OnInit()  { a<X>(); }  

  13. Optimiert wurde in einigen Fällen der Zugriff auf die Tick-Historie mit den Funktionen CopyTicks*.
  14. Hinzugefügt wurde die neue Funktion TesterStop, die eine vorzeitige Beendigung der Durchläufe von Tests/Optimierungen erlaubt. Wird sie aufgerufen, wird die gesamte Handelsstatistik und die Ergebnisse von OnTester an das Handelsterminal übergeben, genau so, als wenn der Test/Optimierung ganz normal beendet worden wäre.
  15. Hinzugefügt wurde die neue Eigenschaft für nutzerdefinierte Indikatoren #property tester_everytick_calculate. Sie wird im Strategietester verwendet und erlaubt es, die Indikatorberechnung mit jedem Tick zu erzwingen.

Tester

  1. Jetzt, im Falle von nicht-visuellen Tests/Optimierungen, werden alle verwendeten Indikatoren (standardmäßige und nutzerdefinierte) nur während der Datenabfrage berechnet. Ausgenommen sind Indikatoren, die die Funktionsaufrufe EventChartCustom verwendet und eine Ereignisbehandlung durch OnTimer beinhaltet. Zuvor wurden alle Indikatoren bedingungslos im Strategietester bei jedem neuen Tick berechnet (auch von einigen anderen Instrumenten). Die neuen Eigenschaften beschleunigen deutlich die Tests und die Optimierungen.

    Um die mit jedem Tick erzwungene Indikatorberechnung zu aktivieren, fügen Sie Ihrem Programm #property tester_everytick_calculate hinzu.
    Indikatoren, die mit früheren Compilers kompiliert wurden werden wie bisher berechnet — bei jedem Tick.

  2. Korrigiert wurde die Berechnung der Genauigkeit der Kontowährung beim Testen/Optimieren und Erstellen relevanter Berichte.
  3. Optimiert und Beschleunigt wurde der Arbeitsweise des Strategietesters.
  4. Korrigiert wurden einige Fehler beim Testen und Optimieren.

MetaEditor

  1. Korrigiert wurde die Suche nach ganzen Wörtern. Bei der Suche wird nun der Unterstrich als normales Zeichen und nicht mehr als Worttrennzeichen gezählt.

Aktualisierte Dokumentation.

6 Juli 2018
MetaTrader 5 Build 1880: Berechnung der kompletten Historie synthetischer Finanzinstrumente

Terminal

  1. Es wurde die Berechnung der Preis-Historie synthetischer Finanzinstrumente für die ganze verfügbare Datentiefe hinzugefügt.

    Für synthetische Finanzinstrumente berechnet die Plattform die Historie von Minutenbalken basierend auf Minutenbalken der Symbole in der Formel. Früher wurde die Historie nur für die letzten zwei Monate berechnet. Eine tiefere Historie konnte nur auf eine explizite Anfrage erstellt werden (Chart nach links scrollen oder Copy-Funktionen aufrufen). Jetzt wird die Historie basierend auf allen verfügbaren Daten bedingungslos berechnet.




    Die Preis-Historie jedes Finanzinstruments in der Formel kann unterschiedlich tief sein. Aus diesem Grund wird für den kürzesten verfügbaren Zeitraum berechnet. In der Formel werden zum Beispiel drei Finanzinstrumente verwendet:

    • EURUSD mit der Historie bis zum 01.01.2009
    • USDJPY mit der Historie bis zum 01.06.2012
    • EURJPY mit der Historie bis zum 01.06.2014

    In diesem Fall wird die Historie des synthetischen Finanzinstruments für einen Zeitraum vom 01.06.2014 bis heute berechnet. Von diesem Datum werden zusätzlich 100 Minuten abgezogen, um die Vollständigkeit der Berechnung zu sichern (wenn es einen Minutenbalken in der Historie nicht gibt, wird bei der Berechnung der Balken der vorherigen Minute verwendet).

    Wenn eine tiefe Historie vorhanden ist, kann die Berechnung des synthetischen Finanzinstruments lange Zeit in Anspruch nehmen. Damit Sie sich seinen Chart sofort anschauen könnten, wird zuerst die Historie für die letzten zwei Monate berechnet (genauso wie in früheren Versionen). Erst danach wird die frühere Historie berechnet.

MQL5

  1. Es wurde die Eigenschaft ACCOUNT_CURRENCY_DIGITS hinzugefügt — die Anzahl der Nachkommastellen in der Kontowährung. Um den Wert der Eigenschaft zu erhalten, verwenden Sie die Funktion AccountInfoInteger. Die Eigenschaft kann bei der Berechnung des Gewinns für die Normalisierung der erhaltenen Werten verwendet werden.
  2. Die Verzögerung der Ausführung von Copy-Funktionen und i-Funktionen bei der Arbeit mit einem Wochenzeitrahmen wurde korrigiert.
  3. Fehler in der Funktion WebRequest wurden behoben.

Tester

  1. Es wurde die Möglichkeit hinzugefügt, einen Einzeltest für einen Expert Advisor nach dem Herunterladen von Optimierungsergebnissen aus einer Cache-Datei durchzuführen.
  2. Das anfängliche Herunterladen der Preis-Historie durch lokale Testagenten wurde beschleunigt.

Die Dokumentation wurde aktualisiert.

26 Juni 2018
MetaTrader 5 build 1870: neue Symbole im Market Watch von ISIN

Terminal

  1. Suche nach Handelssymbolen mit ISIN (International Securities Identification Number), die neu im Fenster des Market Watch angezeigt werden. Jetzt können Sie Symbole durch drei Methoden hinzufügen: Über den Namen, die Beschreibung und über ISIN.



  2. Die Verzögerung der Benutzeroberfläche beim Ändern des Passworts eines Handelskontos wurde korrigiert.
  3. Eine gelegentliche Erhöhung der CPU-Last durch das Terminal des Klienten wurde korrigiert.

MQL5

  1. Die Übergabe einen eigenen HTTP-Headers an die Funktion WebRequest wurde korrigiert.
  2. Das Verhalten der Funktion Bars im Falle, dass Anfangs und Enddatum einer Zeitspanne gleich sind, wurde korrigiert. Jetzt, wenn eine Bar existiert, gibt die Funktion 1 zurück. In früheren Versionen war dieser Wert in dem Fall immer 0.

Tester

  1. Der Beginn eines einzelnen Tests im visuellen Modus nach einer Vorwärtsoptimierung wurde korrigiert.
  2. Die Sortierung der Ergebnisse der Optimierung wurde korrigiert. Jetzt berücksichtigt die Sortierung auch Durchläufe mit inkorrekten Eingabeparametern (INIT_INCORRECT_PARAMETERS) und die, die keinen Profit-Faktor aufweisen.
  3. Die Neuberechnung der Grafik einer genetischen Optimierung nach dem Ändern des Optimierungskriterium wurde korrigiert.

Die Dokumentation wurde aktualisiert.

15 Juni 2018
MetaTrader 5 Build 1860: Funktionen für die Arbeit mit Balken in MQL5 und Verbesserungen im Strategietester

Terminal

  1. Der Dialog der Kontoeröffnung wurde komplett überarbeitet. Nun wählen Sie zuerst den gewünschten Broker aus, und danach den Kontotyp, den Sie eröffnen wollen. Dank dieser Änderung ist die Liste der Broker kompakter geworden, denn nun werden Unternehmensnamen angezeigt und nicht alle verfügbaren Server.

    Um die Suche zu erleichtern, wurden der Liste die Logos der Unternehmen hinzugefügt. Wenn der gewünschte Broker nicht in der Liste vorhanden ist, geben Sie den Namen des Unternehmens oder die Adresse des Servers in der Suche ein und klicken Sie auf "Find your broker".




    Um angehenden Händlern zu helfen, wurden dem Dialog Beschreibungen für Kontotypen hinzugefügt. Aufgrund der Aktualisierung der Allgemeinen Datenschutzrichtlinie (DSGVO) kann der aktualisierte Dialog der Kontoeröffnung Links zu verschiedenen Vereinbarungen und Richtlinien von Brokerunternehmen enthalten:




    Die Möglichkeiten für die Eröffnung von Real-Konten wurden wesentlich erweitert. Die Funktion zum Hochladen von Dokumenten für den Identitätsnachweis und die Bestätigung der Adresse, die früher in mobilen Terminals eingeführt wurde, ist nun auch in der Desktopversion verfügbar. Die von MiFID-regulierten Broker können nun alle benötigten Informationen für die Identifizierung des Kunden, einschließlich der Daten über Beschäftigung, Einkommen, Handelserfahrung usw. abfragen. Dies erlaubt es, reale Konten einfacher und schneller zu eröffnen, ohne unnötige Bürokratie.




  2. Nun werden die Werte von Stop Loss und Take Profit in der Historie der Abschlüsse angezeigt. Bei der Eröffnung und Umkehrung werden sie entsprechend den Werten von Stop Loss und Take Profit der Orders gesetzt, die diese Abschlüsse initiiert haben. Beim Ausstieg werden die Werte von Stop Loss und Take Profit der entsprechenden Positionen zum Zeitpunkt der Schließung verwendet. Letzteres erlaubt es, die Informationen über den Wert von Stop Loss und Take Profit einer Position zum Zeitpunkt ihrer Schließung zu speichern und anzuzeigen. In früheren Versionen wurden solche Informationen nicht gespeichert, denn Positionen verschwinden nach dem Schließen, und die Historie der Positionen wird basierend auf Abschlüssen gebildet.




  3. Nun werden die Werte von Stop Loss und Take Profit in der Historie der Positionen angezeigt. Für solche Positionen werden die Werte von Stop Loss und Take Profit der Abschlüsse angegeben, die die entsprechenden Positionen eröffnen und schließen.




  4. Nun wird das aktuelle Volumen von Pending Orders statt des ursprünglich abgefragten auf dem Chart angezeigt.




  5. Die Anzeige der Markttiefe im erweiterten Modus mit der aktivierten Anzeige des Spreads wurde optimiert und wesentlich beschleunigt.
  6. Die Verarbeitung der Ergebnisse der Ausführung von Handelsanfragen wurde optimiert. In einigen Fällen kann dies die Verarbeitung wesentlich beschleunigen.
  7. Es wurde ein Fehler des Trailing Stops behoben, der in einigen Fällen zum Senden mehrerer Anfragen hinsichtlich der Änderung des Stop Loss Levels einer und derselben Position führte.
  8. Es wurde das Setzen des minimalen und maximalen Volumens sowie des Schritts des Volumens in den Eigenschaften benutzerdefinierter Symbole korrigiert.
  9. Es wurde ein Fehler behoben, wegen dessen die Option "Fix Scale" bei der Anwendung eines Templates an den Chart des Handelsinstruments ignoriert wurde.
  10. Es wurde ein Fehler behoben, der in einigen Fällen dazu führte, dass die Tick-Historie falsch gespeichert wurde.

MQL5

  1. Die Geschwindigkeit der MQL5-Programme wurde durch eine zusätzliche Optimierung des Quellcodes bei der Kompilierung erhöht. Um von der erhöhten Geschwindigkeit zu profitieren, kompilieren Sie Ihre Programme in der neuen Version des MetaEditor.
    Leider führte die zusätzliche Optimierung dazu, dass neue Programme mit den älteren Versionen des Terminals nicht kompatibel sind. Alle Programme, die in MetaEditor Version 1860 und höher kompiliert wurden, können nicht in den Versionen des Terminals älter als 1860 gestartet werden. Dabei werden die Programme, die in den älteren MetaEditor Versionen kompiliert wurden, in neuen Terminals laufen.

  2. Es wurden die Funktionen iTime, iOpen, iHigh, iLow, iClose, iVolume, iBars, iBarShift, iLowest, iHighest, iRealVolume, iTickVolume und iSpread hinzugefügt. Diese Funktionen sind gleich den in MQL4 verwendeten Funktionen. Auf diese Weise ist es einfacher für Nutzer, den Code von Handelsprogrammen auf die Plattform der fünften Generation zu übertragen.

    Früher konnten die meisten Aufgaben dieser Funktionen mithilfe der Funktion Copy* erfüllt werden. Aber für die Suche nach maximalen/minimalen Werten auf dem Chart und für die Suche nach Balken nach Zeit, mussten Nutzer eigene Funktionen implementieren. Nun kann man das ganz einfach mithilfe der Funktionen iHighest, iLowest und iBarShift ausführen.

    iTime
    Gibt den Zeitpunkt der Eröffnung eines Balkens (der mithilfe des Parameters shift vorgegeben wurde) des entsprechenden Charts zurück.
    datetime  iTime(
       string           symbol,          // Symbol
       ENUM_TIMEFRAMES  timeframe,       // Zeitrahmen
       int              shift            // Verschiebung
       );

    iOpen
    Gibt den Open-Preis des Balkens (der durch den Parameter shift vorgegeben wurde) des entsprechenden Charts zurück.
    double  iOpen(
       string           symbol,          // Symbol
       ENUM_TIMEFRAMES  timeframe,       // Zeitrahmen
       int              shift            // Verschiebung
       );

    iHigh
    Gibt den High-Preis des Balkens (der durch den Parameter shift vorgegeben wurde) des entsprechenden Charts zurück.
    double  iHigh(
       string           symbol,          // Symbol
       ENUM_TIMEFRAMES  timeframe,       // Zeitrahmen
       int              shift            // Verschiebung
       );

    iLow
    Gibt den Low-Preis des Balkens (der durch den Parameter shift vorgegeben wurde) des entsprechenden Charts zurück.
    double  iLow(
       string           symbol,          // Symbol
       ENUM_TIMEFRAMES  timeframe,       // Zeitrahmen
       int              shift            // Verschiebung
       );

    iClose
    Gibt den Close-Preis des Balkens (der durch den Parameter shift vorgegeben wurde) des entsprechenden Charts zurück.
    double  iClose(
       string           symbol,          // Symbol
       ENUM_TIMEFRAMES  timeframe,       // Zeitrahmen
       int              shift            // Verschiebung
       );

    iVolume
    Gibt den Wert des Tick-Volumens des Balkens (der durch den Parameter shift vorgegeben wurde) des entsprechenden Charts zurück.
    long  iVolume(
       string           symbol,          // Symbol
       ENUM_TIMEFRAMES  timeframe,       // Zeitrahmen
       int              shift            // Verschiebung
       );

    iBars
    Gibt die Anzahl der Balken in der Historie nach dem entsprechenden Symbol und Zeitrahmen zurück.
    int  iBars(
       string           symbol,          // Symbol
       ENUM_TIMEFRAMES  timeframe        // Zeitrahmen
       );

    iBarShift
    Suche nach Balken nach Zeit. Die Funktion gibt den Index des Balkens zurück, der der angegebenen Zeit entspricht.
    int  iBarShift(
       string           symbol,          // Symbol
       ENUM_TIMEFRAMES  timeframe,       // Zeitrahmen
       datetime         time,            // Zeit
       bool             exact=false      // Modus
       );

    iLowest
    Gibt den Index des kleinsten gefundenen Wertes (Verschiebung hinsichtlich des aktuellen Balkens) des entsprechenden Charts zurück.
    int  iLowest(
       string           symbol,          // Symbol
       ENUM_TIMEFRAMES  timeframe,       // Zeitrahmen
       int              type,            // Identifikator der Zeitreihe
       int              count,           // Anzahl der Elemente
       int              start            // Index
      );

    iHighest
    Gibt den Index des größten gefundenen Wertes (Verschiebung hinsichtlich des aktuellen Balkens) des entsprechenden Charts zurück.
    int  iHighest(
       string           symbol,          // Symbol
       ENUM_TIMEFRAMES  timeframe,       // Zietrahmen
       int              type,            // Indentifikator der Zeitreihe
       int              count,           // Anzahl der Elemente
       int              start            // Index
      );

    iRealVolume
    Gibt den Wert des echten Volumens des Balkens (der durch den Parameter shift vorgegeben wurde) des entsprechenden Charts zurück.
    long  iRealVolume(
       string           symbol,          // Symbol
       ENUM_TIMEFRAMES  timeframe,       // Zeitrahmen
       int              shift            // Verschiebung
       );

    iTickVolume
    Gibt den Wert des Tick-Volumens des Balkens (der durch den Parameter shift vorgegeben wurde) des entsprechenden Charts zurück.
    long  iTickVolume(
       string           symbol,          // Symbol
       ENUM_TIMEFRAMES  timeframe,       // Zeitrahmen
       int              shift            // Verschiebung
       );

    iSpread
    Gibt den Wert des Spreads des Balkens (der durch den Parameter shift vorgegeben wurde) des entsprechenden Charts zurück.
    long  iSpread(
       string           symbol,          // Symbol
       ENUM_TIMEFRAMES  timeframe,       // Zeitrahmen
       int              shift            // Verschiebung
       );
  3. Es wurde die Funktion TesterHideIndicators hinzugefügt. Sie setzt das Anzeigen/Ausblenden von Indikatoren, die im Expert Advisor verwendet werden. Die Funktion dient zur Verwaltung der Sichtbarkeit der verwendeten Indikatoren nur beim Testen. Geben Sie das Flag true an, wenn die erstellten Indikatoren ausgeblendet werden müssen, andernfalls false.
    void  TesterHideIndicators(
       bool      hide     // Flag
       );
  4. Es wurde die Erzeugung des Ereignisses CHARTEVENT_CLICK beim Klicken mit der Maus auf Handelslevels des Charts hinzugefügt.
  5. Es wurde die Arbeit der Funktionen CopyTicks korrigiert und optimiert.
  6. Es wurde der Wert korrigiert, den die Funktion SymbolInfoDouble für die Eigenschaft SYMBOL_TRADE_LIQUIDITY_RATE zurückgab.
  7. Es wurde der Fehler des Kopierens von String-Arrays mit einem sich überschneidenden Speicherbereich behoben.
  8. Es wurde der Fehler der Zuweisung eines String-Arrays in der Funktion FileReadArray behoben.
  9. Es wurde eine Reihe von Fehlern in der Standardbibliothek MQL5 behoben.

Tester

  1. Das System für die Arbeit mit dem Cache der Optimierung wurde aktualisiert. Cache speichert Daten über die früher berechneten Durchläufe einer Optimierung. Der Strategietester speichert sie, um die Optimierung nach einer Pause fortzusetzen und um die bereits berechneten Durchläufe des Testens nicht neu zu berechnen.

    Änderungen im Speicherformat des Cache der Optimierung
    Früher wurde der Cache der Optimierung als eine XML-Datei gespeichert. Dieser Datei wurden alle Durchläufe der Optimierung eines Expert Advisors mit den vorgegebenen Einstellungen des Testens hinzugefügt. In einer und derselben Datei wurden die Ergebnisse der Optimierung mit verschiedenen Eingabeparametern gespeichert.
    Nun wird der Cache der Optimierung als binäre Dateien separat für jeden Set der zu optimierenden Parameter gespeichert. Durch die Änderung des Formats und Reduzierung der Dateigröße wurde die Arbeit des Testers mit dem Cache der Optimierung wesentlich beschleunigt. Diese Beschleunigung wird besonders deutlich, wenn man eine früher gestoppte Optimierung fortsetzt.

    Anzeige der Ergebnisse früher durchgeführter Optimierungen
    Nun können Sie sich die Ergebnisse der früher durchgeführten Optimierungen anschauen, ohne sich mit riesigen XML-Dateien in Drittprogrammen beschäftigen zu müssen. Öffnen Sie den Reiter "Optimierungsergebnisse", wählen Sie einen Expert Advisor und eine Datei mit dem Cache der Optimierung aus:



    In der Liste werden alle Dateien des Cache der Optimierung angezeigt, die für den ausgewählten Expert Advisor vorhanden sind. Für jede Datei werden Optimierungsdatum, Testeinstellungen (Symbol, Zeitrahmen, Datum) sowie Informationen über die Eingabeparameter angezeigt. Darüber hinaus können Sie die Optimierungsergebnisse nach Handelsserver filtern, auf welchem sie abgefragt wurden.

    Neuberechnung des Optimierungskriteriums während des Testens
    Ein Optimierungskriterium ist eine Kennzahl, deren Wert die Qualität des zu testenden Sets der Eingabeparameter definiert. Je größer der Wert des Optimierungskriteriums ist, desto besser wird das Ergebnis des Testens mit diesem Parameterset eingestuft.

    Früher wurde bei der Optimierung nur ein Kriterium berechnet, das vor dem Beginn der Optimierung ausgewählt wurde. Nun können Sie das Optimierungskriterium während des Testens ändern, der Strategietester wird alle Werte neu berechnen.




    Wie der Cache der Optimierung manuell verwendet wird
    Früher wurde der Cache der Optimierung in einer XML-Datei gespeichert, die man auch in Drittsoftware öffnen und analysieren konnte. Nun wird er in geschlossenen Binärdateien gespeichert. Um Daten im XML-Format zu erhalten, exportieren Sie sie über das Kontextmenü des Reiters "Optimierungsergebnisse".

  2. Es wurde die Option hinzugefügt, die Kontowährung und den Hebel für das Testen und für die Optimierung manuell zu setzen. Früher wurde die Kontowährung in Übereinstimmung mit dem aktuell verbundenen Konto gesetzt. Dementsprechend musste man zu den anderen Konten wechseln, um die Parameter zu ändern. Der Hebel konnte auch nur aus einer vordefinierten Liste ausgewählt werden, nun können Sie beliebige Werte angeben.

    Bitte beachten Sie, dass für korrekte Tests Kreuzkurse für die Umwandlung des Profits und der Margin in die angegebene Kontowährung verfügbar sein müssen.




  3. Es wurde das Verbot für die Verwendung von OpenCL in Testagenten aufgehoben. Früher konnten OpenCL-Devices nur beim Testen auf lokalen Agenten verwendet werden. Nun dürfen Agenten alle verfügbaren OpenCL-Devices (Prozessor, Grafikkarte) bei der Arbeit im lokalen Netz und in MQL5 Cloud Network verwenden.

MetaEditor

  1. Das Arbeiten mit dem MQL5 Storage wurde optimiert und beschleunigt.
  2. Ausführung des Debuggings nach einer Pause in der MQH-Datei korrigiert.
  3. Es wurden die Fehler des Hervorhebens des Quellcodes im Editor behoben.
  4. Die Navigation durch Testergebnisse wurde korrigiert.
  5. Massenweise Textersetzung korrigiert. In einigen Fällen wurde nur das erste Vorkommen einer Folge statt allen ersetzt.

Die Dokumentation wurde aktualisiert.

12 Januar 2018
MetaTrader 5 Build 1745 ist die letzte Version der Handelsplattform, die Microsoft Windows XP/2003/Vista unterstützt.

Vor einigen Monaten haben wir bereits die Einstellung der Unterstützung für alte Versionen von Betriebssystemen angekündigt. Windows 2003, Windows Vista und besonders Microsoft Windows XP sind veraltete Betriebssysteme. Microsoft stellte die Unterstützung für Windows XP vor drei Jahren ein, denn wegen technischer Einschränkungen lies dieses System die Möglichkeiten der Hardware nicht voll ausschöpfen.

MetaTrader 5 Build 1745 und ältere Versionen der Plattform werden auch weiterhin auf den genannten Betriebssystemen laufen, aber keine Updates erhalten. Darüber hinaus können Installers in den genannten Systemen nicht gestartet werden.

Die minimale Anforderung an das Betriebssystem für MetaTrader 5 ist Windows 7, wir empfehlen aber dringend, 64-Bit-Versionen von Windows 10 zu nutzen.

Terminal

  1. Zum Installer wurde der Schlüssel /auto hinzugefügt, der es erlaubt, Programme im automatischen Modus ohne zusätzliche Aktionen des Nutzers zu installieren. Beim Starten des Installers mit diesem Schlüssel werden Installationseinstellungen nicht angezeigt, das Terminal wird mit Standardeinstellungen und einem Standardnamen des Programmordners im Startmenü installiert. Ein Beispiel für das Starten:
    C:\mt5setup.exe /auto
  2. Die Arbeit des Installers wurde in den Fällen korrigiert, in denen der Nutzer eines Betriebssystems nicht über die entsprechenden Rechte verfügte.
  3. Ein hoher CPU-Verbrauch wurde korrigiert, wenn keine Aktionen im Terminal durchgeführt werden (keine offenen Charts vorhanden, keine Aktionen vom Nutzer).
  4. Nun werden *.log Dateien auf der Ebene des Dateisystems automatisch komprimiert. Dies erlaubt es, den Speicherplatz für Log-Dateien zu reduzieren.

Tester

  1. Das Cache-Volumen wurde bei einzelnen Testdurchläufen erhöht, was das Testen in 64-Bit-Betriebssystemen etwas beschleunigt.
  2. Die Optimierung von Handelsrobotern unter Verwendung von MQL5 Cloud Network wurde korrigiert. Probleme konnten bei den im MetaTrader Market erworbenen Produkten auftreten.
  3. Die Berechnung von Spreads für die im Testmodus "Jeder Tick" erzeugten Balken wurde korrigiert.
  4. Die Auswahl eines OpenCL-Device im Strategietester wurde korrigiert. Der visuelle Tester kann nun auf alle vorhandenen OpenCL-Devices zugreifen.
  5. Nun werden *.log Dateien auf der Ebene des Dateisystems automatisch komprimiert. Dies erlaubt es, den Speicherplatz für Log-Dateien zu reduzieren.

MQL5

  1. Das Löschen von Balken eines benutzerdefinierten Symbols mithilfe der Methode CustomRatesDelete wurde korrigiert.
Verbesserungen anhand Crash-Logs.
Die Dokumentation wurde aktualisiert.
20 Dezember 2017
MetaTrader 5 Build 1730: Projekte in MetaEditor und synthetische Finanzinstrumente

Unterstützung für alte Versionen der Terminals eingestellt

In der neuen Version der Plattform wird die Unterstützung für Desktop-Terminals und mobile Terminals älterer Versionen eingestellt:

  • Kundenterminal: Versionen älter als 730 vom 23. November 2012
  • Mobiles Terminal für iPhone: Versionen älter als 1171 vom 11. November 2015
  • Mobiles Terminal für Android: Versionen älter als 1334 vom 5. August 2016

Solche Terminals können sich nicht mit Servern der neuen Versionen verbinden. Wir empfehlen Ihnen ausdrücklich, Ihre Terminals vorab zu aktualisieren.

Protokolldatei des MQL5 Storage geändert

Für die Unterstützung von Gruppenprojekten wurde die Protokolldatei des MQL5 Storage geändert. Aus diesem Grund müssen Sie nach dem Update der Plattform alle Daten aus dem Storage erneut laden (Checkout). Die Daten, die im MQL5 Storage gespeichert sind, werden während der Aktualisierung nicht betroffen und gehen nicht verloren.

Vor dem Update auf die neue Version der Plattform empfehlen wir alle lokalen Änderungen im Storage zu speichern (Commit ausführen).

Terminal

  1. Nun kann man synthetische Finanzinstrumente auf der Plattform erstellen. Das sind Finanzinstrumente, die auf einem oder mehreren der vorhandenen basieren. Man muss eine Formel für die Berechnung der Kurse angeben, und die Plattform wird Ticks des synthetischen Symbols in Echtzeit erzeugen sowie eine Minuten-Historie für es erstellen.

    Wie es funktioniert

    • Sie erstellen ein synthetisches Finanzinstrument und geben eine Formel für seine Berechnung an.
    • Die Plattform berechnet seine Ticks mit einer Frequenz von 10 Mal pro Sekunde, vorausgesetzt, dass sich der Preis mindestens eines Symbols in der Formel geändert hat.
    • Die Plattform berechnet die Historie von Minutenbalken (für zwei letzte Monate) auf Basis von Minutenbalken der Symbole in seiner Formel. Alle neuen Balken (der aktuelle und der nächste) werden in Echtzeit basierend auf erzeugten Ticks des synthetischen Symbols gezeichnet.

    Sie können zum Beispiel ein Finanzinstrument erstellen, welches den Dollarindex (USDX) zeigt. Seine Formel sieht wie folgt aus:

    50.14348112 * pow(ask(EURUSD),-0.576) * pow(USDJPY,0.136) * pow(ask(GBPUSD),-0.119) * pow(USDCAD,0.091) * pow(USDSEK,0.042) * pow(USDCHF,0.036)

    Hinweis: in der ursprünglichen Formel des Dollarindex werden die Währungspaare USDEUR und USDGBP verwendet. Das es nur gegenläufige Währungspaare auf der Plattform gibt, wird für diese eine negative Potenz und der Ask-Preis statt Bid-Preis verwendet.

    Die Plattform berechnet den Preis des neuen Symbols in Echtzeit basierend auf den Kursen der sechs anderen Symbole, die von Ihrem Broker bereitgestellt werden. In der Marktübersicht und auf dem Chart sehen Sie, wie sich sein Preis ändert:




    Erstellen Sie ein neues benutzerdefiniertes Symbol, öffnen Sie dessen Spezifikation und geben Sie seine Formel an:




    Einfachheitshalber zeigt der Formel-Editor die Liste möglicher Varianten an, während man Namen von Symbolen und Funktionen eingibt.

    Die Berechnung von Ticks und Minutenbalken eines synthetischen Symbols beginnt, sobald es zur Marktübersicht hinzugefügt wird. Gleichzeitig werden der Marktübersicht alle Symbole hinzugefügt, die für die Berechnung des synthetischen Symbols benötigt werden. Dem Journal der Plattform wird eine Eintragung über den Beginn der Berechnung hinzugefügt: Synthetic Symbol USDX: processing started.
    • Die Berechnung des synthetischen Symbols wird beendet, wenn es in der Marktübersicht ausgeblendet wird.
    • Symbole, die momentan für die Berechnung synthetischer Symbole verwendet werden, können in der Marktübersicht nicht ausgeblendet werden.

    Berechnung von Kursen in Echtzeit
    Jede 100 Ms (zehn mal pro Sekunde) wird überprüft, ob sich der Preis der Symbole in der Formel geändert hat. Wenn sich der Preis mindestens eines Symbols geändert hat, wird der Preis des synthetischen Symbols berechnet und ein Tick wird generiert. Die Berechnung wird parallel in drei Threads für Bid, Ask und Last-Preise durchgeführt. Zum Beispiel, wenn die Formel EURUSD*GBPUSD ist, werden die Preise des synthetischen Symbols wie folgt berechnet:

    • Bid — bid(EURUSD)*bid(GBPUSD)
    • Ask — ask(EURUSD)*ask(GBPUSD)
    • Last — last(EURUSD)*last(GBPUSD)

    Das Vorhandensein der Veränderungen wird für jeden Preis separat geprüft. Wenn sich bei einer Berechnung nur der Bid-Preis des ursprünglichen Symbols verändert hat, wird für den Tick des synthetischen Symbols nur der entsprechende Preis berechnet.

    Zeichnen der Historie von Munitenbalken
    Neben dem Sammeln von Ticks in Echtzeit, erstellt die Plattform eine Minuten-Historie des synthetischen Symbols. Auf diese Weise kann sich der Trader seine Charts wie die Charts einfacher Symbole ansehen und mithilfe von Objekten und Indikatoren technische Analyse durchführen.

    Sobald der Trader ein synthetisches Symbol zur Marktübersicht hinzufügt, prüft die Plattform, ob es für ihn eine berechnete Minutenhistorie gibt. Wenn nicht, wird die Historie für die letzten 60 Tage erstellt. Das macht ungefähr 50 000 Balken aus. Wenn ein kleinerer Wert im Parameter "Max. Balken im Chart" in den Einstellungen der Plattform angegeben wurde, wird diese Beschränkung angewandt.

    Wenn einige Balken für diese Perioden bereits gezeichnet wurden, erzeugt die Plattform zusätzlich neue Balken. Eine tiefere Historie wird erst beim Versuch erstellt, sich einen älteren Zeitraum auf dem Chart anzusehen (wenn man zurück scrollt oder die Historie aus einem MQL5-Programm abruft).

    Die Historie von Minutenbalken eines synthetischen Symbols wird basierend auf Minutenbalken (nicht Ticks) der Symbole in seiner Formal berechnet. Um den Open-Kurs eines Minutenbalkens eines synthetischen Symbols zu berechnen, verwendet die Plattform Open-Kurse der Symbole in der Formel. Die High-, Low- und Close- Kurse werden gleich berechnet.

    Wenn der benötigte Minutenbalken für ein Symbol aus der Formel fehlt, verwendet die Plattform den Close-Kurs des vorherigen Balkens für die Berechnung. Es werden zum Beispiel drei Symbole verwendet: EURUSD, USDJPY und GBPUSD. Fehlt bei der Berechnung eines Balkens, der der Minute 12:00 entspricht, der Minutenbalken von USDJPY, werden folgende Preise verwendet:

    • Für Open — EURUSD Open 12:00, USDJPY Close 11:59, GBPUSD Open 12:00
    • Für High — EURUSD High 12:00, USDJPY Close 11:59, GBPUSD High 12:00
    • Für Low — EURUSD Low 12:00, USDJPY Close 11:59, GBPUSD Low 12:00
    • Für Close — EURUSD Close 12:00, USDJPY Close 11:59, GBPUSD Close 12:00

    Wenn der Minutenbalken bei allen Symbolen in der Formel fehlt, wird der entsprechende Minutenbalken des synthetischen Symbols nicht berechnet.

    Zeichnen neuer Minutenbalken
    Alle neuen Balken (der aktuelle und die darauffolgenden) des synthetischen Symbols werden basierend auf erzeugten Ticks erstellt. Der Preis, nach welchem die Balken gezeichnet werden, hängt vom Parameter "Zeichnen von Charts" in der Spezifikation ab:





    Welche Operationen in der Formel des Symbols verwendet werden dürfen
    In der Formel können Preisdaten sowie einige Eigenschaften existierender Symbole (bereitgestellt vom Broker) verwendet werden. Dafür sind folgende Informationen anzugeben:

    • Symbolname — je nach dem, welcher Preis des synthetischen Symbols berechnet wird, wird in der Formel der Bid-, Ask- oder Last-Preis des angegebenen Finanzinstruments verwendet. Zum Beispiel wenn man EURUSD*GBPUSD angibt, wird Bid als bid(EURUSD)*bid(GBPUSD) und Ask — als ask(EURUSD)*ask(GBPUSD) berechnet.
    • bid(Symbolname) — bei der Berechnung des Bid-Preises des synthetischen Symbols wird die Verwendung des Bid-Preises des angegebenen Symbols erzwungen. Diese Variante ist ähnlich der vorherigen (ohne Angabe des Preistyps).
    • ask(Symbolname) — bei der Berechnung des Bid-Preises des synthetischen Symbols wird die Verwendung des Ask-Preises des angegebenen Symbols erzwungen. Bei der Berechnung des Ask-Preises wird umgekehrt der Bid-Preis des angegebenen Symbols verwendet. Bei der Berechnung des Last-Preises wird der Last-Preis des angegebenen Symbols verwendet. Zum Beispiel wenn man ask(EURUSD)*GBPUSD angibt, wird wie folgt berechnet:
      • Bid = ask(EURUSD)*bid(GBPUSD)
      • Ask = bid(EURUSD)*ask(GBPUSD)
      • Last = last(EURUSD)*last(GBPUSD)
    • last(Symbolname) — der Last-Preis des angegebenen Symbols wird bei der Berechnung aller Preise des synthetischen Symbols (Bid, Ask und Last) verwendet. Wenn man zum Beispiel last(EURUSD)*GBPUSD angibt, wird wie folgt berechnet:
      • Bid = last(EURUSD)*bid(GBPUSD)
      • Ask = last(EURUSD)*ask(GBPUSD)
      • Last = last(EURUSD)*last(GBPUSD)
    • volume(Symbolname) — in der Formel wird das Tickvolumen des angegebenen Symbols verwendet. Stellen Sie sicher, dass die Volumen-Daten für das angegebene Symbol vom Broker geliefert werden.
    • point(Symbolname) — in die Formel wird der Wert der minimalen Preisveräderung des angegebenen Symbols eingefügt.
    • digits(Symbolname) — in die Formel wird die Anzahl der Nachkommastellen im Preis des angegebenen Symbols eingefügt.

    Wenn der Symbol einen komplizierten Namen hat (Bindestrich, Punkte usw. beinhaltet), muss er in Anführungszeichen gesetzt werden. Zum Beispiel, "RTS-6.17".
    Folgende Rechenoperationen können in der Formel verwendet werden: Addition (+), Subtraktion (-), Multiplikation (*), Division (/) und Division mit Rest (%). EURUSD+GBPUSD bedeutet, zum Beispiel, dass der Preis als Summe der Preise von EURUSD und GBPUSD berechnet wird. In der Formel kann auch das unäre Minus für die Änderung des Vorzeichens verwendet werden: -10*EURUSD.

    Die Rechenoperationen werden nach Vorrangregeln ausgeführt:

    • Zunächst werden Multiplikation, Division und Division mit Rest ausgeführt, danach werden Addition und Subtraktion ausgeführt.
    • Die Rechenoperationen werden von links nach rechts ausgeführt. Wenn mehrere Operationen in der Formel (zum Beispiel, Addition und Subtraktion) verwendet werden, wird zunächst die Rechenoperation ganz links ausgeführt.
    • Um die Reihenfolge der Ausführung zu ändern, kann man runde Klammern ( und ) verwenden. Die Ausdrücke in Klammern haben bei der Berechnung den höchsten Vorrang. Für diese Ausdrücke gilt auch das Prinzip von links nach rechts: zuerst wird der Ausdruck in Klammern berechnet, der in der Formel ganz links steht.

    Darüber hinaus können Konstanten in der Formel verwendet werden:

    • Nummerische (ganzzahlige und mit Gleitkomma). Zum Beispiel, EURUSD*2+GBPUSD*0.7.
    • Die Symbol-Eigenschaften _Digits und _Point. _Digits — Anzahl der Nachkommastellen im Preis des Symbols, _Point — minimale Preisveränderung des Symbols.

    Darüber hinaus kann man in der Formel alle mathematischen Funktionen, die in MQL5 unterstützt werden, außer MathSrand, MathRand und MathIsValidNuber, verwenden. Für alle Funktionen werden kurze Namen verwendet: fabs(), acos(), asin() usw.

  2. Es wurde eine Option hinzugefügt, die es erlaubt, Kurse für benutzerdefinierte Finanzinstrumente in Eichtzeit hinzuzufügen. Nun ist es möglich, einen Expert Advisor in MQL5 zu schreiben, der Kurse für das angegebene Finanzinstrument liefern wird. Dafür wird die neue Funktion CustomTicksAdd verwendet.
    int  CustomTicksAdd(
       const string           symbol,       // Symbolname
       const MqlTick&         ticks[]       // Array mit Tickdaten, die auf das benutzerdefinierte Finanzinstrument angewandt werden müssen
       );
    Die Funktion CustomTicksAdd erlaubt es, die Tick so zu übertragen, als ob sie vom Server des Brokers eintreffen würden. Die Daten werden nicht direkt in die Datenbank von Ticks geschrieben, sondern in die Marktübersicht gesendet. Das Terminal speichert dann die Ticks aus der Marktübersicht in seiner Datenbank. Wenn eine große Datenmenge bei einem Aufruf übertragen wird, ändert die Funktion ihr Verhalten, um Ressourcen zu sparen. Wenn über 256 Ticks übergeben werden, werden die Daten in zwei Teile geteilt. Der erste Teil (der größere) wird direkt in die Datenbank von Ticks geschrieben (wie dies CustomTicksReplace tut). Der zweite Teil, der aus den letzten 128 Ticks besteht, wird in die Marktübersicht übertragen und danach vom Terminal in der Datenbank gespeichert.
  3. In der Marktübersicht werden jetzt auch High und Low Kurse angezeigt. Standardmäßig sind diese Spalten deaktiviert. Sie können die Anzeige im Kontextmenü aktivieren:




    Für Symbole, deren Charts nach Bid-Preisen (in der Spezifikation angegeben) gezeichnet werden, werden Bid High und Bid Low Preise angezeigt. Für Finanzinstrumente, deren Charts nach Last-Preisen gezeichnet werden, werden Last High und Last Low angezeigt.

    Mit den Spalten High/Low wird die Last-Spalte automatisch aktiviert, wenn es mindestens ein Symbol in der Marktübersicht gibt, dessen Charts nach Last-Preisen gezeichnet werden.

  4. Es wurde die Option hinzugefügt, Tick-Historie benutzerdefinierter Finanzinstrumente zu bearbeiten. Klicken Sie auf "Symbole" im Kontextmenü der Marktübersicht, wählen Sie ein benutzerdefiniertes Symbol aus und rufen Sie den gewünschten Zeitraum im Ticks-Reiter ab.

    • Die Werte können durch einen Doppelklick geändert werden.
    • Für das Hinzufügen oder Löschen von Einträgen, verwenden Sie das Kontextmenü.
    • Um mehrere Balken/Ticks zu löschen, wählen Sie diese mit der Maus aus, während Sie Shift oder Strg+Shift drücken und halten.




    Die geänderten Einträge werden wie folgt hervorgehoben:

    • grüner Hintergrund — geänderte Eintrag
    • grauer Hintergrund — gelöschter Eintrag
    • gelber Hintergrund — hinzugefügter Eintrag

    Um die Änderungen zu speichern, klicken Sie auf "Änderungen übernehmen" im unteren Teil des Fensters.

  5. Im Verzeichnis des Navigators werden nun vorläufige Konten angezeigt.

    Händler können Anfragen an den Broker direkt aus Desktop-Terminals senden, um ein Realkonto zu eröffnen. Dafür reicht es, eine einfache Form mit Kontaktdaten wie beim Eröffnen eines Demo-Kontos auszufüllen. Danach wird ein vorläufiges Konto für den Händler erstellt. Weiter setzt sich der Broker mit dem Händler in Verbindung, um einen Vertrag zu schließen, und erstellt aus dem vorläufigen Konto ein Realkonto.




  6. Anzeige der Zeit in Millisekunden im Kurse-Fenster hinzugefügt:




  7. Das Scanning verfügbarer Server wurde im Dialog der Eröffnung eines neuen Kontos beschleunigt.
  8. Die Anzeige des grafischen Objekts "Trendlinie" mit den aktivierten Optionen "Strahl nach links" und "Strahl nach rechts" wurde korrigiert.
  9. Die Arbeit mit einer großen Anzahl interner E-Mails (hundert tausende) wurde optimiert.
  10. Die Arbeit des Terminals mit einer großen Anzahl von Finanzinstrumenten (50 Tausend und mehr) wurde optimiert.
  11. Es wurde die Optimierung der Tick-Historie benutzerdefinierter Symbole hinzugefügt, die nach dem Bearbeiten der Historie ausgeführt wird.

MetaEditor

  1. Nun sind vollständige Projekte im MetaEditor verfügbar. Es ist viel einfacher geworden, Programme zu entwickeln.

    Die Hauptdatei eines MQL5-Programms erscheint jetzt nicht mehr als Projekt. Ein Projekt ist eine separate Datei "MQPROJ", in welcher die Einstellungen eines Programms, Parameter der Kompilierung und Informationen über alle verwendeten Dateien gespeichert werden. Der Zugriff auf die wichtigsten Einstellungen des Projekts erfolgt über ein separates Dialog-Fenster. Man braucht nicht mehr diese im Queelcode über #property anzugeben.

    Für eine bequeme Arbeit mit Projekten gibt es ein separates Tab im Navigator-Fenster. Hier werden alle verwendeten Dateien nach Kategorien angezeigt: include, resource, header usw. Dabei werden die Dateien zum Navigator des Projekts automatisch hinzugefügt. Zum Beispiel, wenn Sie eine neue MQH-Datei in den Code miteinbeziehen, wird diese im Bereich "Dependencies" im Navigator-Fenster automatisch angezeigt.

    Es wurde die Möglichkeit implementiert, mit neuen Projekten im MQL5 Online-Storage zu arbeiten. Nun kann man große Projekte gemeinsam mit anderen Mitgliedern der MQL5.community entwickeln.

    Für das Arbeiten mit Gruppenprojekten wurde der neue Bereich Shared Projects hinzugefügt. Ein Projekt, das in diesem Bereich erstellt wurde, wird direkt in den Storage geschickt. Sie können anderen Nutzern Zugriffsrechte schnell erteilen und mit einer gemeinsamen Entwicklung beginnen.




    Bei der Kompilierung des Projekts in Shared Project wird die EX5-Datei je nach dem Typ des Programms in das lokale Verzeichnis Experts, Indicators oder Scripts automatisch kopiert. Sie können das Programm direkt auf dem Chart starten, ohne Dateien jedes Mal manuell kopieren zu müssen.


    Neue Funktionen bei der Arbeit mit dem MQL5 Storage

    Für die Implementierung einer vollständigen Arbeit mit Gruppenprojekten wurde das Protokoll der Arbeit mit dem MQL5 Storage komplett geändert. Aus diesem Grund müssen Sie nach dem Update der Plattform alle Daten aus dem Storage erneut laden (Checkout). Die Daten, die im MQL5 Storage gespeichert sind, werden während der Aktualisierung nicht betroffen und gehen nicht verloren.

    Vor dem Update auf die neue Version der Plattform empfehlen wir alle lokalen Änderungen im Storage zu speichern (Commit ausführen).

    Der Befehl "Checkout from Storage" ist nicht mehr verfügbar. Für das Extrahieren von Daten werden die Befehle "MQL5 Storage aktivieren" und "Dateien aus dem Storage erhalten" verwendet:

    • Wenn Sie den Storage in der aktuellen Kopie des MetaEditors noch nicht verwendet haben, klicken Sie auf "MQL5 Storage aktivieren" im Kontextmenü des Navigator-Fensters. Alle vorhandenen Verzeichnisse und Dateien werden auf Ihren lokalen PC übertragen.
    • Wenn Sie mit dem Storage bereits gearbeitet haben, klicken Sie auf "Dateien aus dem Storage erhalten" im Kontextmenü eines konkreten Projekts oder des MQL5 Wurzelelements im Navigator-Fenster, um Dateien zu extrahieren.

    Neue Projekte: ein Beispiel für die Erstellung und Details der Arbeit

    Dem MetaEditor wurde eine neue Einheit hinzugefügt. Es geht um Projekte. Das ist eine Datei mit der Erweiterung mqproj, in welcher allgemeine Eigenschaften eines Programms sowie Informationen über alle verwendeten Dateien gespeichert werden. Nun kann man die Eigenschaften des Programms in einem separaten Dialogfensters des MetaEditors verwalten statt diese manuell im Quellcode zu ändern (Anweisungen #property).

    Wenn Sie einen Code haben, können Sie neue Projekte ganz einfach testen, indem Sie den Befehl "Neues Projekt aus der Quelldatei" ausführen.




    Im Verzeichnis, in welchem sich die ausgewählte Quelldatei befindet, wird eine gleichnamige Datei des Projekts mit der Erweiterung mqproj erstellt. Dem Projekt werden die Haupteigenschaften des Programms automatisch hinzugefügt, die als #property in der Quelldatei angegeben sind. Dazu gehören Name, Copyright, Version, Link zum Autor und Beschreibung.

    Die Eigenschaften des Programms in der Projektdatei haben Vorrang vor den Eigenschaften, die im Quellcode angegeben sind. Wenn Sie Eigenschaften sowohl im Projekt als auch im Quellcode angeben, werden die im Projekt angegebenen Eigenschaften verwendet.




    Es wurden zwei neue Optionen für die Kompilierung von MQL5-Programmen den Projekteigenschaften hinzugefügt:

    • Zusätzliche Optimierung aktivieren — Anwendungen mit deaktivierter Optimierung werden zwar schneller kompiliert, laufen aber langsamer.
    • Divisoren mit Gleitkomma prüfen — Anwendungen mit deaktivierter Überprüfung arbeiten etwas schneller, weil die Division-durch-Null-Fehler bei der Ausführung des Codes nicht überprüft werden.

    Für die Arbeit mit dem Projekt nutzen Sie das separate Tab "Projekt" im Navigator-Fenster. In diesem Reiter werden alle im Projekt verwendeten Dateien angezeigt. Bei der Erzeugung eines Projekts aus der Quelldatei werden zum Bereich "Dependencies" alle Include-Dateien (die mittels der Anweisung #include in der MQ5-Hauptdatei und in allen miteinbezogenen Dateien angegeben wurden) automatisch hinzugefügt.

    Beim Hinzufügen neuer Include-Dateien zum Quellcode erscheinen diese auch im Navigator des Projekts. Zum Bereich Headers werden die verwendeten Header-Dateien hinzugefügt, zum Bereich Resources — Abbildungen, Töne und andere MQL5-Programme, die als Ressourcen ins Projekt miteinbezogen werden. Im Bereich Sources werden MQ5-Datein mit dem Quellcode angezeigt. Zum Bereich "Einstellungen und Dateien" kann man andere Dateien hinzufügen, zum Beispiel Testeinstellungen und Vorlagen für Charts.

    Um bereits existierende Dateien zum Projekt hinzuzufügen oder Dateien aus dem Projekt zu löschen, nutzen Sie Befehle des Kontextmenüs. Seien Sie aufmerksam beim Löschen: Sie können eine Datei aus dem Projekt entfernen (Bindung entfernen) oder diese von der Festplatte komplett löschen:




    Ein neues Projekt zu erstellen ist genauso einfach, wie ein MQL5-Programm. Klicken Sie auf "Neues Projekt" und wählen Sie den Typ des Programms aus sowie geben Sie seine Eigenschaften im MQL5 Wizard an (Name, Event-Handler usw.).

    Um eine ausführbare EX5-Datei zu erhalten, können Sie das Projekt öffnen und die Kompilierung ausführen (F7) oder wie früher, die MQL5-Hauptdatei öffnen und diese kompilieren.


    Gruppenprojekte im MQL5 Storage: Details der Arbeit

    Gruppenprojekte werden im Bereich Shared Projects verwaltet. Wenn Sie den Storage noch nicht aktiviert haben, führen Sie den Befehl Activate MQL5 Storage im Kontextmenü des Ordners aus. MetaEditor überprüft, ob Ihr Storage gespeicherte Daten enthält und ob Gruppenprojekte für Sie verfügbar sind. Die vorhandenen Daten werden aus dem Storage extrahiert und auf den PC geladen (Checkout). Verfügbare Gruppenprojekte werden im Bereich Shared Project angezeigt. Um ein Gruppenprojekt zu erhalten, klicken Sie auf "Dateien aus dem Storage extrahieren" im Kontextmenü.

    Um ein neues Gruppenprojekt zu erstellen, wählen Sie den Ordner Shared Projects aus und klicken Sie auf "Neues Projekt":




    Durchlaufen Sie die Standardschritte des MQL5 Wizards: Geben Sie den Typ, den Namen und die Eigenschaften des künftigen Programms ein. Wählen Sie klare und verständliche Namen für Gruppenprojekte aus, damit andere Teilnehmer diese leicht finden könnten. Der Name darf nur lateinische Buchstaben enthalten, Leerzeichen sind nicht erlaubt.

    Sobald das Projekt erstellt ist, wird es zum MQL5 Storage automatisch hinzugefügt. Die verwendeten Dateien der Standardbibliothek werden zum Storage nicht hinzugefügt, sie können diese manuell hinzufügen wenn nötig.

    Um anderen Teilnehmern die Arbeit an dem Projekt zu erlauben, öffnen Sie seine Eigenschaften. Hier kann man konkreten Nutzern Zugriffsrechte erteilen, indem man ihre Benutzernamen bei der MQL5.community angibt, sowie gemeinsame Parameter der Gruppenarbeit setzen:

    • Privates Projekt
    • Jeder darf am Projekt teilnehmen
    • Teilnahme am Projekt auf Anfrage




    Einfachheitshalber wird die finale ausführbare Datei (EX5) bei der Kompilierung je nach dem Typ des Programms in den Ordner Experts, Indicators oder Scripts automatisch kopiert. Auf diese Weise können Sie das Programm direkt im Terminal starten, ohne es manuell in das benötigte Verzeichnis kopieren zu müssen.


    Öffentliche Projekte im MQL5 Storage: Details der Arbeit

    Wie bereits oben erwähnt, kann man für jedes Gruppenprojekt im MQL5 Storage einstellen, wer auf das Projekt zugreifen kann: das Projekt kann privat sein oder offen für die Teilnahme anderer Nutzer. Nun werden alle Projekte, an denen jeder teilnehmen darf, im separaten Reiter "Öffentliche Projekte" angezeigt.

    Jeder kann ein interessantes Projekt für sich finden und sich an der Entwicklung beteiligen. Klicken Sie auf "Teilnehmen" und erhalten Sie das Projekt aus dem Storage.





    Jeder Teilnehmer erhält nur Leserechte. Um die Rechte zu erhalten, eigene Änderungen im Storage vorzunehmen, wenden Sie sich an den Autor des Projekts. Um seinen bzw. ihren Benutzernamen zu erfahren, öffnen Sie die Eigenschaften des Projekts über das Kontextmenü.

  2. Es wurde die Möglichkeit hinzugefügt, verschiedene Eigenschaften und Ressourcen in den Code des Programms ganz einfach einzufügen. Sie können zum Beispiel eine Include-Datei ganz schnell in den Code einfügen. Wählen Sie "Einfügen — MQH als #incude" und danach die gewünschte Include-Datei im erschienenen Fenster aus. Danach wird die Anweisung #include mit dem richtig angegebenen Pfad zur ausgewählten Datei in den Code des Programms eingefügt.




    Über dieses Menü können Sie auch Dateien als ein binäres Array oder ein Text-Array in den Code eines Programms einfügen. Sie können zum Beispiel Vorlagen von Charts samt Expert Advisors/Indikatoren übertragen: fügen Sie ihre Vorlage in den Code des Programms als Array ein und speichern Sie ihn mithilfe der FileSave Funktion auf der Festplatte. Danach kann man die Vorlage direkt aus dem Expert Advisor mithilfe der Funktion ChartApplyTemplate auf den Chart anwenden.
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
    //--- Template-Datei als binäres Array
       unsigned char my_template[]=
         {
          0xFF,0xFE,0x3C, ... ,0x00 // das Array im Beispiel wurde gekürzt
         };
    //--- Speichern und Anwenden des Templates
       if(FileSave("my_template.tpl",my_template))
         {
          Print("Custom template saved in \\MQL5\\Files");
          if(ChartApplyTemplate(0,"\\Files\\my_template.tpl"))
             Print("Custom template applied to the current chart");
          else
             Print("Failed to apply custom template");
         }
       else
          Print("Failed to save custom template");
      }

  3. Es wurde die Option hinzugefügt, Strings in die Formate ASCII, HEX und Base64 umzuwandeln. Wählen Sie einen String im Quellcode aus und klicken Sie auf den gewünschten Befehl im Menü "Bearbeiten — Umwandeln":




  4. Die Suche nach Dateien ohne Berücksichtigung der Groß- bzw. Kleinschreibung wurde korrigiert.
  5. Es wurde ein Fehler bei der Berechnung des Wertes eines Ausdrucks vom Typ x.y[0][1].z behoben.
  6. Die Navigation im Code mithilfe der Buttons "Weiter" und "Zurück" wurde korrigiert.

MQL5

  1. Es wurde ein neuer Online-Service für einen zusätzlichen Schutz von MQL5-Programmen hinzugefügt — MQL5 Cloud Protector. Dieser Schutz ist gleich dem Schutz, der im MetaTrader Market, dem größten Marktplatz von Handelsanwendungen, verwendet wird, wo die von Verkäufern eingereichten Produktdateien (EX5) in nativen Code kompiliert werden.

    Nun ist dieser Schutz für jeden Nutzers verfügbar. Man muss nur den Befehl Service — MQL5 Cloud Protector im MetaEditor ausführen. Der einzige Unterschied zum Schutz im Market besteht darin, dass die Datei nicht an den PC des Nutzers gebunden wird. Die durch den MQL5 Cloud Protector geschützten Dateien können auf allen Rechnern wie EX5-Dateien gestartet werden.
    MQL5 Cloud Protector ist ein sicherer Service. Ein zusätzlicher Schutz wird nur auf eine kompilierte Datei angewandt. Der Quellcode wird nicht an den Service weitergeleitet. Zuerst wird ein Programm in eine EX5-Datei auf dem PC des Nutzers kompiliert, danach wird die kompilierte Datei über einen verschlüsselten Kanal an den Service übertragen, geschützt und an den Nutzer zurückgeschickt.



  2. Es wurden Funktionen für das Arbeiten mit benutzerdefinierten Finanzinstrumenten hinzugefügt.

    Funktion Aktion
    CustomSymbolCreate Erstellt ein benutzerdefiniertes Symbol mit dem angegebenen Namen in der angegebenen Gruppe
    CustomSymbolDelete Löscht ein benutzerdefiniertes Symbol mit dem angegebenen Namen
    CustomSymbolSetInteger Setzt den Wert einer Eigenschaft vom ganzzahligen Typ für ein benutzerdefiniertes Symbol
    CustomSymbolSetDouble Setzt den Wert einer Eigenschaft vom reellen Typ für ein benutzerdefiniertes Symbol
    CustomSymbolSetString Setzt den Wert einer Eigenschaft vom String-Typ für ein benutzerdefiniertes Symbol
    CustomSymbolSetMarginRate Setzt den Koeffizienten der Margin je nach Typ und Richtung einer Order für ein benutzerdefiniertes Symbol
    CustomSymbolSetSessionQuote Setzt den Anfang und das Ende der angegebenen Notierungssitzung für das angegebene Symbol und Wochentag
    CustomSymbolSetSessionTrade Setzt den Anfang und das Ende der angegebenen Notierungssitzung für das angegebene Symbol und Wochentag
    CustomRatesDelete Löscht alle Balken im angegebenen Zeitintervall aus der Preishistorie des benutzerdefinierten Symbols
    CustomRatesReplace Ersetzt die komplette Preishistorie des benutzerdefinierten Symbols im angegebenen Zeitraum durch die Daten aus einem Array vom Typ MqlRates
    CustomRatesUpdate Fügt der Historie des benutzerdefinierten Symbols fehlende Balken hinzu und ersetzt die vorhandenen Balken durch die Daten aus dem Array vom Typ MqlRates
    CustomTicksAdd Fügt Daten aus einem Array vom Typ MqlTick zur Preis-Historie eines benutzerdefinierten Symbols hinzu. Das benutzerdefinierte Symbol muss in der Marktübersicht ausgewählt werden
    CustomTicksDelete Löscht alle Balken im angegebenen Zeitintervall aus der Preishistorie des benutzerdefinierten Symbols
    CustomTicksReplace Ersetzt die komplette Preishistorie des benutzerdefinierten Symbols im angegebenen Zeitraum durch die Daten aus einem Array vom Typ MqlTick

  3. Der Standardbibliothek wurden Template-Sammlungen von Daten hinzugefügt, die Klassen und Benutzeroberflächen für das Definieren von Sammlungen auf Basis von Templates beinhalten. Die neuen stark typisierten Sammlungen sind bequem für die Entwicklung von Programmen und zeigen eine hohe Leistung bei der Arbeit mit Daten.

    Die Bibliothek befindet sich im Verzeichnis des Terminals im Ordner Include\Generic.

  4. Es wurde die Unterstützung für Vorlagen für Daten vom Typ union hinzugefügt.
  5. Es wurde die Eigenschaft SYMBOL_VISIBLE hinzugefügt. Der Aufruf von SymbolInfoInteger(symbol, SYMBOL_VISIBLE) gibt false zurück, wenn das angegebene Symbol in der Marktübersicht nicht sichtbar ist.
  6. Es wurde das Ereignis CHARTEVENT_MOUSE_WHEEL hinzugefügt. Das Ereignis wird beim Scrollen oder beim Drücken auf das Mausrad auf dem Chart aufgerufen (wenn CHART_EVENT_MOUSE_WHEEL für ihn auf true gesetzt wurde).
  7. Es wurden neue Chart-Eigenschaften hinzugefügt:

    • CHART_EVENT_MOUSE_WHEEL — das Ereignis des Scrollens und Drückens auf das Mausrad auf dem Chart CHART_EVENT_MOUSE_WHEEL aktivieren/deaktivieren. Möglichen Werte: 0 und 1.
    • CHART_CROSSHAIR_TOOL — die Option der Umschaltung des Cursors in den Fadenkreuz-Modus durch das Drücken auf die mittlere Maustaste aktivieren/deaktivieren. Möglichen Werte: 0 und 1.
    • CHART_CONTEXT_MENU — die Anzeige des Kontextmenüs durch einen Klick auf die rechte Maustaste im Chart aktivieren/deaktivieren. Möglichen Werte: 0 und 1.

  8. Puffer mit dem Stil DRAW_NONE werden nun bei der Berechnung des Maßstabs des Indikatorsfensters nicht berechnet.
  9. Es wurde die Erzeugung des Ereignisses CHARTEVENT_CHART_CHANGE beim Setzen von CHART_SCALEFIX (fester Maßstab) für den Chart hinzugefügt.
  10. Es wurde die Funktion ArraySwap hinzugefügt, die es erlaubt, den Inhalt dynamischer Arrays schnell zu verschieben.
    bool  ArraySwap(
       void&  array1[],      // erstes Array
       void&  array2[]       // zweites Array
       );
    Die Funktion akzeptiert dynamische Arrays von einem Typ und einer Dimension. Für mehrdimensionale Arrays muss die Anzahl der Elemente in allen Dimensionen außer der ersten gleich sein.

  11. Es wurde die neue Eigenschaft TERMINAL_RETRANSMISSION hinzugefügt. Sie zeigt den Anteil von erneut gesendeten Netzwerkpaketen (Retransmits) im TCP/IP Protokoll für alle laufenden Anwendungen und Services auf dem PC. Auch in einem schnellen und richtig konfigurierten Netzwerk kann es zu Paketverlusten kommen, als Ergebnis gibt es keine Bestätigungen über die Zustellung von Paketen zwischen dem Empfänger und dem Sender. In solchen Fällen werden die "verloren gegangenen" Pakete erneut gesendet.

    Das Terminal berechnet diesen Wert nicht, er wird einmal pro Minute aus dem Betriebssystem abgerufen. Das ist kein Indikator der Verbindungsqualität zwischen einem konkreten Terminal und eines konkreten Handelsservers, denn er wird für die ganze Netzwerkaktivität berechnet, einschließlich Systemaktivität und Hintergrundsaktivität.

    Die Eigenschaft TERMINAL_RETRANSMISSION wurde zur Aufzählung ENUM_TERMINAL_INFO_DOUBLE hinzugefügt. Die Eigenschaft wird über die Funktion TerminalInfoDouble abgefragt.
  12. Das Arbeiten mit der Handelshistorie wurde verbessert.

Signale

  1. Die Angabe des Typs der Orderausführung (filling) bei erzwungenem Schließen von den nach einem Signal eröffneten Positionen wurde korrigiert. In den Einstellungen des Kopierens von Signalen gibt es die Option "Stop, wenn Kontostand unter XXX USD": wenn das Geld auf dem Konto unterhalb des angegebenen Levels liegt, wird das Kopieren von Handelssignalen automatisch beendet, alle Positionen werden zwingend geschlossen. Früher wurde in einigen Fällen beim erzwungenen Schließen von Positionen der Ausführungstyp für Orders falsch angegeben. Nun überprüft das Terminal die erlaubten Ausführungstypen in den Einstellungen des Symbols und gibt eine zulässige Variante an.

Tester

  1. Das Verhalten der Funktion HistoryOrderSelect im Strategietester entspricht nun dem Verhalten der gleichen Funktion im Kundenterminal.
  2. Das Verhalten der Funktionen CopyTicks und CopyTicksRange im Strategietester entspricht nun den gleichen Funktionen im Kundenterminal.
  3. Die Anzeige grafischer Objekte beim Testen im visuellen Modus wurde optimiert.
  4. Die Anzeige grafischer Objekte beim Testen im visuellen Modus wurde optimiert (mit dem börslichen Risikomanagementsystem). Nun wird nur Kapital (Equity) auf dem Chart angezeigt, Kontostand und Deposit Load werden nicht angezeigt. Der Handelsstatus solcher Konten wird nach Equity bewertet. Der Kontostand zeigt nur die Menge der Eigenmittel auf dem Konto und berücksichtigt nicht Vermögenswerte und finanzielle Verbindlichkeiten des Händlers. Deposit Load (margin/equity) wird nicht angezeigt, weil die Margin bei der Berechnung an der Börse den aktuellen Preis eines Vermögenswertes/einer Verbindlichkeit darstellt, und er verändert sich mit Equity.

  • Es wurde eine Übersetzung der Benutzeroberfläche ins Holländische hinzugefügt.
  • Die Dokumentation wurde aktualisiert.


21 Juli 2017
Neues MetaTrader 5 Build 1640: Erstellen und Testen benutzerdefinierter Finanzinstrumente

Terminal

  1. Es wurde die Option hinzugefügt, benutzerdefinierte Finanzinstrumente zu erstellen. Nun können Sie jedes Symbol erstellen, seine Einstellungen konfigurieren, eigene Preisdaten importieren und seine Charts ansehen.

    Erstellung eines benutzerdefinierten Symbols
    Öffnen Sie das Fenster der Verwaltung von Symbolen über das Kontextmenü "Marktübersicht" und klicken Sie auf "Symbol erstellen":


    Ihnen stehen zahlreiche Parameter zur Verfügung. Die Liste der Parameter und deren Beschreibung können Sie sich in der Dokumentation anschauen. Sie können ganz schnell ein eigenes Symbol konfigurieren — kopieren Sie Parameter eines ähnlichen Symbols und modifizieren Sie sie. Dafür wählen Sie ein vorhandenes Symbol im Feld "Kopieren aus" aus.
    Der Name des benutzerdefinierten Symbols darf nicht mit den Namen der vom Broker bereitgestellten Symbolen zusammenfallen. Wenn Sie sich mit dem Server verbinden, auf welchem ein Symbol vorhanden ist, dessen Name mit dem benutzerdefinierten Symbol zusammenfällt, wird das benutzerdefinierte Symbol gelöscht.
    Die Befehle für den Import und Export von Einstellungen sind auch hier verfügbar. Sie können benutzerdefinierte Symbole teilen und diese zwischen Ihren Terminals übertragen. Die Einstellungen werden in Textdateien im JSON-Format exportiert.

    Verwaltung benutzerdefinierter Symbole
    Alle Symbole werden in der separaten Gruppe "Custom" angezeigt. Um ein Symbol zu ändern oder zu löschen, verwenden Sie das Kontexmenü in der Liste:



    Import der Preishistorie
    Sie können Kursdaten aus jeder Textdatei sowie aus Historiedateien des MetaTrader 5 HST und HCC ins eigene Symbol importieren. Wählen Sie ein Symbol aus und gehen Sie zum Reiter "Balken".


    Geben Sie den Pfad zur Datei mit den Daten im Importdialog an und setzen Sie die Einstellungen:

    • Trennzeichen — Trennzeichen für Elemente in einer Textdatei.
    • Auslassung von Spalten und Zeilen — Anzahl der Spalten (von links nach rechts) und Zeilen (von oben nach unten), die man beim Import auslassen muss.
    • Verschiebung — Zeitverschiebung nach Stunden. Diese Option wird beim Importieren von Daten verwendet, die in einer anderen Zeitzone gespeichert wurden.
    • Nur ausgewählte — diese Option ermöglicht es, nur die im Ansichtsfenster ausgewählten Zeilen zu importieren. Die Zeilen können mit der Maus ausgewählt werden, während man die Taste "Ctrl" oder "Shift" drückt und hält.

    Die Datei mit Minutenbalken muss folgendes Format haben: Datum Zeit Open High Low Close Tickvolumen Volumen Spread. Zum Beispiel:
    S2016.06.27    00:01:00    1.10024    1.10136    1.10024    1.10070    18    54000000    44
    2016.06.27    00:02:00    1.10070    1.10165    1.10070    1.10165    32    55575000    46
    2016.06.27    00:03:00    1.10166    1.10166    1.10136    1.10163    13    13000000    46
    2016.06.27    00:04:00    1.10163    1.10204    1.10155    1.10160    23    51000000    41
    Für ein benutzerdefiniertes Symbol können Sie die Daten jedes existierenden Symbols verwenden. Exportieren Sie sie (diese Option wurde in der vorherigen Version der Plattform hinzugefügt), modifizieren sie wenn nötig und importieren sie zurück.
    In MetaTrader 5 wird die Preishistorie als Minutenbalken gespeichert. Alle anderen Zeitrahmen werden basierend auf Minutenbalken erstellt. Beim Import können Sie auch Daten höherer Zeitrahmen verwenden, man muss aber dabei beachten, dass die Grafiken kleinerer Zeitrahmen dabei Lücken haben werden. Beim Import von Stundendaten, zum Beispiel, sehen Sie je einen Balken für jede Stunde auf einem Minutenchart.
    Die Preisdaten benutzerdefinierter Symbole werden in einem separaten Verzeichnis Custom (nicht in den Verzeichnissen für die Daten konkreter Handelsservern) gespeichert:
    C:\Users\[windows account]\AppData\Roaming\MetaQuotes\Terminal\[instance id]\bases\Custom

    Verwendung benutzerdefinierter Symbole
    Die Verwendung eigener Symbole unterscheidet sich kaum von der Verwendung von Symbolen, die vom Broker bereitgestellt werden. Sie werden auch im Markrübersicht-Fenster angezeigt, und man kann sich ihre Charts ansehen, auf welche Indikatoren und analytische Objekte gezogen werden können. Dabei kann man benutzerdefinierte Symbole nicht handeln.

    Testen von Strategien anhand benutzerdefinierter Symbole
    Benutzerdefinierte Symbole kann man für das Testen von Handelsrobotern und Indikatoren im Strategietester verwenden. Dies ermöglicht es, Strategien auch für die Symbole zu optimieren, die momentan beim Broker nicht verfügbar sind. Man muss nur die Historie richtig importieren und die Eigenschaften eines benutzerdefinierten Symbols einstellen.

     

    Der Strategietester verwendet automatisch bei der Berechnung der Margin und des Profits verfügbare Kreuzkurse. Wir haben zum Beispiel das Symbol AUDCAD.custom mit dem Typ der Marginberechnung Forex erstellt, unsere Kontowährung ist USD. Der Tester sucht die benötigten Symbole basierend auf dem Namen des Forex-Symbols wie folgt:
    1.     zuerst werden die Symbole vom Typ AUDUSD.custom (für die Berechnung der Margin) und USDCAD.custom (für die Berechnung des Profits) gesucht
    2.     danach, wenn einer der Symbole nicht vorhanden ist, wird das erste Symbol gesucht, das den benötigten Währungspaaren dem Namen nach entspricht — jeweils AUDUSD und USDCAD. Es wurden, zum Beispiel, AUDUSD.b und NZDUSD.b gefunden, das heißt, die Kurse dieser Symbole werden bei der Berechnung der Margin und des Profits verwendet.

    Für Symbole mit anderen Typen der Marginberechnung (Futures, Stock Exchange) wird ein Währungspaar für die Umrechnung der Währung des Symbols in die Kontowährung benötigt. Wir haben zum Beispiel ein benutzerdefiniertes Symbol erstellt, die Währung des Profits und der Margin ist der britische Pfund (GBP), die Kontowährung ist der Schweizer Franken (CHF). In diesem Fall wird es nach Symbolen für das Testen wie folgt gesucht:
    1. Es wird geprüft, ob ein Symbol vorhanden ist, das dem Währungspaar GBPCHF (GBP vs CHF) entspricht.
    2. Wenn es kein entsprechendes Symbol gibt, wird das erste Symbol gesucht, das dem Währungspaar GBPCHF nach dem Namen entspricht, zum Beispiel, GBPCHF.b oder GBPCHF.def.

    Vergewissern Sie sich beim Testen anhand benutzerdefinierter Symbole, dass alle für Berechnungen notwendigen Währungspaare auf dem Konto vorhanden sind. Andernfalls wird die Berechnung von Finanzergebnissen und Marginanforderungen beim Testen nicht möglich.

    Mehr Möglichkeiten in den nächsten Versionen der Plattform
    Die Arbeit an benutzerdefinierten Symbolen ist noch nicht abgeschlossen, und in den weiteren Versionen der Plattform erscheinen neue Funktionen. Später wird die Option hinzugefügt, Historie in benutzerdefinierte Symbole direkt aus Expert Advisors zu importieren sowie Daten dieser Symbole in Echtzeit zu übertragen.

  2. Es wurde das Filtern von Abschlüssen nach Volumen hinzugefügt.

    Man kann Abschlüsse mit einem Volumen, das kleiner als das angegebene ist, in Time & Sales ausblenden. Auf diese Weise bleiben im Time & Sales Fenster nur große Abschlüsse, die den Markt am meisten beeinflussen.

    Doppelklicken Sie auf die erste Zeile im Time & Sales Fenster, geben Sie das minimale Volumen in Lots an und klicken Sie dann auf irgendeinen anderen Bereich der Markttiefe. Die Abschlüsse werden ausgefiltert, und der aktuelle Wert des Filters erscheint in der Überschrift der Volumen-Spalte.


    Das minimale Volumen kann auch über das Kontextmenü von Time & Sales angegeben werden.

  3. Es wurde die Option hinzugefügt, die Markttiefe an einen aktiven Chart einzubinden. Jedes Mal, wenn Sie zum Chart eines Symbols wechseln, wird das gleiche Symbol in der Markttiefe automatisch aktiviert. Sie brauchen nicht mehr die Markttiefe für jedes neue Symbol zu öffnen.


  4. Die Aktualisierung von Werkzeugleisten nach dem Minimieren und Maximieren des Terminalfensters wurde korrigiert.
  5. Die Generierung der Handelshistorie von Positionen wurde beim Überschneiden der Tickets von Abschlüssen und Positionen korrigiert.

MQL5

  1. Es wurde die Möglichkeit hinzugefügt, MQL5-Programme auf Preishistorie zu profilieren. Dies ermöglicht es, die Performance von Programmen schnell zu überprüfen, ohne auf neue Ticks zu warten.

    Beim Profiling anhand realer Daten wird das Programm auf einem einfachen Chart im Terminal gestartet. Viele Programme, insbesondere Indikatoren, führen Berechnungen erst beim Eintreffen eines neuen Ticks durch (OnTick, OnCalculate). Daraus folgt, dass man für die Einschätzung der Performance auf das Eintreffen neuer Ticks in Echtzeit warten muss. Beim Testen anhand historischer Daten können Sie die richtige Belastung geben. Das Profiling wird im visuellen Modus im Strategietester gestartet, und Sie erhalten sofort viele Ereignisse des Eintreffens eines neuen Ticks.


  2. Es wurde die Unterstützung für Unions hinzugefügt. Eine Union stellt einen besonderen Datentyp dar und setzt sich aus mehreren Variablen zusammen, die sich denselben Speicherbereich teilen. Daraus folgt, dass eine Union die Interpretation einer und derselben Reihenfolge der Bytes auf zwei (oder mehr) verschiedenen Weisen ermöglicht. Die Deklaration einer Union beginnt mit dem Schlüsselwort union.
    union LongDouble
    {
      long   long_value;
      double double_value;
    };
    Im Gegensatz zu Strukturen, gehören verschiedene Komponenten einer Union zu demselben Speicherbereich. In diesem Beispiel wurde die LongDouble Union deklariert, in welcher sich der Wert vom Typ long und der Wert vom Typ double einen Speicherbereich teilen. Man muss sich im Klaren sein, diese Union kann nicht gleichzeitig den gannzahligen Wert long und den reelen Wert double speichern (wie es in Strukturen der Fall ist), denn die Variablen long_value und double_value überschneiden sich (im Speicher). Das MQL5-Programm kann aber jederzeit die Information, die die Union beinhaltet, als einen ganzzahligen (long) oder reellen Wert (double) bearbeiten. Daraus folgt, dass die Union die Interpretation einer und derselben Reihenfolge von Daten auf zwei (oder mehr) verschiedenen Weisen ermöglicht.

    Bei der Deklaration einer Union reserviert der Compiler automatisch einen Speicherbereich, der für das Speichern des größten Typs nach Volumen in der Union der Variablen ausreichend ist. Für den Zugang zu einem Element der Union wird die gleiche Syntax wie für Strukturen verwendet, und zwar der Point-Operator.
    union LongDouble
    {
      long   long_value;
      double double_value;
    };
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
    //---
       LongDouble lb;
    //--- die ungültige Zahl -nan(ind) erhalten und ausgeben
       lb.double_value=MathArcsin(2.0);
       printf("1.  double=%f                integer=%I64X",lb.double_value,lb.long_value);
    //--- die größte normalisierte Zahl (DBL_MAX)
       lb.long_value=0x7FEFFFFFFFFFFFFF;
       printf("2.  double=%.16e  integer=%I64X",lb.double_value,lb.long_value);
    //--- die kleinste positive normalisierte Zahl (DBL_MIN)
       lb.long_value=0x0010000000000000;    
       printf("3.  double=%.16e  integer=%.16I64X",lb.double_value,lb.long_value);
      }
    /*   Das Ergebnis der Ausführung
        1.  double=-nan(ind)                integer=FFF8000000000000
        2.  double=1.7976931348623157e+308  integer=7FEFFFFFFFFFFFFF
        3.  double=2.2250738585072014e-308  integer=0010000000000000
    */

  3. Es wurde die automatische Generierung eines impliziten Copy Operators für Objekte von Strukturen und Klassen hinzugefügt. Nun erstellt der Compiler Copy Operators automatisch, was das Schreiben einfacher Einträge vom Typ b=a für Objekte ermöglicht:
    class Foo
      {
       int               value;
    public:
       string Description(void){return IntegerToString(value);};
       //--- Konstruktor standardmäßig
                         Foo(void){value=-1;};
       //--- Konstruktor mit Parametern   
                         Foo(int v){value=v;};
      };
    //+------------------------------------------------------------------+
    //|   Struktur, die Objekte vom Typ Foo beinhaltet                   |
    //+------------------------------------------------------------------+
    struct MyStruct
      {
       string            s;
       Foo               foo;
      };
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
    //---
       MyStruct a,b;
       Foo an_foo(5);
       a.s="test";
       a.foo=an_foo;
       Print("a.s=",a.s," a.foo.Description()=",a.foo.Description());
       Print("b.s=",b.s," b.foo.Description()=",b.foo.Description());
    //---
       Print("b=a");
       b=a;
    //---
       Print("a.s=",a.s," a.foo.Description()=",a.foo.Description());
       Print("b.s=",b.s," b.foo.Description()=",b.foo.Description());
    /*
       Das Ergebnis der Ausführung;
       a.s=test a.foo.Description()=5
       b.s= b.foo.Description()=-1
       b=a
       a.s=test a.foo.Description()=5
       b.s=test b.foo.Description()=5
    */
      }
    Im impliziten Operator wird das Kopieren von Objekten gliederweise bzw. "memberweise" umgesetzt.

    • Wenn ein Member das Objekt einer anderen Struktur oder Klasse ist, wird der entsprechende Copy Operator dieses Objekts aufgerufen.
    • Wenn ein Member ein Array von Objekten ist, wird das aufnehmende Array vor dem Aufruf des entsprechenden Copy Operators für jedes Element über Array Resize vergrößert oder verkleinert.
    • Wenn ein Member ein Array einfacher Typen ist, wird die Funktion ArrayCopy für das Kopieren verwendet.
    • Wenn ein Member ein Pointer auf ein Objekt ist, wird der Pointer und nicht das Objekt kopiert.

    Wenn nötig können Sie das Verhalten neu definieren und statt eines impliziten Copy Operators eine eigene Variante mithilfe der Überladung erstellen.

  4. Die Speichernutzung beim Abrufen der Preishistorie aus Expert Advisors mithilfe der Copy* Funkion wurde optimiert. Bei der Arbeit mit großen Datenmengen wird der Speicherverbrauch vielfach reduziert.

  5. Nun gibt die TimeToStruct Funktion den Booleschen Wert zurück und ermöglicht es zu überprüfen, ob datetime in MqlDateTime erfolgreich umgewandelt wurde.
  6. Es wurde ein Verbot für die Verwendung der Funktionen FileWriteStruct und FileReadStruct für Strukturen, die Zeilen, dynamische Arrays, Objekte und Pointer hinzugefügt.
  7. Es wurden folgende Statuscodes hinzugefügt:

    • TRADE_RETCODE_REJECT_CANCEL — die Anfrage auf die Aktivierung einer Pending Order abgelehnt, die Order gelöscht
    • TRADE_RETCODE_LONG_ONLY — die Anfrage wurde abgelehnt, weil die Regel "Nur Long-Positionen erlaubt" auf dem Symbol gesetzt wurde
    • TRADE_RETCODE_SHORT_ONLY — die Anfrage wurde abgelehnt, weil die Regel "Nur Short-Positionen erlaubt" auf dem Symbol gesetzt wurde
    • TRADE_RETCODE_CLOSE_ONLY — die Anfrage wurde abgelehnt, weil die Regel "Nur das Schließen existierender Positionen erlaubt" auf dem Symbol gesetzt wurde

  8. Es wurde ein neuer Wert hinzugefügt, den die Funktion SymbolInfoInteger mit dem Parameter SYMBOL_ORDER_MODE zurückgibt. SYMBOL_ORDER_CLOSEBY — Erlaubnis einer Close By Operation - Schließen einer Position durch eine Gegenposition (Close By).
  9. Der Aufzählung ENUM_SYMBOL_INFO_INTEGER wurde die Boolesche Eigenschaft SYMBOL_CUSTOM hinzugefügt. Dies erlaubt es zu erfahren, ob das Symbol benutzerdefiniert ist. Für das Erhalten der Eigenschaft verwenden Sie die Funktion SymbolInfoInteger.
  10. Es wurde die Option hinzugefügt, den Grund der Erstellung einer Order, eines Abschlusses und einer Position zu erfahren.

    Neue Eigenschaften

    • Es wurde die neue Eigenschaft POSITION_REASON für Positionen hinzugefügt, die man mithilfe von PositionGetInteger erhalten kann.
    • Für Abschlüsse wurde die Eigenschaft DEAL_REASON hinzugefügt, die man mithilfe von HistoryDealGetInteger erhalten kann.
    • Es wurde die Eigenschaft ORDER_REASON für Orders hinzugefügt, die man mithilfe von OrderGetInteger und HistoryOrderGetInteger erhalten kann.

    Grund der Erstellung einer Order, eines Abschlusses und einer Position
    Für das Erhalten von Gründen der Erstellung von Transaktionen wurden drei Aufzählungen hinzugefügt:

    ENUM_POSITION_REASON ENUM_DEAL_REASON ENUM_ORDER_REASON Beschreibung des Grunds
    POSITION_REASON_CLIENT DEAL_REASON_CLIENT ORDER_REASON_CLIENT Die Operation wurde infolge der Auslösung einer Order ausgeführt, die einem Desktop-Terminal platziert wurde
    POSITION_REASON_MOBILE DEAL_REASON_MOBILE ORDER_REASON_MOBILE Die Operation wurde infolge der Auslösung einer Order ausgeführt, die in einer mobilen Anwendung platziert wurde
    POSITION_REASON_WEB DEAL_REASON_WEB ORDER_REASON_WEB Die Operation wurde infolge der Auslösung einer Order ausgeführt, die auf der Webplattform platziert wurde
    POSITION_REASON_EXPERT DEAL_REASON_EXPERT ORDER_REASON_EXPERT Die Operation wurde infolge der Auslösung einer Order ausgeführt, die durch ein MQL5-Programm - einen Expert Advisor oder ein Script platziert wurde
    - DEAL_REASON_SL ORDER_REASON_SL Die Operation wurde infolge der Auslösung von Stop Loss durchgeführt
    - DEAL_REASON_TP ORDER_REASON_TP Die Operation wurde infolge der Auslösung von Take Profit durchgeführt
    - DEAL_REASON_SO ORDER_REASON_SO Die Operation wurde infolge des Ereignisses Stop Out ausgeführt
    - DEAL_REASON_ROLLOVER - Der Abschluss wurde infolge eines Rollovers ausgeführt
    - DEAL_REASON_VMARGIN - Der Abschluss wurde infolge der Anrechnung/Abbuchung der Variation Margin ausgeführt
    - DEAL_REASON_SPLIT - Der Abschluss wurde nach einem Split (Preissenkung) einer Aktie oder eines Vermögenswertes ausgeführt, auf welcher(m) es eine offene Position im Moment der Ankündigung des Splits gab

  11. Die Synchronisierung und der Zugriff auf die Tickhistorie wurden optimiert.
  12. Es wurde der Fehler der Rückgabe von Ticks ins statische Array in der CopyTicksRange Funktion behoben. Früher wurden in diesem Fall immer 0 Ticks zurückgegeben.
  13. Zahlreiche Verbesserungen in der Bibliothek der Fuzzy-Logik.

Signale

  1. Das Öffnen eines Signals auf der Webseite wurde korrigiert, wenn kein Handelskonto verbunden ist.

Tester

  1. Die Arbeit mit der Historie von Orders und Abschlüssen wurde optimiert und deutlich beschleunigt. Bei der Arbeit mit großen Datenmengen (Zigtausende Einträge in der Historie und mehr) wird die Geschwindigkeit um das Vielfache erhöht.
  2. Die Berechnung der Haltezeit einer Position im Testbericht wurde korrigiert.

MetaEditor

  1. Die Anzeige statischer Arrays-Members einer Klasse im Debugger wurde korrigiert.
  2. Es wurde die Liste aller Haltepunkte im Programm hinzugefügt, das debuggt wird. Um zur Liste zu wechseln, verwenden Sie das Kontextmenü des Reiters "Debugging":


    Sie können zu jedem Haltepunkt durch einen Doppelklick gelangen.
Die Dokumentation wurde aktualisiert.


26 April 2017
MetaTrader 5 build 1596: Zugang zu Preishistorie

Terminal

  1. Es wurde der Zugang zur Balken- und Tick-Historie hinzugefügt. Nun kann man die ganze 1-Minute- und Tick-Historie vom Server nicht nur mithilfe der MQL5 Sprache, sondern auch über das Interface der Handelsplattform herunterladen. Der Zugang zu Preisdaten wird im Rahmen der Vorbereitung auf die Einführung benutzerdefinierter Funktionen von Datenquellen erweitert. In Kürze wird auf der Plattform die Option verfügbar sein, Charts basierend auf eigenen Preisdaten zu zeichnen, synthetische Symbole zu erstellen und offline Charts zu nutzen.

    Um die Daten herunterzuladen, öffnen Sie den Dialog der Verwaltung von Symbolen im Kontextmenü "Marktübersicht":


    Nun sind hier zwei neue Tabs verfügbar: "Balken" und "Ticks". Wählen Sie ein Symbol und einen Zeitraum aus und klicken Sie auf "Abrufen". Die Plattform ruft alle verfügbaren Daten vom Server ab oder zeigt sie sofort an, wenn diese bereits heruntergeladen wurden. Gespeicherte Preisdaten können in eine CSV-Datei exportiert werden.

  2. Die Zeit wird nun bis auf Millisekunden für Positionen, Trades und Orders angezeigt.




  3. Im Dialog "Handel" wurde die Benachrichtigung über die Ablehnung der Ausführung einer Close By Anfrage (Schließen einer Position zur Gegenposition) korrigiert.

MQL5

  1. Die PositionSelect Funktion wurde korrigiert. In einigen Fällen wurde nicht die Position mit dem kleinsten Ticket ausgewählt.
  2. Die Funktionen CopyTicks und CopyTicksRange wurden beim Abruf einer sehr tiefen Tick-Historie korrigiert.

Signals

  1. Es wurde ein Fehler beim Kopieren von Signalen bei der Erhöhung einer bereits vorhandenen Position behoben. Der Fehler trat in einigen Fällen auf Netting-Konten auf.

Tester

  1. Die Bearbeitung von Limit Orders wurde für börsengehandelte Instrumente korrigiert. Die Orders, die zu einem günstigeren Preis als der Marktpreis platziert wurden (der Kaufpreis ist niedriger als der Marktpreis bzw. der Verkaufpreis ist höher als der Marktpreis) werden ohne Slippage ausgeführt. Die Order, die zu einem schlechteren Preis als der Marktpreis oder zum Marktpreis platziert wurden, werden direkt nach dem Platzieren zum Marktpreis im Moment des Platzierens ausgeführt.

Die Dokumentation wurde aktualisiert.

24 März 2017
Neues MetaTrader 5 Build 1570: Verbesserung des Market-Schaufensters und Erweiterung von Funktionstemplates in MQL5

Terminal

  1. Das Schaufenster des MetaTrader Markets für Applikationen wurde aktualisiert. Nun ist es einfacher Handelsroboter und technische Indikatoren auszuwählen. Wir haben das Design aktualisiert und Produktaufstellung hinzugefügt:

    • Auf der Startseite werden nun populäre Expert Advisors, Indikatoren, Neuheiten und kostenlose Top Apps angezeigt.
    • In den Kategorien Expert Advisors, Indikatoren und Utilitys gibt es jetzt Untergruppen: Grid und Hedging Roboter, Trend und Multicurrency Indikatoren und vieles mehr.



  2. Die Aktualisierung des Kundenterminals und das Arbeiten integrierter Käufe im Market, Signalen und Virtual Hosting bei der Verwendung eines Accounts mit beschränkten Rechten wurde korrigiert.
  3. Es wurde ein Fehler behoben, der in einigen Fällen zu einer falschen Sortierung der Historie von Positionen geführt hatte.
  4. Die Anzeige des Tabs "Aktiva" wurde optimiert und korrigiert.

MQL5

  1. Es wurde die Unterstützung für das Überladen von Funktionstemplates nach Parametern hinzugefügt. Es gibt zum Beispiel ein Funktionstemplate, das den Wert des zweiten Parameters in den ersten Parameter anhand der expliziter Typenumwandlung schreibt. In der MQL5-Programmiersprache ist es verboten, den string Typ in den bool Typ umzuwandeln, wir können das aber selbst tun. Erstellen wir das Überladen eines Funktionstempaltes:
    //+------------------------------------------------------------------+
    //| Template-Funktion                                                |
    //+------------------------------------------------------------------+
    template<typename T1,typename T2>
    string Assign(T1 &var1,T2 var2)
      {
       var1=(T1)var2;
       return(__FUNCSIG__);
      }
    //+------------------------------------------------------------------+
    //| Spezielle Überladung für den Fall bool+string                    |
    //+------------------------------------------------------------------+
    string Assign(bool &var1,string var2)
      {
       var1=(StringCompare(var2,"true",false) || StringToInteger(var2)!=0);
       return(__FUNCSIG__);
      }
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       int i;
       bool b;
       Print(Assign(i,"test"));
       Print(Assign(b,"test"));
      }
    Als Ergebnis der Ausführung dieses Codes sehen wir, dass für das Paar int+string das Funktionstemplate Assign() verwendet wurde, und dass beim zweiten Aufruf für das Paar bool+string bereits die überladene Version verwendet wurde.
    string Assign<int,string>(int&,string)
    string Assign(bool&,string)

  2. Es wurde die Option der expliziten Spezialisierung von Funktionstemplates hinzugefügt. Dafür müssen die Parameter der Typisierung vor der Liste der Aufrufparameter angegeben werden:
    template<typename T>
    T Func() { return (T)0; }
      
      
    void OnInit()
      {
       Func<double>();   // explizite Spezialisierung von Funktionstemplates
      }
    Auf diese Weise erfolgt die Spezialisierung nicht durch die Aufrufparameter, sondern durch eine explizite Angabe der Typen.

  3. Die Anzeige benutzerdefinierter Indikatoren mit dem DRAW_ZIGZAG Zeichnungstypwurde optimiert.
  4. Zur Aufzählung der Abschlusstypen ENUM_DEAL_TYPE wurden neue Werte hinzugefügt:

    • DEAL_DIVIDEND — Anrechnung der Dividende.
    • DEAL_DIVIDEND_FRANKED — Anrechnung von "franked dividends" (nicht besteuert, das Unternehmen bezahlt die Steuer für den Kunden).
    • DEAL_TAX — Steuerabzug.

  5. Die Anzeige benutzerdefinierter Indikatoren mit dem DRAW_FILLING Zeichnungstyp wurde korrigiert. Wenn die Koordinaten der oberen und der unteren Linien zusammenfallen, wird eine dünne Linie gezeichnet.
  6. Die Berechnung der Koordinaten des Objekts "Bitmap Label" wurde beim Setzen des Parameters CHART_SHOW auf false korrigiert. Dieser Parameter wird durch die ChartSetInteger Funktion gesetzt und ermöglicht es, alle Elemente des Preischarts für die Erstellung eines eigenes Interfaces des Programms auszublenden.
  7. Es wurde der Fehler der Codierung von 24-Bit-Bildern behoben, wenn diese in die Ressourcen einer MQL5-Applikation platziert werden.
  8. Es wurde der Fehler der Ausgabe von Strukturen mithilfe der ArrayPrint Funktion behoben.
  9. Die MQL5 Standardbibliotheken wurden aktualisiert.

MetaEditor

  1. Es wurde eine Übersetzung der Benutzeroberfläche ins Malaiische hinzugefügt.

Signals

  1. Das Öffnen der Seite eines Signals im Terminal infolge des Klickens auf den Link auf der MQL5.community Webseite, wenn kein Handelskonto verbunden ist, wurde korrigiert.

Tester

  1. Es wurden Fehler bei der Arbeit der CopyTicks Funktion im Strategietester behoben.
  2. Die Sortierung von Trades vom Typ "Auszahlung" (Withdrawal) wurde bei der Generierung eines Testberichts korrigiert.
  3. Die Modifizierung von Pending Orders wurde korrigiert.

Hosting

  1. Die Anzeige von Virtual Hosting Wizard wurde auf Bildschirmen mit ultra hohen Auflösung (4K) wurde korrigiert.

Die Dokumentation wurde aktualisiert.

17 Februar 2017
Neues MetaTrader 5 Build 1545: Schneller Wechsel zwischen Fenstern und Änderung von Preisen mit der Maus

Terminal

  1. Nun kann man zwischen den Fenstern "Werkzeuge" und "Strategietester" schnell wechseln.



  2. Es wurde die Option hinzugefügt, Preise und Ordervolumen mit dem Mausrad zu ändern:




  3. Beim Übergang zum Download von Mobilterminals wird jetzt die Liste Ihrer Handelskonten gespeichert. Bei der weiteren Installation von MetaTrader 5 für iPhone oder Android auf einem Mobilgerät wird Ihnen eine fertige Liste der Server angezeigt. Sie können aktuelle Handelskonten schnell mit dem Terminal verbinden. Der Server des aktuell verbundenen Kontos wird als Erster im Mobilterminal angezeigt.




  4. Die Belastung auf das Terminal, die durch unsichtbare (minimierte) Charts und Objekte entstand, wurde erheblich reduziert.
  5. Es wurde ein Fehler behoben, der in einigen Fällen zu einer falschen Auslösung von Trailing Stops geführt hatte.
  6. Es wurde der Fehler der Filterung nach Symbol in der Handelshistorie behoben.
  7. Es wurde der Anzeigefehler des Feldes "Typ" in der Historie behoben.
  8. Es wurde ein Fehler bei der Darstellung der Handelshistorie in Form von Positionen behoben.
  9. Die Anzeige benutzerdefinierter Indikatoren mit den Zeichnungstypen DRAW_COLOR_LINE, DRAW_COLOR_ZIGZAG und DRAW_COLOR_SECTION unter Verwendung der Farbe CLR_NONE wurde korrigiert.

MQL5

  1. Es wurde ein Fehler bei der Typisierung von Vorlagen durch einen konstanten Pointer behoben.
  2. Die Kontrolle über den Zugang zu private und protected Mitgliedern einer Klasse wurde korrigiert.

Tester

  1. Die Auslösung von Limit Orders auf Börsensymbolen wurde korrigiert, wenn der Auslösungspreis der Order besser als der aktuelle Markt ist.
  2. Die Begrenzung für das Testen benutzerdefinierter Indikatoren mit über 64 Eingabeparametern wurde aufgehoben.
  3.  Es wurde eine Übersetzung der Benutzeroberfläche in Hindi hinzugefügt.

Die Dokumentation wurde aktualisiert.

27 Januar 2017
MetaTrader 5 Build 1525: Darstellung der Historie als Positionen und Verbesserung des Strategietesters

Terminal

  1. Es wurde die Darstellung der Handelshistorie in Form von Positionen hinzugefügt. Das Terminal sammelt Daten von Deals, die auf eine Position bezogen sind (Eröffnung, zusätzliches Volumen, Teilschließung und komplette Schließung) und gruppiert diese Daten in einer Eintragung, die die folgenden Details enthält:
    • Eröffnungs- und Schlusszeit der Position, die Zeit wird nach dem ersten und letzten Trade festgelegt Positionsgröße.
    • Positionsgröße. Wenn ein Teil der Position geschlossen wurde, werden das geschlossene Volumen und das ursprüngliche Volumen angezeigt
    • gewichteten Durchschnittspreis für das Eröffnen und Schließen der Position
    • Gesamtfinanzergebnis von Deals, die zur Position gehören




    Für Konten mit der Hedge-Option ist solche Darstellung von Positionen ähnlich der Kontohistorie in MetaTrader 4.



  2.   Es wurde ein neues Befehl für die Visualisierung von Deals auf dem Chart nach einem bestimmten Symbol hinzugefügt.

    • Um alle Abschlüsse für die gewählte Position/Symbol anzuzeigen, klicken Sie auf "[Symbolname] Deals hinzufügen". Die entsprechenden Deals werden auf allen offenen Charts des ausgewählten Symbols angezeigt. Wenn keine offenen Charts vorhanden sind, wird ein neuer Chart geöffnet.
    • Um alle Abschlüsse für alle Symbole aus der Historie anzuzeigen, klicken Sie auf "Alle Deals hinzufügen". Auf allen offenen Charts werden alle Deals für entsprechende Symbole angezeigt.




  3. Es wurde die Anzeige des internationalen Namens eines Finanzinstruments in der Kontraktspezifikation hinzugefügt sowie die Suchmöglichkeit nach dem internationalen Namen im Dialog der Verwaltung von Symbolen.




  4. Es wurde die Möglichkeit hinzugefügt, die Auflösung des Terminalfensters schnell zu setzen. Diese Funktion wird für diejenigen praktisch sein, die Videos aufnehmen. Im Menü stehen Ihnen die populärsten Auflösungen für die Veröffentlichung von Videos in verschiedenen Videoservices wie YouTube zur Verfügung.



  5. Vorlagen und Profile von Charts wurden aus [Terminal Data Folder\Profiles] nach [Terminal Data Folder\MQL5\Profiles] übertragen. Nun kann man Vorlagen ins MQL5 Storage ganz einfach hinzufügen und auf diese von beliebigen PCs zugreifen.

MQL5

  1. Es wurde die Unterstützung für Ressourcenvariablen hinzugefügt. Die Verwendung solcher Variablen kann die Entwicklung einiger Programme wesentlich vereinfachen. Sie können zum Beispiel, einen OpenCL-Code in einer separaten CL-Datei schreiben und dann diese Datei als String den Ressourcen ihres MQL5-Programms hinzufügen. Früher hat man einen solchen Code als eine große String-Variable beschreiben müssen.

    Deklaration der Ressourcenvariablen
    #resource path_to_resource_file als type_of_resource_variable name_of_resource_variable

    Eigenschaften
    • Die Kodierung von String-Dateien wird automatisch nach BOM (Überschrift) bestimmt. Wenn BOM fehlt, wird die Kodierung nach dem Inhalt ermittelt. Es werden die Kodierungen ANSI, UTF-8 und UTF-16 unterstützt. Alle Strings werden in Unicode umgewandelt.
    • Die Daten einer solchen Ressource können nur über eine Variable adressiert werden. Die automatische Adressierung über "::<resource name>" funktioniert nicht.
    • Der spezielle Typ der Ressourcenvariablen bitmap zeigt dem Compiler, dass die Ressource eine grafische Abbildung darstellt. In diesem Fall bekommt die Ressourcenvariable den Typ uint.
    • Bei der Verwendung einer 24-Bit-Abbildung wird die Komponente des Alpha-Kanals für alle seine Pixel auf 255 gesetzt.
    • Bei der Verwendung einer 32-Bit-Abbildung ohne Alpha-Kanal wird die Komponente des Alpha-Kanals für alle seine Pixel auch auf 255 gesetzt.
    • Bei der Verwendung einer 32-Bit-Abbildung mit dem Alpha-Kanal werden die Pixel nicht verarbeitet.
    • Die Array-Ressourcenvariable vom Typ bitmap kann zwei Dimensionen haben. In diesem Fall wird die Array-Größe als [Bildhöhe][Bildbreite] gesetzt.
    • Wenn das Arrays eindimensional ist, wird die Anzahl der Elemente als Bildhöhe*Bildbreite definiert.
    • Wenn die Dateigröße der Ressource keine Aliquote zur Größe des Elements des Arrays ist, werden die restlichen Daten abgeschnitten. Z.B. wenn die Dateigröße 14 Bytes beträgt, beläuft sich die Anzahl der Elemente für ein int Array auf 3, und die restlichen 2 Bytes (14 - sizeof(int)*3) werden abgeschnitten.
    Anwendungsbespiele
    #resource "data.bin" as int ExtData[]             // Deklaration des eindimensionalen Arrays vom nummerischen Typ, das Daten aus der Datei data.bin enthält
    #resource "data.bin" as MqlRates ExtData[]        // Deklaration des Arrays einfacher Strukturen, das Daten aus der Datei data.bin enthält
    
    #resource "data.txt" as string ExtCode            // Deklaration des Strings, der Daten aus der Datei data.txt enthält
    #resource "data.txt" as string ExtCode[]          // Deklaration eines Strings-Arrays, das Daten aus der Datei data.txt enthält
    
    #resource "image.bmp" as bitmap ExtBitmap[]       // Deklaration eines eindimensionalen Arrays, das die Bitmap aus der BMP Datei enthält, Arraygröße = height * width
    #resource "image.bmp" as bitmap ExtBitmap2[][]    // Deklaration des zweidimensionalen Arrays, das die Bitmap aus der BMP Datei enthält, Arraygröße [height][width]

  2. Es wurde die Eigenschaft CHART_SHOW für die Deaktivierung der Anzeige eines Charts hinzugefügt. Für das Erhalten und die Installation der Eigenschaft werden die Funktionen ChartGetInteger und ChartSetInteger verwendet.

    Wenn false, wird die Zeichnung jeglicher Attribute eines Preischarts deaktiviert und alle Randabstände des Charts werden entfernt: Zeit- und Preisskala, die Leiste der schnellen Navigation, Markierungen von Ereignissen im Kalender, Zeichen von Trades, Tooltips von Indikatoren und Balken, Unterfenster von Indikatoren, Histogramme der Volumina usw.
    Die Deaktivierung der Zeichnung stellt eine ideale Lösung für die Erstellung eines eigenen Interfaces unter Verwendung grafischer Ressourcen.

    Grafische Objekte werden unabhängig von dem gesetzten Wert der CHART_SHOW Eigenschaft gezeichnet.

  3. Es wurde die Eigenschaft CHART_KEYBOARD_CONTROL für die Aktivierung/Deaktivierung der Steuerung eines Charts mit der Tastatur ("Home", "End", "PageUp", "+", "-", "Pfeil nach oben" usw.) hinzugefügt. Wenn man CHART_KEYBOARD_CONTROL auf false setzt, kann man das Scrollen und die Skallierung des Charts deaktivieren, dabei kann man aber die Ereignisse des Drückens auf diese Tasten in OnChartEvent erhalten.

    Für das Erhalten und Setzen der Eigenschaft werden die Funktionen ChartGetInteger und ChartSetInteger verwendet.

  4. Es wurden neue Funktionen und Eigenschaften für Operationen mit OpenCL hinzugefügt.

    Neue Eigenschaften für das Arbeiten mit dem Speicher
    Mit CLGetInfoIntegrer kann man nun 4 neue Eigenschaften erhalten:
    • CL_DEVICE_MAX_WORK_GROUP_SIZE — die Gesamtzahl der lokalen Arbeitsgruppen, die für ein OpenCL Gerät verfügbar sind.
    • CL_KERNEL_WORK_GROUP_SIZE — die Gesamtzahl der lokalen Arbeitsgruppen, die für ein OpenCL Programm verfügbar sind.
    • CL_KERNEL_LOCAL_MEM_SIZE — die Größe des lokalen Speichers in Bytes, den ein OpenCL Programm für alle parallelen Auufgaben in einer Gruppe verwendet. Verwenden Sie CL_DEVICE_LOCAL_MEM_SIZE, um das verfügbare Maximum zu erhalten.
    • CL_KERNEL_PRIVATE_MEM_SIZE — minimale Größe des privaten Speichers in Bytes, die von jeder Aufgabe im Kernel des OpenCL Programms genutzt wird.

    bool CLExecutionStatus(int kernel)
    Gibt den Ausführungsstatus eines OpenCL Programms zurück. Als Parameter wird das Handle auf Kernel des OpenCL Programms übergeben.

    bool CLSetKernelArgMemLocal(int kernel_handle,int arg_index,ulong local_mem_size)
    Setzt den Puffer als Argument der kernel-Funktion. Als Parameter werden das Handle des Kernels des OpenCL Programms, Nummer des Arguments der OpenCL-Funktion und die Puffergröße übergeben.

  5. Es wurde der Antwortcode TRADE_RETCODE_LIMIT_POSITIONS hinzugefügt. Die Anzahl offener Positionen, die man gleichzeitig auf einem Konto haben kann, kann durch die Servereinstellungen begrenzt werden. Wenn die Grenze erreicht ist, gibt der Server beim Versuch, eine Order zu platzieren, den Fehler TRADE_RETCODE_LIMIT_POSITIONS zurück. Die Begrenzung funktioniert unterschiedlich je nach dem Typ der Verrechnung von Positionen:

    • Im Netting-Modus wird die Anzahl offener Positionen berücksichtigt. Beim Erreichen der Grenze erlaubt die Plattform keine neuen Orders zu platzieren, infolge deren sich die Anzahl der offenen Positionen erhöhen kann. Die Plattform erlaubt praktisch Orders nur für die Symbole zu platzieren, auf welchen es bereits offene Positionen gibt. Die aktuellen Pending Orders werden nicht berücksichtigt, weil deren Ausführung zur Änderung der aktuellen Positionen und nicht zur Erhöhung ihrer Anzahl führen kann.
    • Im Hedging-Modus werden neben den offenen Positionen auch platzierte Pending Orders berücksichtigt, denn ihre Auslösung immer zur Eröffnung einer offenen Position führt. Wenn die Grenze erreicht ist, erlaubt die Plattform keine Marktorders zur Eröffnung von Positionen sowie keine Pendig Orders zu eröffnen.

  6. Es wurde ein Fehler behoben, der in einigen Fallen zum Auslassen von Ticks in der Tick-Historie führte.
  7. Es wurden Fehler der indirekten Typisierung von Vorlagen behoben.
  8. Die Bibliothek der mathematischen Statistik wurde aktualisiert.
  9. Es wurde die Funktion TranslateKey hinzugefügt, die ein Unicode-Zeichen nach dem virtuellen Code der Taste unter Berücksichtigung der aktuellen Eingabesprache und des Status der Steuerungstasten zurückgibt. Die Funktion verwendet ToUnicodeEx für die Umwandlung der vom Nutzer gedrückten Tasten in Unicode-Zeichen.
    void OnChartEvent(const int id,const long& lparam,const double& dparam,const string& sparam)
      {
       if(id==CHARTEVENT_KEYDOWN)
         {
          short sym=TranslateKey((int)lparam);
          //--- wenn das eingegebene Zeichen erfolgreich in Unicode umgewandelt wurde      if(sym>0)
             Print(sym,"'",ShortToString(sym),"'");
          else
             Print("Error in TranslateKey for key=",lparam);
         }
      }

Market

  1. Das Öffnen der Produktseite beim Herunterladen einer Demoversion korrigiert.

Tester

  1. Nun werden Optimierungsergebnisse nach der Spalte "Ergebnisse" automatisch sortiert.
  2. Es wurde die Option der automatischen Umschaltung auf Ergebnisse nach dem Beenden der Optimierung hinzugefügt.
  3. Der Strategietester bleibt nun im Optimierungsmodus nach dem Start eines einzelnen Tests. Früher wechselte der Strategietester zum Modus des Einzeltests, wenn ein Einzeltest aus dem Ergebnisse-Reiter gestartet wurde. Für die erneute Optimierung musste man früher diese in den Einstellungen wieder starten.
  4. Jetzt kann man Sets von Parametern nicht nur als set-Dateien, sondern auch als Einstellungen des lokalen Strategietesters mit einem einfachen Zugriff über das Kontextmenü speichern.




  5. Es wurde eine Übersetzung ins Mongolische, Ungarische, Rumänische und Urdu hinzugefügt.

MetaEditor

  1. Es wurde die Möglichkeit hinzugefügt, die Reihenfolge betrachtender Ausdrücke im Debug-Fenster zu ändern. Bewegen Sie einfach den Ausdruck zur gewünschten Position.




  2. Es wurde der Fehler der Erkennung der Kodierung von Quelldateien behoben.
  3. Die Suche nach Dateien wurde in der UTF-8-Kodierung korrigiert.
  4. Es wurde der Fehler der Hervorhebung eines Textes mit Tabulatoren mit der Maus behoben.
  5. Es wurde eine Übersetzung ins Ungarische und Rumänische hinzugefügt.

Die Dokumentation wurde aktualisiert.

9 Dezember 2016
MetaTrader 5 Build 1495: Verbesserungen in MQL5 für die benutzerdefinierte Grafik

MQL5

  1. Es wurde die Funktion CopyTicksRange hinzugefügt.
  2. Es wurden verbesserte Glättungsfunktionen der CCanvas Klasse hinzugefügt:
  3. Es wurde die Beschreibung der grafischen Bibliothek der MQL5-Dokumentation hinzugefügt, mit welcher Histogramme, Verteilungen und lineare Grafiken direkt auf Preischarts schnell gezeichnet werden können.
  4. Es wurden Statusbezeichnungen für Systemtasten der Liste der Konstanten Status des Kundenterminals hinzugefügt. Der Aufruf von TerminalInfoInteger(TERMINAL_KEYSTATE_XXX) gibt den gleichen Code des Status der Taste zurück, wie die Funktion GetKeyState() in MSDN.
  5. Die Umwandlung des Typs string in den Typ bool wird nicht mehr unterstützt. Für die Überprüfung von Strings muss eine explizite Bedingung geschrieben werden. In der neuen Version wird z.B. für den folgenden Code ein Fehler der Kompilation zurückgegeben:
    string str;
    ...
    if(str)                        // Kompilierungsfehler "Cannot convert type 'string' to 'bool'" (in den vorherigen Builds trat der Fehler nicht auf)
       Print("str is true");
    Man muss eine explizite Bedingung schreiben:
    string str;
    ...
    
    //--- überprüfen, ob der String initialisiert wurde
    if(str!=NULL)
       Print("str is true");
    
    oder
    
    //--- überprüfen, ob der Wert des Strings "true" ist
    if(StringCompare(str,"true",false))
       Print("str is true");
    
    oder
    
    //--- überprüfen, ob der String eine Zahl ist und nicht gleich Null ist
    if((int)str!=0)
       Print("str is true");
Verbesserungen anhand Crash-Logs.
2 Dezember 2016
MetaTrader 5 Webplattform: Zwei-Faktor-Authentifizierung und Passwortänderung
  • Für einen zusätzlichen Schutz von Handelskonten wurde eine Zwei-Faktor-Authentifizierung mit Einmalpasswörtern Um die Zwei-Faktor-Authentifizierung zu aktivieren, starten Sie die MetaTrader 5 App. Loggen Sie sich ein und öffnen Sie den OTP-Generator (One-time password) im Fenster "Einstellungen". Verknüpfen Sie alle Ihren Handelskonten mit dem OTP-Generator — für jedes Konto wird ein Einmalpasswort aus sechs Ziffern automatisch generiert. Zur mobilen Webplattform 

  • Es wurde die Option hinzugefügt, Passwort und Investorpasswort zu ändern. Nutzen Sie diese Möglichkeit, um eine einfache persönliche Kennung zu erstellen, welche Sie sich gut merken können.
  • Zu den weiteren Neuerungen gehört die automatische Generierung von Demo-Konten. Nun können Sie MetaTrader 5 Web in jedem Browser öffnen uns sofort Devisen, Aktien und Futures handeln.
24 November 2016
Neues MetaTrader 5 Build 1485: zusätzliche Testmodi und Charts in der Standardbibliothek

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.

14 Oktober 2016
MetaTrader 5 Build 1455: Bibliotheken mathematischer Funktionen in MQL5

Terminal

  1. Es wurden Tooltips für die Buttons Buy, Sell und Close in Handelsdialogen hinzugefügt. Die Tooltips erklären, welche Aktiva genau bei der Abwicklung der Transaktion gekauft bzw. verkauft werden, und helfen Anfängern den Sinn des Handeslprozesses besser nachzuvollziehen.




  2. Es wurden neue Icons für Orders, Trades und Positionen in den Reitern "Handel" und "Historie" hinzugefügt.




  3. Die Anzeige und Aktualisierung der Markttiefe, des Tick-Charts der Markttiefe und von Times & Sales wurde optimiert und wesentlich beschleunigt (um das 4-5-Fache).
  4. Es wurde ein Fehler bei der Synchronisierung der Tick-Historie außerhalb der Handelszeiten korrigiert. In einigen Fällen führte der Fehler zu einem übermäßigen Traffic-Vebrauch.

MQL5

  1. Der Standardbibliothek wurde eine MQL5-Verison der Bibliothek der numerischen Analyse ALGLIB hinzugefügt.

    Eigenschaften der Bibliothek

    • Lineare Algebra
    • Lösen von Gleichungen - linearen und nicht linearen
    • Interpolation
    • Optimierung
    • Schnelle Fourier-Transformation
    • Numerische Integration
    • Lineare und nicht lineare Approximation nach der Methode der kleinsten Quadraten
    • Gewöhnliche Differentialgleichungen
    • Berechnung spezieller Funktionen
    • Deskriptive Statistik und Hypothesentest
    • Datenanalyse - Klassifizierung, Regression
    • Implementierung von Algorithmen linearen Algebra, Interpolation usw. hochgenaue Arithmetik (mit MPFR)

    Wie es verwendet wird

    Die Dateien der ALGLIB sind im Verzeichnis \MQL5\Include\Math\Alglib gespeichert. Für die Verwendung der Funktionen, fügen Sie Ihrem Programm die Hauptdatei hinzu:

    #include <Math\Alglib\alglib.mqh>

  2. Der Standardbibliothek wurden Funktionen für das Arbeiten mit der mathematischen Statistik hinzugefügt. Nun sind die Möglichkeiten der R-Sprache, eines der besten Werkzeuge der statistischen Datenverarbeitung und -analyse, in MQL5 verfügbar.

    Eigenschaften der Bibliothek

    Die statistische Bibliothek beinhaltet Funktionen für die Berechnung statistischer Eigenschaften sowie Funktionen für das Arbeiten mit statistischen Verteilungen:

    • Funktionen für die Berechnung statistischer Charakteristiken der Elemente eines Arrays
    • Funktionen für das Arbeiten mit statistischen Verteilungen: Normalverteilung, Log-Normalverteilung, Betaverteilung usw.

    Wie es verwendet wird

    Die Dateien der statistischen Bibliothek sind in \MQL5\Include\Math\Stat gespeichert. Um Funktionen der Bibliothek zu verwenden, fügen Sie die Datei mit den notwendigen Funktionen in Ihr Programm hinzu, zum Beispiel:

    #include <Math\Stat\Binomal.mqh>
    #include <Math\Stat\Cauchy.mqh>
    

    Eine ausführliche Beschreibung der Bibliotheksfunktionen finden Sie im Artikel Statistische Verteilung in MQL5 - das beste aus R rausholen.


  3. Der Standardbibliothek wurde eine MQL5-Version der Fuzzy-Bibliothek hinzugefügt, in der Inferenzen vom Typ Mamdani und Sugeno implementiert werden.

    Eigenschaften der Bibliothek

    • 13 Zugehörigkeitsfunktionen
    • Flexible Form für die Entwicklung von Relgeln für Fuzzy-Systeme
    • Unscharfe Inferenz nach Mamdani
    • Unscharfe Inferenz nach Sugeno
    • 5 Methoden der Defuzzifizierung für das System vom Typ Mamdani
    • Unbegrenzte Anzahl der Ein- und Ausgabevariablen

    Wie es verwendet wird

    Die Dateien der Fuzzy-Bibliothek sind im Verzeichnis \MQL5\Include\Math\Fuzzy gespeichert. Um Funktionen der Bibliothek zu verwenden, fügen Sie die Datei mit den notwendigen Funktionen in Ihr Programm hinzu, zum Beispiel:

    #include <Math\Fuzzy\mamdanifuzzysystem.mqh>
    #include <Math\Fuzzy\sugenofuzzysystem.mqh>
    

    Eine ausführliche Beschreibung der Bibliothek ist in der Code Base zu finden: Fuzzy - Bibliothek für das Arbeiten mit der Fuzzy-Logik


  4. Es wurde die Eigenschaft CHART_QUICK_NAVIGATION für das Aktivieren/Deaktivieren der Leiste der schnellen Navigation hinzugefügt. Für die Änderung und das Erhalten des Zustands der Eigenschaft verwenden Sie bitte die Funktionen ChartSetInteger und ChartGetInteger.




    Die Navigationsleiste wird durch das Drücken auf die Eingabe- oder Leertaste aufgerufen. So können Sie schnell zum angegebenen Datum auf dem Chart gelangen sowie Symbol oder Zeitrahmen ändern. Wenn Ihr MQL5-Programm das Drücken der Eingabe- und Leertaste verarbeitet, deaktivieren Sie die Option CHART_QUICK_NAVIGATION, damit das Terminal diese Events nicht abfängt. Die Navigationsleiste kann auch mit einem Doppelklick aufgerufen werden.

  5. Es wurden die Funktionen FileLoad und FileSave für ein einfaches Lesen und Speichern von Arrays in Dateien hinzugefügt. Im Gegensatz zu FileRead* und FileWrite* brauchen diese Funktionen den Handle der Datei nicht. FileLoad und FileSave funktionieren mit Arrays von numerischen Typen sowie mit einfachen Strukturen, die keine Strings, dynamischen Arrays oder Klassenobjekte haben.
    long  FileLoad(
       const string filename,      // [in] Dateiname
       void         &buffer[],     // [out] ein Array, in das die Datei geschrieben wird liest
       uint         common_flag=0  // [in] 0 - Suche nach der Datei im Files-Ordner des Terminals, FILE_COMMON - im gemeinsamen Verzeichnis der Terminals
       );
    
    bool  FileSave(
       const string filename,      // [in] Dateiname
       const void   &buffer[],     // [in] Array, welches in der Datei gespeichert wird
       uint         common_flag=0  // [in] 0 - Erstellung einer Datei im Files-Ordner des Terminals, FILE_COMMON - im gemeinsamen Verzeichnis der Terminals
       );
       );
    Ein Beispiel dafür, wie Ticks in eine Datei geschrieben und anschließend gelesen werden:
    //--- Eingabeparameter
    input int      ticks_to_save=1000; // Anzahl von Ticks
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       string  filename=_Symbol+"_ticks.bin";
       MqlTick ticks[];
    //---
       int copied=CopyTicks(_Symbol,ticks,COPY_TICKS_ALL,0,ticks_to_save);
       if(copied!=-1)
         {
          PrintFormat(" CopyTicks(%s) copied %d ticks",_Symbol,copied);
          //--- wenn die Tick-Historie synchronisiert ist, ist der Fehlercode gleich Null
          if(!GetLastError()==0)
             PrintFormat("%s: Ticks are not synchronized. Error=",_Symbol,copied,_LastError);
          //---  schreiben wir die Ticks in eine Datei
          if(!FileSave(filename,ticks,FILE_COMMON))
             PrintFormat("FileSave() failed, error=%d",GetLastError());
         }
       else
          PrintFormat("Failed CopyTicks(%s), Error=",_Symbol,GetLastError());
    //--- nun lesen wir diese Ticks aus der Datei
       ArrayFree(ticks);
       long count=FileLoad(filename,ticks,FILE_COMMON);
       if(count!=-1)
         {
          Print("Time\tBid\tAsk\tLast\tVolume\tms\tflags");
          for(int i=0;i<count;i++)
            {
             PrintFormat("%s.%03I64u:\t%G\t%G\t%G\t%I64u\t0x%04x",
             TimeToString(ticks[i].time,TIME_DATE|TIME_SECONDS),ticks[i].time_msc%1000,
             ticks[i].bid,ticks[i].ask,ticks[i].last,ticks[i].volume,ticks[i].flags);
            }
         }
      }

  6. Die Anzeige benutzerdefinierter Indikatoren mit dem Modus DRAW_CANDLES wurde geändert. Nun kann man für diesen Stil eine bis drei Farben setzen, davon hängt die Darstellung von Kerzen ab.

    Wenn nur eine Farbe angegeben wurde, werden alle Kerzen auf dem Chart diese Farbe haben.
    //--- Kerzen haben die gleiche Farbe  
    #property indicator_label1  "One color candles"
    #property indicator_type1   DRAW_CANDLES
    //--- es wurde nur eine Farbe angegeben, deswegen haben alle Kerzen die gleiche Farbe
    #property indicator_color1  clrGreen  
    Wenn zwei Farben angegeben wurden, werden die Umrisse der Kerzen die erste Farbe und der Körper — die zweite Farbe haben.
    //--- die Farbe der Kerzen unterscheidet sich von der Farbe der Schatten
    #property indicator_label1  "Two color candles"
    #property indicator_type1   DRAW_CANDLES
    //--- Schatten und Umriss - grün, Körper - weiss
    #property indicator_color1  clrGreen,clrWhite 
    Wenn drei Farben angegeben wurden, werden der Umriss der Kerzen die erste Farbe, bullische Kerzen - die zweite und bärische Kerzen - die dritte Farbe haben.
    //--- die Farbe der Kerzen unterscheidet sich von der Farbe der Schatten
    #property indicator_label1  "One color candles"
    #property indicator_type1   DRAW_CANDLES
    //--- die Schatten und der Umriss sind grün, der Körper der bärischen Kerze ist weiß, der Körper der bärischen Kerze ist rot
    #property indicator_color1  clrGreen,clrWhite,clrRed
    Auf diese Weise kann man mithilfe des Stils DRAW_CANDLES eigene benutzerdefinierte Varianten der Kerzenfarben gestalten. Alle Farben können beim Laufen des Indikators mithilfe der Funktion PlotIndexSetInteger(Index_DRAW_CANDLES, PLOT_LINE_COLOR, modifier_nummer, Farbe) geändert werden, wobei:
    • 0 – Farbe des Umrisses und der Schatten
    • 1– Farbe des Körpers einer bullischen Kerze
    • 2 – Farbe des Körpers einer bärischen Kerze
    //--- setzen wir die Farbe für den Umriss und die Schatten
    PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,clrBlue);
    //--- setzen wir die Farbe für den Körper der bullischen Kerze
    PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrGreen);
    //--- setzen wir die Farbe für den Körper der bärischen Kerze
    PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,clrRed);
  7. Es wurde eine Reihe von Fehlern behoben und das Arbeiten mit der Tick-Historie mithilfe der CopyTicks Funktion beschleunigt.
  8. Die Verwendung von Operatoren wurde in Schnittstellen erlaubt.

Market

  1. Es wurde ein Fehler behoben, der in einigen Fällen zu einer erneuten Autorisierung auf MQL5.community beim Einkaufen im Market führte.

Tester

  1. Es wurde eine Übersetzung der Benutzerschnittstelle in die griechische, malaiische und neuhebräische Sprachen hinzugefügt.

Die Dokumentation wurde aktualisiert.

29 September 2016
MetaTrader 5 Webplattform: Optimierung des Codes und neue Möglichkeiten der Benutzerschnittstelle
  • Es wurde die Möglichkeit hinzugefügt, die Größe von Blöcken der Webanwendung zu ändern — von der "Marktübersicht" bis zu den Fenstern mit Preischarts.
  • In den Reitern "Handel" und "Historie" ist nun Sortierung verfügbar. Die Breite der Spalten kann geändert werden.
  • Der Marktübersicht wurde ein Werkzeug für die schnelle Auswahl eines Symbols und das Tab "Details" hinzugefügt.
  • Der Code wurde für die Beschleunigung der Arbeit des Webterminals optimiert — Initialisierung des Kontos, Auswahl von Symbolen und der Handel selbst sind noch schneller geworden.

16 September 2016
MetaTrader 5 build 1430: Aktualisierung des Exposure-Tabs

Terminal

  1. Es wurde ein neuer Algorithmus für die Zusammensetzung des Reiters "Aktiva" für den Wertpapiermarkt implementiert. Nun passt das Terminal die Anzeige der Aktiva an, je nach dem welches Risikomanagementsystem genutzt wird: Retail Forex, Futures oder Börsenmodell.

    Denjenigen, die Devisen oder Futures an einer Börse handeln, hilft der Reiter "Belastung" ihre aktuelle Lage auf dem Markt zu erfassen. Eine und dieselbe Währung kann in verschiedenen Symbolen vorkommen: als eine Währung in einem Paar, als Basiswährung usw. Sie können zum Beispiel entgegengesetzte Positionen auf GBPUSD, USDJPY und GBPJY haben. Sie können z.B. entgegengesetzte Positionen auf GBPUSD, USDJPY und GBPJY haben. In diesem Fall kann es problematisch sein zu verstehen, wie viel Devisen Sie haben und wie viel Sie schulden. Noch komplizierter ist es, wenn Sie nicht drei solche Positionen haben, sondern viel mehr. In diesem Fall können Sie den Kontostand im Reiter "Belastung" ansehen.
    Schauen wir uns ein Beispiel mit den gleichen drei Positionen an:

    Buy GBPJPY 1 lot at 134.027 — 100 000 GBP bekommen, 134 027 000 JPY gegeben
    Sell USDJPY 1 lot at 102.320 — 100 000 USD gegeben, 102 320 000 JPY bekommen
    Sell GBPUSD 1 lot at 1.30923 — 100 000 GBP gegeben, 103 920 USD bekommen

    Wir haben 100.000 GPB gleichzeitig gekauft und verkauft. Insgesamt haben wir 0 GBP, und diese Währung wird im Tab "Belastung" nicht angezeigt. US-Dollar: bei einer Transaktion gegeben, bei der anderen - bekommen. Der Reiter "Aktiva" berechnet den Endbetrag und addiert ihn zum aktuellen Kontostand, denn die Währung der Anlage ist auch USD. JPY kam in zwei Transaktionen vor, der Reiter zeigt den Endwert an.




    Diejenigen, die nach dem Börsenmodell handeln, können diesem Tab entnehmen, wie das Geld genutzt wird. Im Gegensatz zum vorherigen Modell wird das Geld bei der Ausführung von Trades direkt abgezogen/gutgeschrieben. Beim Kauf EURRUB bekommen Sie Euro, und abgezogen vom Konto wird der entsprechende Betrag in Rubel. Während des Handels kann der Kontostand sogar einen negativen Wert annehmen, und zwar wenn Sie mit geliehenen Mitteln handeln und erworbene Aktiva als Sicherung dienen. In dieser Situation hilft Ihnen der Reiter "Aktiva" den Kontostand zu verstehen.

    Darüber hinaus wird hier der Liquidationswert angezeigt — die Summe der Geldmittel auf dem Konto und der Wert (das Ergebnis) der Schließung aktueller Positionen zum Marktpreis.





  2. Es wurde ein Fehler bei der Anzeige des Transaktionstyps in der Historie behoben.
  3. Eine wiederholte Anzeige des Fensters mit Informationen über Risiken wurde bei einer erneuten Verbindung mit dem Handelskonto korrigiert.
  4. Das Arbeiten mit dem Dialog der Auswahl von Handelsinstrumenten bei einer großen Anzahl der Symbolen (ein tausend und mehr) wurde optimiert und korrigiert.
  5. Die Anzeige von Levels der eingebauten Indikatoren wurde korrigiert, die anhand von Moving Average berechnet werden (Bollinger Bands, Adaptive Moving Average usw.). Das Problem trat beim Zeichnen der Indikatoren in einem separaten Unterfenster auf.
  6. Es wurde ein Fehler behoben, der dazu geführt hatte, dass das Platzieren einer Futures-Order nicht möglich war. Der Fehler trat auf, wenn ein Preis in der Order mit der im Kontrakt festgelegten oberen oder unteren Preisgrenze übereinstimmte.

MQL5

  1. Die Kompilierung von MQL5-Programmen wurde optimiert und beschleunigt.
  2. Für Klassen, Strukturen und Funktionen wurde die Unterstützung der Modifier final und override hinzugefügt.

    Modifier final für Klassen und Strukturen
    Das Vorhandensein des final Modifiers bei der Deklaration der Struktur verbietet eine weitere Vererbung. Wenn es nicht notwendig ist, die Klasse (Struktur) weiter zu modifizieren oder wenn keine Änderungen aus Sicherheitsgründen zulässig sind, deklarieren Sie diese mit dem final Modifier. Dabei werden alle Glieder der Struktur implizit auch als final gelten.
    class CFoo final
      {
      //--- Body der Klasse
      };
     
    class CBar : public CFoo
      {
      //--- Body der Klasse
      };
    Bei einem Versuch der Vererbung von einer Struktur mit dem final Modifier, wie im Beispiel oben, gibt der Compiler einen Fehler aus:
    cannot inherit from 'CFoo' as it has been declared as 'final'
    see declaration of 'CFoo'

    Modifier override für Funktionen
    Der override Modifier bedeutet, dass die zu deklarierende Funktion die Methode der Basisklasse unbedingt überschreiben muss. Dank diesem Modifier kann man Fehler beim Überschreiben vermeiden, wie z.B. zufällige Änderung der Methodensignatur. In der Basisklasse ist zum Beispiel die Methode func definiert, die die Variable vom Typ int als Argument hat:
    class CFoo
      {
       void virtual func(int x) const { }
      };
    Weiter wird die Methode in der abgeleiteten Klasse neu definiert:
    class CBar : public CFoo
      {
       void func(short x) { }
      };
    Aber durch einen Fehler ändert sich der Typ des Arguments von int zu short. In diesem Fall wird die Methode nicht mehr überschrieben, sondern überladen. In einigen Situationen kann der Compiler entsprechend dem Algorithmus der überladenen Funktion eine in der Basisklasse definierte Methode statt einer überschriebenen auswählen.

    Um solche Fehler zu vermeiden, sollte man der Methode den override Modifier hinzufügen.
    class CBar : public CFoo
      {
       void func(short x) override { }
      };
    Wenn die Signatur beim Überschreiben geändert wird, kann der Compiler keine Methode mit der gleichen Signatur in der Basisklasse finden und gibt einen Kompilierungsfehler aus:
    'CBar::func' method is declared with 'override' specifier but does not override any base class method

    Modifier final für Funktionen

    Der Modifier final funktioniert umgekehrt: er verbietet, Methoden in abgeleiteten Klassen zu überschreiben. Wenn die Implementierung der Methode abgeschlossen ist, deklarieren Sie diese mit dem final Modifier, damit sie später garantiert nicht verändert wird.
    class CFoo
      {
       void virtual func(int x) final { }
      };
     
    class CBar : public CFoo
      {
       void func(int) { }
      };
     
    Bei einem Versuch der Vererbung von einer Struktur mit dem final Modifier, wie im Beispiel oben, gibt der Compiler einen Fehler aus:
    'CFoo::func' method declared as 'final' cannot be overridden by 'CBar::func'
    see declaration of 'CFoo::func'
  3. Die Kompilierung von Template-Funktionen mit Standardparametern wurde korrigiert.

Market

  1. Es wurde eine Reihe von Fehlern beim Sortieren von Produkten im Market behoben.

Tester

  1. Die Aktualisierung aktueller Marktpreise offener Orders und Positionen wurde im visuellen Modus des Strategietesters korrigiert.
  2. Slippage bei der Ausführung von Buy Limit und Sell Limit Orders beim Testen anhand Börseninstrumenten beseitigt.
  3. Es wurde ein Fehler behoben, der in einigen Fällen zur Generierung falscher Preise im Testmodus "Nur Eröffnungspreise" führte.
  4. Die Generierung der OnTradeTransaction Events beim Testen korrigiert.
  5. Beim Testen anhand realer Ticks wird die Information über die Nichtübereinstimmung der Tick-Preise (Bid oder Last, je nach dem anhand welchen Preises der Balken gebildet wird) mit Low oder High des aktullen Minutenbalkens im Journal des Strategietesters angezeigt.

MetaEditor

  1. Es wurden Fehler der Anzeige von Daten des Profilings in Quellcode-Dateien behoben.
  2. Die Dokumentation wurde aktualisiert.
19 August 2016
MetaTrader 5 Build 1395: Schnellere Handeslausführungen und Verbesserungen bei der visuellen Ausführung des Strategietesters

Terminal

  1. Das Client-Terminal bietet nun eine schnellere Orderausführung.
  2. Es wurde ein Fehler behoben, der dazu geführt hatte, dass das Ausführen von MQL5-Anwendungen in Terminals, die in 32 Bit Umgebungen von Windows 10 mit der Buildnummer 1607 liefen, nicht möglich war.
  3. Der Navigator zeigt jetzt an, ob ein Konto im Hedging- oder im Netting-Modus handelt.
  4. Dem Navigator wurde ein neuer Befehl innerhalb des Kontextmenüs hinzugefügt. Dieser erlaubt es dem Anwender, sich über den ausgewählten Account direkt mit dem Web-Terminal zu verbinden.
  5. Die Hilfe-Sektion des Menüs wurde aktualisiert. Sie beinhaltet jetzt auch Links zu den Video-Anleitungen.
  6. Es wurde eine Reihe von Fehlern bei der Arbeit auf Bildschirmen mit hoher Auflösung (4K) behoben.
  7. Die Übersetzung der Benutzeroberfläche ins Persische wurde aktualisiert.

MQL5

  1. Es wurden neue 'void *' Pointers hinzugefügt, um es den Anwendern zu ermöglichen, abstrakte Sammlungen von Objekten zu erzeugen. In der Variablen von diesem Typ kann der Pointer zu einem Objekt von einer beliebigen Klasse gespeichert werden.
    Es wird empfohlen, den Operator dynamic_cast<Name der Klasse *>(Pointer void *) für eine Rückwärts-Konvertierung zu verwenden. Wenn eine Konvertierung nicht möglich ist, ist das Ergebnis NULL.
    class CFoo { };
    class CBar { };
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       void *vptr[2];
       vptr[0]=new CFoo();
       vptr[1]=new CBar();
    //---
       for(int i=0;i<ArraySize(vptr);i++)
         {
          if(dynamic_cast<CFoo *>(vptr[i])!=NULL)
             Print("CFoo * object at index ",i);
          if(dynamic_cast<CBar *>(vptr[i])!=NULL)
             Print("CBar * object at index ",i);
         }
       CFoo *fptr=vptr[1];  // Führt zu einem Fehler bei der Umwandlung der Pointer, vptr[1] ist kein Objekt von CFoo
      }
    //+------------------------------------------------------------------+
  2. Für Strings wurde die Unterstützung des Operators [ ] hinzugefügt.Dieser Operator ermöglicht es dem Anwender, ein Symbol aus einem String über den Index zu bekommen. Falls sich der angegebene Index außerhalb des Strings befindet, dann ist das Ergebnis 0.
    string text="Hello";
    ushort symb=text[0];  // Gibt den Code des Symbols 'H' zurück
    
  3. Es wurde eine zweite Version des TesterInit Eventhandlers mit der int OnTesterInit(void) Signatur hinzugefügt. Dieser kann INIT_SUCCEEDED (0) oder INIT_FAILED (oder jeden anderen Wert ungleich Null) zurückgeben. Falls OnTesterInit einen Wert ungleich Null zurückgibt, dann wird die Optimierung nicht gestartet.
  4. Es wurde ein Fehler behoben, der dazu geführt hat, dass bei den verschiedenen überladenen Methoden von ChartGetString unterschiedliche Ergebnisse zurückgegeben worden sind.

Tester

  1. Es wurden weitere Kommandos und Hotkeys für das visuelle Testen hinzugefügt. Es ist jetzt möglich, in dem visuellen Tester die Charts genauso zu konfigurieren, wie es auch im Terminal möglich ist: Änderungen von Farben, die Sichtbarkeit von verschiedenen Control-Elementen, das Anwenden von Vorlagen, etc.




  2.  Es wurde ein Fehler im Zusammenhang mit der sleep-Funktion im Testmodus "Nur Eröffnungspreise" behoben.
  3.  Es wurde ein Fehler behoben, der dazu geführt hat, dass bei den Timeframes W1 und MN1, die Bars entsprechend ihrem Status falsch gebildet worden sind.

MetaEditor

  1. Es wurde eine Übersetzung in die traditionelle chinesische Sprache hinzugefügt.

Die Dokumentation wurde aktualisiert.

15 Juli 2016
MetaTrader 5 Build 1375: Time & Sales und Zugang zu Ticks beim Testen

Terminal

  1. Der Markttiefe wurde die Funktion Time & Sales hinzugefügt.




    Was ist Time & Sales?
    Die Funktion Time & Sales zeigt eine Liste aller Trades in der Echtzeit an, die an der Börse ausgeführt werden. Zu jedem Trade werden Zeit der Ausführung, Richtung (Kauf oder Verkauf), Preis und Volumen angegeben. Für eine bessere visuelle Analyse ist jede Traderichtung mit einer bestimmten Farbe markiert: blau - Kauf, pink - Verkauf, grün - unbestimmte Richtung. Das Tradevolumen wird zusätzlich als Histogramm dargestellt.

    Wie Time & Sales hilft, den Markt zu verstehen
    Time & Sales ermöglicht es Ihnen, Märkte genauer zu analysieren. Nach der Traderichtung kann der Trader erfahren, wer die Ausführung des Trades initiiert hat: Käufer oder Verkäufer. Das Volumen von Trades hilft das Verhalten von Marktteilnehmern zu verstehen: ob es um große oder kleine Player geht, wie aktiv sie sind usw. Die Geschwindigkeit der Ausführung und das Volumen von Trades an bestimmten Preis Levels erlauben es Ihnen, die Bedeutung dieser Levels einzuschätzen.

    Wie die Daten von Time & Sales verwendet werden
    Neben der Möglichkeit, die Tabelle visuell zu analysieren, können Sie Daten von Trades in eine CSV-Datei exportieren. Dann können Sie diese mithilfe von jedem anderen Programm weiter studieren, z.B. MS Excel. Alle Daten werden durch ein Komma voneinander getrennt:
    Time,Bid,Ask,Last,Volume,Type
    2016.07.06 16:05:04.305,89360,89370,89370,4,Buy
    2016.07.06 16:05:04.422,89360,89370,89370,2,Buy
    2016.07.06 16:05:04.422,89360,89370,89370,10,Buy
    2016.07.06 16:05:04.669,89360,89370,89370,1,Buy
    2016.07.06 16:05:05.968,89360,89370,89360,7,Sell
    Um die Daten in eine Datei zu speichern, rufen Sie das Kontextmenü auf:



    Um die Richtung von Trades genau feststellen zu können, muss die Plattform des Brokers auf die Version 1375 aktualisiert werden.
  2. Die Zeit zwischen dem Eingehen eines eines Ticks/einer Veränderung der Markttiefe und dem Aufruf von OnTick und OnCalculate wurde wesentlich reduziert. Das Gleiche gilt für die Zeit zwischen dem Eingehen eines Ereignisses über die Änderung des Handelsstatus und dem Aufruf von OnTrade und OnTradeTransaction. Auf diese Weise werden nun MQL5-Programme schneller auf Marktereignisse reagieren.
  3.  Handelsanfragen werden nun unter Verwendung von einer erweiterten Authentifizierung mithilfe von SSL-Zertifikaten schneller gesendet.
  4.  Die Übersetzung der Benutzeroberfläche in Persisch aktualisiert.
  5. Die Anzeige von Befehlen für das Setzen von SL/TP im Kontextmenü des Charts im Hedge-Modus wurde korrigiert.

Tester

  1. Jetzt kann die Tickhistorie beim Testen mithilfe der CopyTicks Funktion abgerufen werden. Bisher war die Funktion nicht im Strategietster verfügbar.

    • Im Modus "Jeder Tick" liefert die Funktion die Historie der generierten Ticks. Man kann bis zu 128.000 letzte Ticks abrufen.
    • Im Modus "Jeder Tick anhand realer Ticks" liefert die Funktion die Historie realer Ticks. Die Tiefe der angeforderten Daten hängt nur von der Verfügbarkeit dieser Daten ab. Es ist aber zu beachten, dass die letzten 128.000 Ticks im Strategietester zwischengespeichert werden, und relativ schnell abgerufen werden können. Eine tiefere Historie wird unmittelbar von der Festplatte abgerufen, aus diesem Grund wird die Ausführung mehr Zeit in Anspruch nehmen.
    • In den Modi "Nur Eröffnungspreise" und "1 Minute OHLC" funktioniert die Funktion nach wie vor nicht, denn die Tick-Historie wird in diesen Modi nicht generiert.

  2. Unterstützung für Millisekunden hinzugefügt. In den früheren Versionen diente eine Sekunde als Zeitquantum.

    • Nun sind die Funktionen EventSetMillisecondTimer und Sleep im Strategietester noch genauer geworden.
    • Die Genauigkeit beim Senden von Ticks während des Testens von Mehrwährungsexperten wurde verbessert. Wenn eine Sekunde mehrere Ticks enthielt (z.B. das Tickvolumen eines Minutenbalken war größer als 60), wurde bisher für alle Ticks eine und dieselbe Zeit gesetzt. Beim Testen von Experten, die mit einer Währung arbeiten, spielt dies keine Rolle, denn die Ticks werden dem Expert Advisor sequentiell übergeben. Aber beim Testen auf mehreren Währungspaaren ist es wichtig zu wissen, das Tick von welchem Paar zuerst eingegangen ist. Früher wurden die Ticks von jedem Symbol dem Expert Advisor sequentiell übergeben: zuerst alle Ticks pro Sekunde von einem Symbol, danach - von dem anderen. Nun werden sie unter Berücksichtigung von Millisekunden gesendet.

      Beim Testen unter Verwendung von realen Ticks werden Millisekunden den ursprünglichen Tickdaten entnommen. Bei der Generierung von Ticks werden Millisekunden entsprechend dem Tickvolumen gesetzt. Enthält zum Beispiel eine Sekunde drei Ticks, dann wird ihre Zeit in Millisekunden 000, 333 und 666 sein.

  3. Pending Orders und SL/TP Orders werden in den Modi "Nur Eröffnungspreise" und "1 Minute OHLC" zu einem angegebenen und nicht zum aktuellen Preis im Moment der Ausführung ausgeführt. Der Algorithmus der Ausführung zum Marktpreis, der in den präzisen Modi (alle Ticks und reale Ticks) verwendet wird, passt für die groben Modi nicht. In den letzteren Modi werden keine Zwischenticks generiert, und der angegebene Preis kann sich stark vom Marktpreis im Moment der Ausführung (Open oder OHLC) unterscheiden. Die Ausführung von Trades zu einem angegebenen Preis in den Modi "Nur Eröffnungspreise" und "1 Minute OHLC" liefert genauere Testergebnisse.

  4. Unterstützung für Forward-Tests im visuellen Modus hinzugefügt. Für Backtest und Forward-Test werden nun zwei separate Fenster des visuellen Testens geöffnet. Dies erlaubt es, die Ergebnisse des Expert Advisors in verschiedenen Perioden miteinander zu vergleichen.




    Das Fenster des Forward-Testens erscheint nur nach dem Abschluss des Testens in der Hauptperiode.

  5. Auf dem Chart des Testens wird nun statt des Margin Levels die Belastung der Einlage angezeigt, die als die Relation zwischen der Margin und dem Kapital (margin/equity) berechnet wird.


  6. Tester: Berechnung der Kommission als Zinssatz per annum beim Testen korrigiert.

  7. Tester: Neuberechnung und Anzeige des Kontostandes auf dem Chart korrigiert, der im Laufe des Testens erstellt wird.

MQL5

  1. Das Verhalten der Funktion OrderSend wurde beim Platzieren, Modifizieren und Löschen von Orders geändert. Die Änderungen betreffen nur die Orders, die an externe Handelssysteme gesendet werden. In den früheren Versionen wurde die Funktionssteuerung von OrderSend zurückgegeben, nachdem die Order auf dem Server des Brokers erfolgreich platziert (bearbeitet wurde). Nun wird die Steuerung nur dann zurückgegeben, wenn der Server des Brokers eine Benachrichtigung vom externen Handelssystem bekommt, dass die Order erfolgreich platziert wurde.

    Nun wird die Steuerung nur dann zurückgegeben, wenn der Server des Brokers eine Benachrichtigung vom externen Handelssystem bekommt, dass die Order erfolgreich platziert wurde.




  2. Der Struktur des Handelsergebnisses MqlTradeResult wurde das Feld retcode_external hinzugefügt - der Code eines Fehlers im externen Handelssystem. Das Hinzufügen und die Typen dieser Fehler hängen vom Broker und dem externen Handelssystem ab, an welches Transaktionen gesendet werden. Zum Beispiel werden sich die retcode_external Werte, die von der Moskauer Börse ausgefüllt wurden, von denen der DGCX unterscheiden.

  3. Der Aufzählung ENUM_CHART_PROPERTY_STRING wurden die Eigenschaften CHART_EXPERT_NAME und CHART_SCRIPT_NAME hinzugefügt. Nun kann man mithilfe der Funktion ChartGetString den Namen eines Expert Advisors bzw. eines Skripts feststellen, der einem durch den chart_id Parameter definierten Chart angefügt wurde.

Signals

  1. Es wurde ein Fehler behoben, wegen dessen die Close By Transaktionen in einigen Fällen nicht kopiert wurden.
  2. Die automatische Anpassung der Währungspaare, die RUB und RUR enthalten, wurde verbessert.

Market

  1. Die Sortierung nach der Produktkategorie wurde korrigiert.

MetaEditor

  1. Das Setzen des Fokusses auf Textfeld beim Öffnen des Dialogs der Ersetzung wurde korrigiert.
  2. Das Massenersetzen von Text wurde bei der Suche nach oben von der aktuellen Position korrigiert.


Die Dokumentation wurde aktualisiert.
12345