MetaQuotes Software Corp.

MetaTrader 5 News

2017.01.18
  • Trade and History tabs now offer sorting by symbols (financial instruments), orders and trading time. Apart from sorting, you can also filter trades by symbols in the History tab.

  • Working with charts in multi-window mode has been optimized. The improved menu allows you to open new windows, delete old ones, as well as re-arrange them and select a desired layout (vertical, horizontal or tile).

2016.12.09

MQL5

  1. Added the CopyTicksRange function.
  2. Added improved anti-aliasing functions to CCanvas class:
  3. Added description of the graphical library to the MQL5 Reference. The library allows to quickly create histograms, distributions and line graphs right on the price charts.
  4. Added the identifiers of the state of system keys to the list of constants of Client Terminal Properties. A call to TerminalInfoInteger(TERMINAL_KEYSTATE_XXX) returns the same state code of a key as the GetKeyState() function in MSDN.
  5. Disabled the support for casting of string type to bool. To check strings, one needs to use explicit conditions. For example, in the new build, compilation of the following code will result in an error:
    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.

2016.12.02
  • We have added the two-factor authentication option using one-time passwords, which improves protection of accounts against unauthorized access. In order to enable the two-factor authentication, launch the MetaTrader 5 mobile application. Log in and choose the One-time password (OTP) generator option in the Settings window. The OTP generator can bind all your trading accounts and automatically generate a unique one-time six-digit password for each account. Enter this password when logging in to the web platform.





  • Another new option allows changing the master and investor passwords. Take this opportunity to create an easy-to-remember personal ID.
  • Also, the updated web platform can automatically generate demo accounts. Now, you can launch the MetaTrader 5 Web platform from any browser and start trading Forex, Stocks, Futures or CFDs financial instruments immediately.
2016.11.24

Terminal

  1. The order of entries in the terminal and MetaEditor journals has changed. Before the update, the latest log entries were featured first. Now the oldest entries are shown in the beginning of the journal. A more conventional reverse sorting order makes reading the journal easier.



    In addition, it is now possible to hide the 'Time' and 'Source' columns using the journal context menu.

  2. In the hedging mode, the ticket of a closed position is now displayed for the orders and deals in the trading history. This makes it easier to find related opening and closing operations.




  3. Fixed an error that caused copying of SL/TP from an existing position to a new position on the same instrument. The error could occur when using One Click Trading functions (for example, from the chart or from the Market Watch window) in the hedging mode.
  4. Fixed display of arrow objects on ultra-high-definition screens (4K).

MQL5

  1. A new ArrayPrint function has been added, which prints simple types and structures to the array log.
    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 
    */
    

  2. Fixed error in the addition of strings of type S1=S2+S1
  3. The behavior of the ArrayResize function has changed. If -1 is passed as the reserve_size parameter, the function only releases unused (reserved) memory if the function does not increase the array size. Setting the new array size to 0 with reserve_size=-1 is equivalent to the ArrayFree call. The new behavior allows optimizing memory usage in MQL5 programs.
    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");
      }
    

  4. Chart drawing functions have been added to the Standard Library. To use the new functionality, include MQL5\Include\Graphics\Graphic.mqh to your project.

    Plotting a chart based on three data series using GraphPlot:
    #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:


    Plotting a chart based on a data array using GraphPlot:
    #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:



  5. Updated functions for working with mathematical statistics in the Standard Library. We have thoroughly checked the quality and accuracy of all functions both in the MQL5 version and in the source R language. Unit tests are distributed along with the static library; the tests enable control over the accuracy and performance speed. They are available in the directory \MQL5\Scripts\UnitTests\Stat.

    • TestStat.mq5 — the main test script for checking calculation results
    • TestPrecision.mq5 — test of calculation precision
    • TestBenchmark.mq5 — the test includes computing performance measurement

Tester

  1. The updated version features advanced settings for configuring execution delays during testing. Now you can test your Expert Advisors in a variety of trading conditions, including the ideal case without a delay and any custom set delay.


    Only the random delay mode was available in earlier versions.

  2. Fixed generation of the tick volume of bars in the 'M1 based OHLC' mode.
  3. Fixed specification of order and position opening time up to milliseconds when trading in the hedging mode.
  4. Fixed "old tick" error, which could appear during multi-currency or multi-timeframe testing in the 'real ticks' mode.
  5. Improved CopyTicks performance speed when the requested ticks are read from a database located on a disk.

MetaEditor

  1. The file context menu in the Navigator and in the toolbox now features commands for working with the versioned source code repository MQL5 Storage.



  2. Fixed an error that could occasionally break the integrity of the local MQL5 Storage database when working with more than 1024 files in the repository.
  3. Fixed display of the file tree of MQL5 Storage.
  4. Fixed file display after a mass text replacement.

Updated documentation.

2016.11.24
  • Improvements of the One Click Trading panel on the chart: it is now also available in the portrait mode; trade volume can be quickly changed by selecting a desired value from the list.


  • The chart symbol can now be changed by tapping on the symbol name in the window header.
  • Improvements in the app settings section: now it features information about the current account, properly arranged units, and improved designed.
  • Multiple improvements and fixes.
2016.10.14

Terminal

  1. 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.




  2. Added new icons of orders, deals and positions in the "Trading" and "History" tabs.




  3. The updated terminal provides optimized and much faster (up to 4-5 times) display and update of the Market Depth, of the tick chart in the Market Depth, and of the Time & Sales data.
  4. Fixed synchronization of tick history during non-trading hours. The process could consume an excessive amount of network traffic in some cases.

MQL5

  1. An MQL5 version of the ALGLIB numerical analysis library has been included into the Standard Library.

    Library Features

    • Linear algebra
    • Systems of linear and nonlinear equations
    • Interpolation
    • Optimization
    • Fast Fourier transformation
    • Numerical integration
    • Linear and nonlinear least squares fitting
    • Ordinary differential equations
    • Special functions
    • Descriptive statistics and hypothesis testing
    • Data analysis - classification, regression
    • Implementing algorithms of linear algebra, interpolation, etc. in multiple-precision arithmetic (using MPFR)

    How to Use

    ALGLIB files are located in \MQL5\Include\Math\Alglib. To use the functions, add the main library file into your program:

    #include <Math\Alglib\alglib.mqh>

  2. 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:

    • Functions for the calculation of statistical characteristics of array elements
    • Options for operations with statistical distributions: normal distribution, lognormal distribution, beta distribution, etc.

    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.


  3. 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

    • 13 membership functions
    • Flexible form for developing fuzzy system rules
    • Mamdani fuzzy inference system
    • Sugeno fuzzy inference system
    • 5 defuzzification method for Mamdani-type systems
    • Unlimited amount of input and output variables

    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


  4. New property CHART_QUICK_NAVIGATION allows enabling/disabling quick navigation bar in the chart. If you need to modify and access the property state, use the ChartSetInteger and ChartGetInteger functions.




    The navigation bar is opened by pressing Enter or Space. It allows you to quickly move to the specified date on the chart, as well as to switch symbols and timeframes. If your MQL5 program processes Enter or Space key pressing, disable the CHART_QUICK_NAVIGATION property, in order to avoid interception of these events by the terminal. The quick navigation bar can still be opened by a double click.

  5. New functions FileLoad and FileSave have been added. They provide an easy method to read and save arrays to files. Unlike FileRead* and FileWrite*, these functions do not require the indicator handle. FileLoad and FileSave operate with arrays of numeric types, as well as with simple structures that do not have strings, dynamic arrays or class objects.
    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);
            }
         }
      }
    
    

  6. Modified display of custom indicators with the DRAW_CANDLES drawing mode. Now it is possible to set from one to three colors for this mode. The display of candlesticks depends on how many colors are set.

    If one color is specified, all candlesticks on the chart will be fully painted in this color.
    //--- 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  clrGreen  
    
    
    If 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,clrWhite 
    
    
    If 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,clrRed
    
    
    The 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:
    • 0 – the color of edges and shadows
    • 1 – the color of the bullish candlestick body
    • 2 – the color of the bearish candlestick body
    //--- 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);
    
    
  7. Fixed bugs and improved operation with the tick history using CopyTicks functions.
  8. Starting with the new build, operators can be used in interfaces (was not allowed before).

Market

  1. Fixed an error that could lead to the repeated request to sign in to MQL5.community when buying products from the Market.

Tester

  1. Added UI translation into Greek, Malay and Hebrew.

Updated documentation.

2016.09.29
  • Added the ability to re-size the web application blocks, including Market Watch and price chart windows.
  • Added the ability to sort by columns in Trade and History tabs of Toolbox window. The column width can be changed.
  • Added Details tab and the ability to quickly add a symbol.
  • Optimized the code to increase the overall web terminal operation speed. Account initialization, adding symbols and trading itself are now performed even faster.

2016.09.26
  • Changed Trade section display — trading data representation now depends on the risk management system on a trading account: Retail Forex, CFD, Futures or Exchange model. 


  • Moved interface language selection to a separate menu item in the general settings.
  • Fixes and improvements.
2016.09.26
  • The platform supports the multi-window mode allowing traders to monitor price changes on multiple symbols simultaneously.
  • Added the ability to change an indicator subwindow height.
  • Now, the mobile platform features a symbol fast selection button and a separate menu of chart settings.


  • Added the ability to edit indicator levels.
  • The interface is translated into Bulgarian.
