Terminal
- 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:
- zuerst werden die Symbole vom Typ AUDUSD.custom (für die
Berechnung der Margin) und USDCAD.custom (für die Berechnung des
Profits) gesucht
- 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:
- Es wird geprüft, ob ein Symbol vorhanden ist, das dem Währungspaar GBPCHF (GBP vs CHF) entspricht.
- 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.
- 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.
- 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.
- Die Aktualisierung von Werkzeugleisten nach dem Minimieren und Maximieren des Terminalfensters wurde korrigiert.
- Die Generierung der Handelshistorie von Positionen wurde beim
Überschneiden der Tickets von Abschlüssen und Positionen korrigiert.
MQL5
- 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.
- 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;
};
void OnStart()
{
LongDouble lb;
lb.double_value=MathArcsin(2.0);
printf("1. double=%f integer=%I64X",lb.double_value,lb.long_value);
lb.long_value=0x7FEFFFFFFFFFFFFF;
printf("2. double=%.16e integer=%I64X",lb.double_value,lb.long_value);
lb.long_value=0x0010000000000000;
printf("3. double=%.16e integer=%.16I64X",lb.double_value,lb.long_value);
}
- 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);};
Foo(void){value=-1;};
Foo(int v){value=v;};
};
struct MyStruct
{
string s;
Foo foo;
};
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());
}
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.
- 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.
- Nun gibt die TimeToStruct Funktion den Booleschen Wert zurück und ermöglicht es zu überprüfen, ob datetime in MqlDateTime erfolgreich umgewandelt wurde.
- 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.
- 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
- 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).
- 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.
- 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 |
- Die Synchronisierung und der Zugriff auf die Tickhistorie wurden optimiert.
- 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.
- Zahlreiche Verbesserungen in der Bibliothek der Fuzzy-Logik.
Signale
- Das Öffnen eines Signals auf der Webseite wurde korrigiert, wenn kein Handelskonto verbunden ist.
Tester
- 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.
- Die Berechnung der Haltezeit einer Position im Testbericht wurde korrigiert.
MetaEditor
- Die Anzeige statischer Arrays-Members einer Klasse im Debugger wurde korrigiert.
- 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.
Lesen Sie die vorige Nachricht: