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:
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.
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:
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:
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 } //+------------------------------------------------------------------+
string text="Hello"; ushort symb=text[0]; // Gibt den Code des Symbols 'H' zurück
Die Dokumentation wurde aktualisiert.
Tester: Berechnung der Kommission als Zinssatz per annum beim Testen korrigiert.
Tester: Neuberechnung und Anzeige des Kontostandes auf dem Chart korrigiert, der im Laufe des Testens erstellt wird.
Nach zwei Monaten nach dem öffentlichen Testen wurde die Webversion der Multi-Asset-Plattform MetaTrader 5 offiziell herausgegeben. Mit der Webplattform MetaTrader 4 können Sie von jedem Browser aus in jedem Betriebssystem handeln. Die Plattform soll nicht auf Ihren PC installiert werden, Sie brauchen nur einen Internetanschluss und einen Browser.
Die Benutzerfreundlichkeit und die Cross-Plattform-Eigenschaft des Webterminals wird durch die Vorteile der MetaTrader 5 Desktopversion ergänzt. Dazu gehören die Schnelligkeit, die Multi-Asset-Feature und erweiterte Handelsfunktionen. Das Hauptmerkmal dieser Version stellt die Markttiefe dar, die es erlaubt Markt- und Pending Orders mit einem Klick zu platzieren.
Darüber hinaus erlaubt es die Webplattform, technische Analyse
durchzuführen und Handelsoperationen genauso wie in der Desktop-Version
auszuführen. Die Anwendung bietet:
Nun ist es einfach, SSL-Zertifikate aus der Desktop-Plattform in die mobile zu übertragen. iTunes wird nicht mehr benötigt.
Konten in MetaTrader 5 kann man zusätzlich durch ein Zertifikat geschützt werden, ohne dessen man sich nicht in das Konto einloggen kann. Wenn das Zertifikat in der Desktop-Plattform erstellt wurde, muss es für den Zugriff auf das Konto in der mobilen Plattform übertragen werden.
Um ein Zertifikat zu übertragen, öffnen Sie die Desktop-Version von MetaTrader 5, klicken Sie mit der rechten Maustaste auf dem Konto im Navigator-Fenster und wählen Sie "Übertragen" aus. Geben Sie ein Passwort für den Schutz des Zertifikats ein, öffnen Sie das mobile Terminal und loggen Sie sich ein. Es wird Ihnen angeboten, das Zertifikat zu importieren.
Darüber hinaus gibt es einen Migrations-Dialog für die Konten, die aus dem MetaTrader 4 übertragen wurden. Wenn Ihr Konto auf die Plattform der fünften Generation übertragen wurde, werden Sie herzlichst begrüßt und über Features der Plattform informiert. Anschließend wird es Ihnen angeboten, Ihr Passwort zu ändern.
Früher |
Jetzt |
|
---|---|---|
Auslösung | Alle Arten von Pending Orders und SL/TP Orders zu Bid/Ask |
Limit Orders zu Bid/Ask Stop, Stop Limit und SL/TP Orders zu Last |
Ausführung | Alle Arten von Pending Orders und SL/TP Orders zum Preis, der in der Order angegeben wurde |
Alle Arten von Pending Orders und SL/TP Orders zu Bid/Ask Marktkursen zum Zeitpunkt der Auslösung |
Schauen wir uns das Symbol Si-6.16 als Beispiel an. Bei aktuellen
Kursen Bid=72570, Ask=72572, Last=72552 wurde eine Buy Stop Order mit
der Auslösung zum Preis 72580 platziert. Im Price Stream haben wir neue
aktuelle Kurse bekommen:
Als Auslöser von Stop Orders dient für Börseninstrumente der
Last-Kurs. Aus diesem Grund aktiviert Last=72580 im Stream die Buy Stop
Order. Früher hätte man den Kurs 72580 für die Ausführung dieser Order
verwendet. Das war aber falsch, denn es gibt keinen Ask=72580 für die
Ausführung des Buy-Trades auf dem Markt.
Verbesserungen anhand Crash-Logs.
Auf vielfachen Wunsch von Tradern wurde ein Webversion der Handelsplattform MetaTrader 5 entwickelt. Die Benutzerfreundlichkeit und die Cross-Plattform-Eigenschaft des Webterminals wird durch die Vorteile der MetaTrader 5 Desktopversion ergänzt. Dazu gehören die Schnelligkeit, die Multi-Asset-Feature und erweiterte Handelsfunktionen.
Die Webplattform MetaTrader 5 ist nun auf der Webseite der MQL5.community verfügbar können Sie aus jedem Browser in jedem Betriebssystem handeln. Dafür brauchen sie nur einen Internetanschluss.
Die Betaversion bietet den Tradern:
Netting
In diesem System kann zur gleichen Zeit nur eine Position pro Symbol vorhanden sein:
Dabei ist es irrelevant, was den Trade in der entgegengesetzte
Richtung hervorgerufen hat — die Ausführung einer Marktorder oder
Auslösung einer Pending-Order.
Das Beispiel unten zeigt die Ausführung von zwei Buy-Trades EURUSD mit dem Volumen in Höhe von 0.5 Lots:
Aus der Ausführung dieser Trades ergab sich eine gemeinsame Position mit einem Volumen in Höhe von einem Lot.
Hedging-System
Beim Hedging kann man eine Vielzahl von Positionen auf einem und
demselben Symbol haben, darunter auch von entgegengesetzte Positionen.
Wenn eine offene Position für das Symbol vorhanden ist, und der Händler
einen neuen Trade ausführt (bzw. eine Pending-Order ausgelöst wird),
wird eine neue Position eröffnet. Die vorhandene Position ändert sich
nicht.
Das Beispiel unten zeigt die Ausführung von zwei Buy-Trades EURUSD mit dem Volumen in Höhe von 0.5 Lots:
Die Ausführung dieser Trades führte zur Eröffnung zwei separater Positionen.
Neuer Typ von Handelstransaktionen Close By
Für Konten mit Hedging wurde ein neuer Typ von Transaktionen
hinzugefügt — Schließung einer Position zur Gegenposition. Diese
Operation ermöglicht es, zwei gegensätzliche Positionen auf einem
Instrument gleichzeitig zu schließen. Wenn die Gegenpositionen
unterschiedliche Zahl von Lots haben, bleibt nur eine der Orders offen.
Ihr Volumen ist der Differenz der Lots dieser zwei geschlossener
Positionen gleich, und die Richtung der Position sowie der
Eröffnungspreis stimmen mit der größeren (nach Volumen) Position
überein.
Im Gegensatz zur einzelnen Schließung von zwei Positionen, lässt die Schließung zur Gegenposition einen Spread sparen:
Beim Schließen einer Position zur Gegenposition wird eine Order vom Typ "close by" platziert. Im Kommentar zur Order sind die Tickets der Positionen angegeben, die geschlossen werden. Die Schließung eines Paares gegenläufiger Positionen erfolgt durch zwei Trades vom Typ "out by". Der Gesamtgewinn/-verlust nach der Schließung der beiden Positionen wird nur in einem Trade angegeben.
Beim Import werden Tickets von
Orders und Positionen (Orders der Historie eingeschlossen) nicht
gespeichert, denn einem Satz in der Historie des MetaTrader 4 können bis
zu vier Sätze in der Historie des MetaTrader 5 entsprechen. Allen
Eintragungen werden neue Tickets zugewiesen.
Kontonummern können erhalten bleiben oder durch neue ersetzt werden, je nach dem, wie Ihr Broker den Import durchgeführt hat.
Beim Testen anhand realer Ticks kann viel Internet-Traffic über MQL5 Cloud Network übertragen werden. Dies kann sich auf den Endpreis für die Nutzung des Rechnernetzes auswirken.
class CAnimal { public: CAnimal(); // Konstruktor virtual void Sound() = 0; // rein virtuelle Funktion private: double m_legs_count; // Pfotenzahl };Die Sound() Funktion ist hier rein virtuell, weil diese mit dem Spezifikator der rein virtuellen PURE-Funktion (=0) deklariert wurde.
class CAnimal { public: virtual void Sound()=NULL; // PURE method, muss in der abgeleiteten Klasse neu definiert werden; die CAnimal Klasse selbst ist abstrakt geworden und kann nicht erstellt werden }; //--- abgeleitet von der abstrakten Klasse class CCat : public CAnimal { public: virtual void Sound() { Print("Myau"); } // PURE wurde neu definiert, die Klasse Ccar ist nicht abstrakt und kann erstellt werden }; //--- Beispiele für die falsche Anwendung new CAnimal; // Fehler 'CAnimal' - der Compiler zeigt die Fehlermeldung "cannot instantiate abstract class" an CAnimal some_animal; // Fehler 'CAnimal' - der Compiler zeigt die Fehlermeldung "cannot instantiate abstract class" an //--- Beispiele für die richtige Anwendung new CCat; // kein Fehler - die CCat Klasse ist nicht abstrakt; // kein Fehler - die Klasse CCat ist nicht abstraktBegrenzungen bei der Anwendung abstrakter Klassen
//+------------------------------------------------------------------+ //| Abstrakte Basisklasse | //+------------------------------------------------------------------+ class CAnimal { public: //--- rein virtuelle Funktion virtual void Sound(void)=NULL; //--- Funktion void CallSound(void) { Sound(); } //--- Konstruktor CAnimal() { //--- expliziter Aufruf der virtuellen Methode Sound(); //--- impliziter Aufruf (über eine dritte Funktion) CallSound(); //--- Konstruktor bzw. Destruktor ruft immer eigene Funktionen auf, //--- trotz der Virtualität und Neudefinierung der aufgerufenen Funktion in einer abgeleiteten Klasse //--- wenn die Funktion rein virtuell ist, //--- führt der Aufruf zum kritischen Ausführungsfehler: "pure virtual function call" } };Jedoch können Konstruktoren und Destruktoren abstrakter Klassen andere Memberfunktionen aufrufen.
typedef int (*TFunc)(int,int);Jetzt ist TFunc ein Typ, man kann die Pointer-Variable auf Funktion deklarieren:
TFunc func_ptr;In der Variablen func_ptr kann man die Funktionsadresse speichern, um diese später aufzurufen:
int sub(int x,int y) { return(x-y); } int add(int x,int y) { return(x+y); } int neg(int x) { return(~x); } func_ptr=sub; Print(func_ptr(10,5)); func_ptr=add; Print(func_ptr(10,5)); func_ptr=neg; // Fehler: neg hat nicht den Typ int (int,int) Print(func_ptr(10)); // Fehler: zwei Parameter müssen vorhanden seinPointers auf Funktionen können als Parameter gespeichert und übergeben werden. Man kann keinen Pointer auf eine nicht statische Methode der Klasse erhalten.
ulong PositionGetTicket( int index // Nummer in der Liste der Positionen );
bool PositionSelectByTicket(
ulong ticket // das Ticket der Position
);
Netting
In diesem System kann zur gleichen Zeit nur eine Position pro Symbol vorhanden sein:
Dabei ist es irrelevant, was den Trade in der entgegengesetzte
Richtung hervorgerufen hat — die Ausführung einer Marktorder oder
Auslösung einer Pending-Order.
Das Beispiel unten zeigt die Ausführung von zwei Buy-Trades EURUSD mit dem Volumen in Höhe von 0.5 Lots:
Aus der Ausführung dieser Trades ergab sich eine gemeinsame Position mit einem Volumen in Höhe von einem Lot.
Hedging-System
Beim Hedging kann man eine Vielzahl von Positionen auf einem und
demselben Symbol haben, darunter auch von entgegengesetzte Positionen.
Wenn eine offene Position für das Symbol vorhanden ist, und der Händler
einen neuen Trade ausführt (bzw. eine Pending-Order ausgelöst wird),
wird eine neue Position eröffnet. Die vorhandene Position ändert sich
nicht.
Das Beispiel unten zeigt die Ausführung von zwei Buy-Trades EURUSD mit dem Volumen in Höhe von 0.5 Lots:
Die Ausführung dieser Trades führte zur Eröffnung zwei separater Positionen.
Neuer Typ von Handelstransaktionen Close By
Für Konten mit Hedging wurde ein neuer Typ von Transaktionen
hinzugefügt — Schließung einer Position zur Gegenposition. Diese
Operation ermöglicht es, zwei gegensätzliche Positionen auf einem
Instrument gleichzeitig zu schließen. Wenn die Gegenpositionen
unterschiedliche Zahl von Lots haben, bleibt nur eine der Orders offen.
Ihr Volumen ist der Differenz der Lots dieser zwei geschlossener
Positionen gleich, und die Richtung der Position sowie der
Eröffnungspreis stimmen mit der größeren (nach Volumen) Position
überein.
Im Gegensatz zur einzelnen Schließung von zwei Positionen, lässt die Schließung zur Gegenposition einen Spread sparen:
Beim Schließen einer Position zur Gegenposition wird eine Order vom Typ "close by" platziert. Im Kommentar zur Order sind die Tickets der Positionen angegeben, die geschlossen werden. Die Schließung eines Paares gegenläufiger Positionen erfolgt durch zwei Trades vom Typ "out by". Der Gesamtgewinn/-verlust nach der Schließung der beiden Positionen wird nur in einem Trade angegeben.
class CAnimal { public: CAnimal(); // Konstruktor virtual void Sound() = 0; // rein virtuelle Funktion private: double m_legs_count; // Pfotenzahl };Die Sound() Funktion ist hier rein virtuell, weil diese mit dem Spezifikator der rein virtuellen PURE-Funktion (=0) deklariert wurde.
class CAnimal { public: virtual void Sound()=NULL; // PURE method, muss in der abgeleiteten Klasse neu definiert werden; die CAnimal Klasse selbst ist abstrakt geworden und kann nicht erstellt werden }; //--- abgeleitet von der abstrakten Klasse class CCat : public CAnimal { public: virtual void Sound() { Print("Myau"); } // PURE wurde neu definiert, die Klasse Ccar ist nicht abstrakt und kann erstellt werden }; //--- Beispiele für die falsche Anwendung new CAnimal; // Fehler 'CAnimal' - der Compiler zeigt die Fehlermeldung "cannot instantiate abstract class" an CAnimal some_animal; // Fehler 'CAnimal' - der Compiler zeigt die Fehlermeldung "cannot instantiate abstract class" an //--- Beispiele für die richtige Anwendung new CCat; // kein Fehler - die CCat Klasse ist nicht abstrakt; // kein Fehler - die Klasse CCat ist nicht abstraktBegrenzungen bei der Anwendung abstrakter Klassen
//+------------------------------------------------------------------+ //| Abstrakte Basisklasse | //+------------------------------------------------------------------+ class CAnimal { public: //--- rein virtuelle Funktion virtual void Sound(void)=NULL; //--- Funktion void CallSound(void) { Sound(); } //--- Konstruktor CAnimal() { //--- expliziter Aufruf der virtuellen Methode Sound(); //--- impliziter Aufruf (über eine dritte Funktion) CallSound(); //--- Konstruktor bzw. Destruktor ruft immer eigene Funktionen auf, //--- trotz der Virtualität und Neudefinierung der aufgerufenen Funktion in einer abgeleiteten Klasse //--- wenn die Funktion rein virtuell ist, //--- führt der Aufruf zum kritischen Ausführungsfehler: "pure virtual function call" } };Jedoch können Konstruktoren und Destruktoren abstrakter Klassen andere Memberfunktionen aufrufen.
typedef int (*TFunc)(int,int);Jetzt ist TFunc ein Typ, man kann die Pointer-Variable auf Funktion deklarieren:
TFunc func_ptr;In der Variablen func_ptr kann man die Funktionsadresse speichern, um diese später aufzurufen:
int sub(int x,int y) { return(x-y); } int add(int x,int y) { return(x+y); } int neg(int x) { return(~x); } func_ptr=sub; Print(func_ptr(10,5)); func_ptr=add; Print(func_ptr(10,5)); func_ptr=neg; // Fehler: neg hat nicht den Typ int (int,int) Print(func_ptr(10)); // Fehler: zwei Parameter müssen vorhanden seinPointers auf Funktionen können als Parameter gespeichert und übergeben werden. Man kann keinen Pointer auf eine nicht statische Methode der Klasse erhalten.
ulong PositionGetTicket( int index // Nummer in der Liste der Positionen );
bool PositionSelectByTicket(
ulong ticket // Ticket der Position
);
Neues Kontosystem — wie im MetaTrader 4. Dabei können Trader von allen Vorteilen der fünften Version der Plattform profitieren, zu welchen die Ausführung von Orders durch mehrere Trades (darunter auch Teilausführung), Stop Limit Orders und vieles mehr gehören.
Aktualisieren Sie die Plattform und entdecken Sie die Hedging-Option. Beim Eröffnen eine Demokontos aktivieren Sie die Option "Hedging verwenden". Sie wird verfügbar sein, wenn der Server des Brokers bereits aktualisiert und eingestellt wurde.
Neues Kontosystem — wie im MetaTrader 4. Dabei können Trader von allen Vorteilen der fünften Version der Plattform profitieren, zu welchen die Ausführung von Orders durch mehrere Trades (darunter auch Teilausführung), Stop Limit Orders und vieles mehr gehören.
Aktualisieren Sie die Plattform und entdecken Sie die Hedging-Option. Beim Eröffnen eine Demokontos aktivieren Sie die Option "Hedging verwenden". Sie wird verfügbar sein, wenn der Server des Brokers bereits aktualisiert und eingestellt wurde.
MetaEditor: Dem MQL5 Wizard wurde ein neuer Link zum Video Tutorial "Wie man einen Handelsroboter im MQL5 Wizard erstellt" hinzugefügt. Schauen Sie sich das dreiminütige Video an und erstellen Sie einen Handelsroboter, ohne eine einzige Codezeile zu schreiben.