2016.09.16

Terminal

  1. Implemented the new algorithm of forming the Exposure tab for an exchange market. Now, the platform adapts the display of assets depending on the risk management system applied to a trading account: Retail Forex, CFD, Futures or Exchange model.

    The Assets section is helpful for those trading Forex or futures at an exchange showing their current status on the market. Same currencies can be found in a variety of different symbols: as one of the currencies in a pair, as a base currency, etc. For example, you may have oppositely directed positions on GBPUSD, USDJPY and GBPJY. In this situation, it is very difficult to understand how much currency you have and how much you need. Having more than three positions further complicates the task. In this case, the total account status can be easily seen in the Assets tab.
    Let's use the same three positions as an example:

    Buy GBPJPY 1 lot at 134.027 — received 100 000 GBP, given 134 027 000 JPY
    Sell USDJPY 1 lot at 102.320 — given 100 000 USD, received 102 320 000 JPY
    Sell GBPUSD 1 lot at 1.30923 — given 100 000 GBP, received 103 920 USD

    We have bought and sold 100 000 GPB simultaneously. We have 0 GBP, and the Assets tab does not display this currency. As of USD, we gave a currency in one case and received it in another. The Assets tab calculates the final outcome and adds it to the current balance since the deposit currency is USD as well. JPY participated in two deals meaning that the tab displays its total value.




    Those using the exchange model can use the section to understand how their money is used. Unlike the previous model, the funds are withdrawn/added right when deals are performed. For example, if you buy EURRUB, you receive EUR at once while the appropriate sum in RUB is withdrawn from the balance. During trading, the account balance may even become negative: when you use borrowed money while purchased assets are used as the collateral. In this case, the Assets tab allows you to easily understand the trading account status.

    Additionally, you can see the liquidation value here — amount of funds on the account and the price (result) of closing all current positions at the market price.





  2. Fixed deal type display in the history of trading operations.
  3. Terminal: Fixed repeated risk notification window display when re-connecting to a trading account.
  4. Optimized and fixed working with the trading symbol selection dialog in case of a large number of symbols (several thousands and more).
  5. Fixed display of levels of built-in indicators calculated based on Moving Average (Bollinger Bands, Adaptive Moving Average, etc.). Previously, an error occurred when plotting indicators in a separate subwindow.
  6. Fixed an error that could occasionally interfere with placing a futures contract order in case an order price coincides with the upper or lower contract price limit.

MQL5

  1. Optimized and accelerated compilation of MQL5 applications.
  2. Added support for 'final' and 'override' modifiers for classes, structures and functions.

    'final' modifier for classes and structures
    The presence of the 'final' modifier when declaring a structure or a class prohibits the further inheritance from it. If there is no need to make any further changes in the class (structure) or such changes are unacceptable for security reasons, declare that class (structure) with the 'final' modifier. In this case, all class methods are also implicitly considered 'final'.
    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:
    cannot inherit from 'CFoo' as it has been declared as 'final'
    see declaration of 'CFoo'

    'override' modifier for functions
    The 'override' modifier means that a declared function should always override the parent class method. Using the modifiers allows you to avoid errors when overriding, such as accidental change of a method signature. For example, the 'func' method accepting the 'int' type variable is defined in the base class:
    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.

    In order to avoid such errors, the 'override' modifier should be explicitly added to the overridden method.
    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:
    'CBar::func' method is declared with 'override' specifier but does not override any base class method

    'final' modifier for functions

    The 'final' modifier acts in the opposite way — it disables method overriding in derived classes. If the method implementation is self-sufficient and fully completed, declare it with the 'final' modifier to ensure it is not changed later.
    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:
    'CFoo::func' method declared as 'final' cannot be overridden by 'CBar::func'
    see declaration of 'CFoo::func'
  3. Fixed compiling template functions with default parameters.

Market

  1. Fixed a few errors in sorting Market products.

Tester

  1. Fixed updating the current market prices for open orders and positions in the visual testing mode.
  2. Removed slippage during Buy Limit and Sell Limit order execution when testing using exchange symbols.
  3. Fixed occasional generation of incorrect prices in "Open prices" testing mode.
  4. Fixed generation of OnTradeTransaction events when testing.
  5. When testing based on real ticks, the data on the mismatch of tick prices (bid or last depending on the price used to generate a bar) and low or high values of the existing minute bar appears in the tester log.

MetaEditor

  1. Fixed displaying the data profiling in source code files.

Updated documentation.


Copyright 2000—2017, MetaQuotes Software Corp.

Disclaimer: MetaQuotes Software Corp. is a software development company and does not provide any kind of investment or brokerage services in financial markets.