Neues MetaTrader 5 Build 1640: Erstellen und Testen benutzerdefinierter Finanzinstrumente

Es wurde die Option hinzugefügt, benutzerdefinierte Finanzinstrumente zu erstellen

21 Juli 2017

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.