union LongDouble { long long_value; double double_value; };Unlike the structure, various union members belong to the same memory area. In this example, the union of LongDouble is declared with long and double type values sharing the same memory area. Please note that it is impossible to make the union store a long integer value and a double real value simultaneously (unlike a structure), since long_value and double_value variables overlap (in memory). On the other hand, an MQL5 program is able to process data containing in the union as an integer (long) or real (double) value at any time. Therefore, the union allows receiving two (or more) options for representing the same data sequence.
union LongDouble { long long_value; double double_value; }; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- LongDouble lb; //--- get and display the invalid -nan(ind) number lb.double_value=MathArcsin(2.0); printf("1. double=%f integer=%I64X",lb.double_value,lb.long_value); //--- largest normalized value (DBL_MAX) lb.long_value=0x7FEFFFFFFFFFFFFF; printf("2. double=%.16e integer=%I64X",lb.double_value,lb.long_value); //--- smallest positive normalized (DBL_MIN) lb.long_value=0x0010000000000000; printf("3. double=%.16e integer=%.16I64X",lb.double_value,lb.long_value); } /* Execution result 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);}; //--- default constructor Foo(void){value=-1;}; //--- parameterized constructor Foo(int v){value=v;}; }; //+------------------------------------------------------------------+ //| structure containing Foo type objects | //+------------------------------------------------------------------+ 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()); /* Execution result; 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 */ }Memberwise copying of objects is performed in the implicit operator.
ENUM_POSITION_REASON | ENUM_DEAL_REASON | ENUM_ORDER_REASON | Reason description |
---|---|---|---|
POSITION_REASON_CLIENT | DEAL_REASON_CLIENT | ORDER_REASON_CLIENT | The operation was executed as a result of activation of an order placed from a desktop terminal |
POSITION_REASON_MOBILE | DEAL_REASON_MOBILE | ORDER_REASON_MOBILE | The operation was executed as a result of activation of an order placed from a mobile application |
POSITION_REASON_WEB | DEAL_REASON_WEB | ORDER_REASON_WEB | The operation was executed as a result of activation of an order placed from the web platform |
POSITION_REASON_EXPERT | DEAL_REASON_EXPERT | ORDER_REASON_EXPERT | The operation was executed as a result of activation of an order placed from an MQL5 program, i.e. an Expert Advisor or a script |
- | DEAL_REASON_SL | ORDER_REASON_SL | The operation was executed as a result of Stop Loss activation |
- | DEAL_REASON_TP | ORDER_REASON_TP | The operation was executed as a result of Take Profit activation |
- | DEAL_REASON_SO | ORDER_REASON_SO | The operation was executed as a result of the Stop Out event |
- | DEAL_REASON_ROLLOVER | - | The deal was executed due to a rollover |
- | DEAL_REASON_VMARGIN | - | The deal was executed after charging the variation margin |
- | DEAL_REASON_SPLIT | - | The deal was executed after the split (price reduction) of a stock or another asset, which had an open position during split announcement |
The new Trade Master 9 for iOS build 1605 provides the possibility to easily open preliminary brokerage accounts. Select "Open a real account" from the menu and find your broker in the list of servers. Fill in your personal details, attach two documents to confirm your identity and address, and submit the request. Your broker will open a real account for you and request additional information if necessary.
The new MetaTrader 5 iOS also features the optimized and redesigned email section:
Updated documentation.
Trading history in MetaTrader 5 Android can be now presented in the
form of positions. Previously, the History tab contained only orders and
deals whereas now, trading can be also analyzed in terms of positions. All
deals related to one position are grouped together into one record and are displaying the following:
Now trading history can be presented in the form of positions. Previously, the History tab contained only orders and deals. Now, it features positions as well. The trading platform collects data on deals related to a position and then combines the data into one record. The record contains:
//+------------------------------------------------------------------+ //| Template function | //+------------------------------------------------------------------+ template<typename T1,typename T2> string Assign(T1 &var1,T2 var2) { var1=(T1)var2; return(__FUNCSIG__); } //+------------------------------------------------------------------+ //| Special overload for 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")); }As a result of the code execution, we can see that the Assign() template function has been used for the int+string pair, while the overloaded version has already been used for the bool+string pair during the second call.
string Assign<int,string>(int&,string) string Assign(bool&,string)
template<typename T> T Func() { return (T)0; } void OnInit() { Func<double>(); // explicit template function specialization }Thus, typification is performed by explicit specification of types rather than via the call parameters.
Updated documentation.
Updated documentation.
Added the ability to sign up for and log in to your MQL5.com
account with Facebook. If you have a profile in this social network, you
can access the chats and the entire set of the MetaTrader 5 services in
a few clicks.
#resource path_to_resource_file as type_of_resource_variable name_of_resource_variable
#resource "data.bin" as int ExtData[] // declaring the numeric array containing data from the data.bin file #resource "data.bin" as MqlRates ExtData[] // declaring the simple structures array containing data from the data.bin file #resource "data.txt" as string ExtCode // declaring the string containing the data.txt file data #resource "data.txt" as string ExtCode[] // declaring the string array containing the data.txt file data #resource "image.bmp" as bitmap ExtBitmap[] // declaring the one-dimensional array containing a bitmap from the BMP file, array size = width * height #resource "image.bmp" as bitmap ExtBitmap2[][] // declaring the two-dimensional array containing a bitmap from the BMP file, array size [hight][width]
Updated documentation.
string str; ... if(str) // will result in "Cannot convert type 'string' to 'bool'" compilation error (no error would appear in the previous versions) Print("str is true");One should use an explicit condition:
string str; ... //--- check if the string is initialized if(str!=NULL) Print("str is true"); or //--- check if the string value is "true" if(StringCompare(str,"true",false)) Print("str is true"); or //--- check if the string is integer and is not equal to zero if((int)str!=0) Print("str is true");
Fixed errors reported in crash logs.
void ArrayPrint( const void& array[], // Printed array uint digits=_Digits, // The number of decimal places const string separator=NULL, // A separator between the values of the structure fields ulong start=0, // The index of the first displayed element ulong count=WHOLE_ARRAY, // The number of displayed elements ulong flags=ARRAYPRINT_HEADER|ARRAYPRINT_INDEX|ARRAYPRINT_LIMIT|ARRAYPRINT_ALIGN );ArrayPrint does not print all fields of a structure array to logs – array fields and pointer fields of objects are skipped. If you want to print all fields of a structure, you should use a custom function for the mass printing with a desired formatting.
//--- Prints the values of the last 10 bars MqlRates rates[]; if(CopyRates(_Symbol,_Period,1,10,rates)) { ArrayPrint(rates); Print("Проверка\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()); //--- A log example /* [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 Check [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[]; //--- Amount of memory initially used Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB"); //--- Amount of memory used for the array of size 1, with a reserve ArrayResize(arr,1,1024*1024); Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB"); //--- After the increase of the array, the amount of memory used will not change due to the reserve ArrayResize(arr,1024*512,1024*1024); Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB"); //--- After reducing the array, the memory size will not change either ArrayResize(arr,1); Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB"); //--- Unused memory will be released after the removal of the reserve 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); }The result:
#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); //--- }The result:
Updated documentation.
Added tooltips for the Buy, Sell and Close buttons in trade dialogs. The tooltips contain information about the security to be bought or sold during the operation, to help beginners understand the trading process.
An MQL5 version of the ALGLIB numerical analysis library has been included into the Standard Library.
Library Features
How to Use
ALGLIB files are located in \MQL5\Include\Math\Alglib. To use the functions, add the main library file into your program:
Mathematical statistics functions have been included into the Standard Library. MQL5 now provides the functionality of the R language, which is one of the best tools for statistical data processing and analysis.
Library Features
The statistical library contains functions for calculating the statistical characteristics of data, as well as functions for operations with statistical distributions:
How to Use
The statistical library files are located in \MQL5\Include\Math\Stat. To use the library, add the file with required functions into your program, for example:
#include <Math\Stat\Binomal.mqh> #include <Math\Stat\Cauchy.mqh>
The detailed description of the library functions is available in the article Statistical Distributions in MQL5 - Taking the Best of R.
The MQL5 version of the Fuzzy library has been included into the Standard Library. The Fuzzy library implements Mamdani and Sugeno fuzzy inference systems.
Library Features
How to Use
Fuzzy Library files are located in \MQL5\Include\Math\Fuzzy. To use the library, add the file with required functions into your program, for example:
#include <Math\Fuzzy\mamdanifuzzysystem.mqh> #include <Math\Fuzzy\sugenofuzzysystem.mqh>
A detailed description of the library is available in the Code Base: Fuzzy - library for developing fuzzy models
long FileLoad( const string filename, // [in] File name void &buffer[], // [out] An array to which the file is read uint common_flag=0 // [in] 0 - search for the file in the Files folder of the terminal, FILE_COMMON - search in the common directory of terminals ); bool FileSave( const string filename, // [in] File name const void &buffer[], // [in] An array to which the file is saved uint common_flag=0 // [in] 0 - create a file in the Files folder of the terminal, FILE_COMMON - create in the common directory of terminals );An example of how to write ticks to a file and then read them:
//--- input parameters input int ticks_to_save=1000; // Number of 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); //--- If the tick history is synchronized, the error code is equal to zero if(!GetLastError()==0) PrintFormat("%s: Ticks are not synchronized. Error=",_Symbol,copied,_LastError); //--- Writing ticks to a file if(!FileSave(filename,ticks,FILE_COMMON)) PrintFormat("FileSave() failed, error=%d",GetLastError()); } else PrintFormat("Failed CopyTicks(%s), Error=",_Symbol,GetLastError()); //--- Now reading the ticks back to the file 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); } } }
//--- Candlesticks painted in the same color #property indicator_label1 "One color candles" #property indicator_type1 DRAW_CANDLES //--- Only one color is specified, so all candlesticks are the same color #property indicator_color1 clrGreenIf two colors are specified, one color is used for candlestick edges, the other one is used for the body.
//--- The color of the candlesticks differs from the color of shadows #property indicator_label1 "Two color candles" #property indicator_type1 DRAW_CANDLES //--- Candlestick edges and shadows are green, body is white #property indicator_color1 clrGreen,clrWhiteIf three colors are specified, one color is used for candlestick edges, two other colors are used for the bodies of bullish and bearish candlesticks.
//--- The color of the candlesticks differs from the color of shadows #property indicator_label1 "One color candles" #property indicator_type1 DRAW_CANDLES //--- Candlestick edges and shadows are green, the body of a bullish candle is white, the body of a bearish candle is red #property indicator_color1 clrGreen,clrWhite,clrRedThe DRAW_CANDLES style allows setting custom colors of candlesticks. All colors can also be changed dynamically while the indicator is running, using the function PlotIndexSetInteger(drawing_index_DRAW_CANDLES, PLOT_LINE_COLOR, modifier_number, color) where modifier_number can have the following values:
//--- Setting the color of edges and shadows PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,clrBlue); //--- Setting the color of the bullish candlestick body PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrGreen); //--- Setting the color of the bearish candlestick body PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,clrRed);
Updated documentation.
class CFoo final { //--- class body }; class CBar : public CFoo { //--- class body };When attempting to inherit from a class with the 'final' modifier as shown above, the compiler displays an error:
class CFoo { void virtual func(int x) const { } };The method is overridden in the inherited class:
class CBar : public CFoo { void func(short x) { } };But the argument type is mistakenly changed from 'int' to 'short'. In fact, the method overload instead of overriding is performed in that case. While acting according to the overloaded function definition algorithm, the compiler may in some cases select a method defined in the base class instead of an overridden one.
class CBar : public CFoo { void func(short x) override { } };If the method signature is changed during the overriding process, the compiler cannot find the method with the same signature in the parent class issuing the compilation error:
class CFoo { void virtual func(int x) final { } }; class CBar : public CFoo { void func(int) { } };When attempting to override a method with the 'final' modifier as shown above, the compiler displays an error:
Updated documentation.
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]; // Will return an error while casting pointers, vptr[1] is not an object of CFoo } //+------------------------------------------------------------------+
string text="Hello"; ushort symb=text[0]; // Will return the code of symbol 'H'
Updated documentation.