Der neue MetaTrader 5 für iOS bietet nun die Option einer schnellen Eröffnung vorläufiger (preliminary) Konten bei einem Broker an. Nun reicht es, die Option "Realkonto eröffnen" im Menü auszuwählen und den gewünschten Broker in der Liste der Server anzugeben. Nachdem Sie persönliche Daten ausgefüllt haben, fügen Sie zwei Dokumente bei, die Ihre Identität und Wohnsitz nachweisen, und schicken Sie die Anfrage ab. Ihr Broker wird direkt ein Realkonto für Sie eröffnen. Wenn nötig kann er zusätzliche Informationen anfordern.
Das neue MetaTrader 5 Build 1605 für iOS zeichnet sich auch durch die Optimierung und das neue Design für Mail aus:
Die Dokumentation wurde aktualisiert.
Die Handelshistorie wird jetzt in Form von Positionen dargestellt. Früher wurden nur Orders und Abschlüsse im Reiter "Historie" angezeigt, nun beinhaltet er auch Positionen. Jetzt werden alle Daten einer Transaktion in eine Eintragung zusammengefasst, die folgende Informationen enthält:
Es wurde die Darstellung der Handelshistorie in Form von Positionen hinzugefügt. Früher wurden nur Orders und Abschlüsse im Reiter "Historie" angezeigt, nun beinhaltet er auch Positionen. Die Handelsplattform sammelt Details von Deals, die zu einer Positionen gehören, und gruppiert diese Daten in einer Eintragung. Die Eintragung umfasst:
//+------------------------------------------------------------------+ //| 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.
Es wurde die Möglichkeit hinzugefügt, sich bei MQL5.com mit
Facebook zu registrieren oder einzuloggen. Jeder Nutzer dieses sozialen
Netzwerkes kann jetzt in wenigen Klicks Zugang zu Chats und allen
Services für MetaTrader 5 bekommen.
#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.