Die Dokumentation wurde aktualisiert.
Die Dokumentation wurde aktualisiert.
datetime iTime( string symbol, // Symbol ENUM_TIMEFRAMES timeframe, // Zeitrahmen int shift // Verschiebung );
double iOpen( string symbol, // Symbol ENUM_TIMEFRAMES timeframe, // Zeitrahmen int shift // Verschiebung );
double iHigh( string symbol, // Symbol ENUM_TIMEFRAMES timeframe, // Zeitrahmen int shift // Verschiebung );
double iLow( string symbol, // Symbol ENUM_TIMEFRAMES timeframe, // Zeitrahmen int shift // Verschiebung );
double iClose( string symbol, // Symbol ENUM_TIMEFRAMES timeframe, // Zeitrahmen int shift // Verschiebung );
long iVolume( string symbol, // Symbol ENUM_TIMEFRAMES timeframe, // Zeitrahmen int shift // Verschiebung );
int iBars( string symbol, // Symbol ENUM_TIMEFRAMES timeframe // Zeitrahmen );
int iBarShift( string symbol, // Symbol ENUM_TIMEFRAMES timeframe, // Zeitrahmen datetime time, // Zeit bool exact=false // Modus );
int iLowest( string symbol, // Symbol ENUM_TIMEFRAMES timeframe, // Zeitrahmen int type, // Identifikator der Zeitreihe int count, // Anzahl der Elemente int start // Index );
int iHighest( string symbol, // Symbol ENUM_TIMEFRAMES timeframe, // Zietrahmen int type, // Indentifikator der Zeitreihe int count, // Anzahl der Elemente int start // Index );
long iRealVolume( string symbol, // Symbol ENUM_TIMEFRAMES timeframe, // Zeitrahmen int shift // Verschiebung );
long iTickVolume( string symbol, // Symbol ENUM_TIMEFRAMES timeframe, // Zeitrahmen int shift // Verschiebung );
long iSpread( string symbol, // Symbol ENUM_TIMEFRAMES timeframe, // Zeitrahmen int shift // Verschiebung );
void TesterHideIndicators( bool hide // Flag );
Die Dokumentation wurde aktualisiert.
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.
In der neuen Version der Plattform wird die Unterstützung für Desktop-Terminals und mobile Terminals älterer Versionen eingestellt:
Solche Terminals können sich nicht mit Servern der neuen Versionen verbinden. Wir empfehlen Ihnen ausdrücklich, Ihre Terminals vorab zu aktualisieren.
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).
Wie es funktioniert
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:
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.
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.
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:
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.
Es wurden zwei neue Optionen für die Kompilierung von MQL5-Programmen den Projekteigenschaften hinzugefügt:
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:
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.
//+------------------------------------------------------------------+ //| 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"); }
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 |
Die Bibliothek befindet sich im Verzeichnis des Terminals im Ordner Include\Generic.
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.
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.
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 */
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.
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 Dokumentation wurde aktualisiert.
//+------------------------------------------------------------------+ //| 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)
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.
Die Dokumentation wurde aktualisiert.
Die Dokumentation wurde aktualisiert.
#resource path_to_resource_file als type_of_resource_variable name_of_resource_variable
#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]
Die Dokumentation wurde aktualisiert.
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");
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 */
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"); }
#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:
#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:
Die Dokumentation wurde aktualisiert.
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.
Eigenschaften der Bibliothek
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:
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:
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.
Der Standardbibliothek wurde eine MQL5-Version der Fuzzy-Bibliothek hinzugefügt, in der Inferenzen vom Typ Mamdani und Sugeno implementiert werden.
Eigenschaften der Bibliothek
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
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); } } }
//--- 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 clrGreenWenn 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,clrWhiteWenn 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,clrRedAuf 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:
//--- 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);
Die Dokumentation wurde aktualisiert.
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:
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.