New MetaTrader 5 Platform Build 5200: Extended OpenBLAS support and enhanced control in MQL5

What's new in MetaTrader 5

31 July 2025

Terminal

  1. Added the ability to automatically apply the light or dark theme based on your Windows settings. To enable this, select the new option: View \ Color Themes \ System. Each time the platform launches, it will detect your system theme and adjust accordingly.


    Added the ability to automatically apply the light or dark theme based on your Windows settings


  2. Fixed display issues with toolbars detached from the main window.
  3. Fixed the portfolio liquidation value calculation in the Assets section. In some cases, positions for certain instruments were not accounted for.
  4. Fixed the display of negative prices in the Depth of Market. These are now sorted correctly.
  5. Fixed price history import to custom symbols. For instruments located in the root folder, the corresponding commands could previously be unavailable.
  6. Updated user interface translations.

MQL5

  1. Added new OpenBLAS methods:

    Matrix Reductions

    • ReduceToHessenberg — reduces a real or complex general n-by-n matrix A to upper Hessenberg form B by an orthogonal similarity transformation: Q**T * A * Q = H. LAPACK function GEHRD.
    • ReflectHessenbergToQ — generates orthogonal matrix Q which is defined as the product of n-1 elementary reflectors of order n, as returned by ReduceToHessenberg: Q = H(1) H(2) . . . H(n-1). LAPACK function ORGHR.

    Eigenvalues and Eigenvectors

    • EigenHessenbergSchurQ — computes the eigenvalues of a Hessenberg matrix H and the matrices T and Z from the Schur decomposition H = Z T Z**T, where T is an upper quasi-triangular matrix (the Schur form), and Z is the orthogonal matrix of Schur vectors. LAPACK function HSEQR.

    Linear Equations

    • SylvesterEquationTriangular — solves Sylvester equation for real quasi-triangular or complex triangular matrices: op(A)*X + X*op(B) = scale*C or op(A)*X - X*op(B) = scale*C where op(A) = A or A**T or A**H, and A and B are both upper triangular. LAPACK function TRSYL.
    • SylvesterEquationTriangularBlocked — solves Sylvester equation for real quasi-triangular or complex triangular matrices: op(A)*X + X*op(B) = scale*C or op(A)*X - X*op(B) = scale*C where op(A) = A or A**T or A**H, and A and B are both upper triangular. LAPACK function TRSYL3. This is the block (BLAS level 3) version of TRSYL. Faster up to 5 times but not so accurate.

    Factored Calculations

    • SylvesterEquationSchur — solves Sylvester equation for real quasi-triangular or complex triangular matrices: A*X + X*B = C where A and B are both upper triangular. A is m-by-m and B is n-by-n; the right hand side C and the solution X are m-by-n. LAPACK function TRSYL.
    • SylvesterEquationSchurBlocked — solves Sylvester equation for real quasi-triangular or complex triangular matrices: A*X + X*B = C where A and B are both upper triangular. A is m-by-m and B is n-by-n; the right hand side C and the solution X are m-by-n. LAPACK function TRSYL3. This is the block (BLAS level 3) version of TRSYL. Faster up to 5 times but not so accurate.

    Matrix Norm Calculations

    • MatrixNorm — returns the value of the 1-norm, infinity-norm, Frobenius norm, or the largest absolute value of any element of a general rectangular matrix. LAPACK function LANGE.
    • MatrixNormGeTrid — returns the value of the 1-norm, infinity-norm, Frobenius norm, or the largest absolute value of any element of a general tridiagonal matrix. LAPACK function LANGT.
    • MatrixNormHessenberg — returns the value of the 1-norm, infinity-norm, Frobenius norm, or the largest absolute value of any element of an upper Hessenberg matrix. LAPACK function LANHS.
    • MatrixNormSy — returns the value of the 1-norm, infinity-norm, Frobenius norm, or the largest absolute value of any element of a real symmetric or complex Hermitian matrix. LAPACK functions LANSY, LANHE.
    • MatrixNormComplexSy — returns the value of the 1-norm, infinity-norm, Frobenius norm, or the largest absolute value of any element of a complex symmetric (not Hermitian) matrix. LAPACK function LANSY.
    • MatrixNormSyTrid — returns the value of the 1-norm, infinity-norm, Frobenius norm, or the largest absolute value of any element of a real symmetric or complex Hermitian tridiagonal matrix. LAPACK functions LANST, LANHT.
    • MatrixNormTriangular — returns the value of the 1-norm, infinity-norm, Frobenius norm, or the largest absolute value of any element of a trapezoidal m-by-n or triangular matrix. LAPACK function LANTR.

    Matrix Classification

    • IsSymmetric — checks if a square matrix is symmetric.
    • IsHermitian — checks if a square complex matrix is Hermitian.
    • IsUpperTriangular — checks if a square matrix is upper triangular.
    • IsLowerTriangular — checks if a square matrix is lower triangular.
    • IsTrapezoidal — checks if a rectangular (not square) m-by-n matrix is upper or lower trapezoidal.
    • IsUpperHessenberg — checks if a square matrix is upper Hessenberg matrix.
    • IsLowerHessenberg — checks if a square matrix is lower Hessenberg matrix.
    • IsTridiagonal — checks if a square matrix is tridiagonal.
    • IsUpperBidiagonal — checks if a square matrix is upper bidiagonal.
    • IsLowerBidiagonal — checks if a square matrix is lower bidiagonal.
    • IsDiagonal — checks if a square matrix is diagonal.
    • IsScalar — checks if a square matrix is scalar matrix.

  2. Added the Conjugate method for complex matrices and vectors. This method changes the sign of the imaginary part of a complex number and returns the modified matrix or vector.
  3. Strengthened method hiding rules. When a derived class contains a method with the same name as one in the base class, the derived class version is now called by default. To explicitly call the base class method, a qualifier is now required:
    struct A
      {
       int y;
      
       string func(double x)
         {
          return(__FUNCSIG__);
         }
      };
      
    struct B : public A
      {
       string func(int x)   // the method hides A::func
         {
          return(__FUNCSIG__);
         }
      };
      
    void OnStart(void)
      {
       B b;
       b.func(M_PI);          // according to new rules, it is a call to B::func
       b.A::func(M_PI);       // call the hidden method A::func
      }
    This change simplifies code readability and eliminates ambiguity that was previously only accompanied by a compiler warning.

    Previously, compilation would issue a warning:
    deprecated behavior, hidden method calling will be disabled in a future MQL compiler version
    This change has now taken effect.

    For a number of builds, a warning will still appear in the log if a more suitable hidden method is available based on the parameters:
    call resolves to 'string B::func(int)' instead of 'string A::func(double)' due to new rules of method hiding
       see declaration of function 'B::func'
       see declaration of function 'A::func'
    truncation of constant value from 'double(3.141592653589793)' to 'int(3)'
  4. Duplicate names within the same scope are now prohibited. For example, it was previously possible to declare an input parameter and a function with the same name within a single file. Such duplication is no longer allowed:
    input int somename=42;
    
    int somename(int x)
      {
       return(42);
      }
  5. Added strict type checking for default values in enumerations. For function parameters accepting an enum, not only the value but also the exact type must now match:
    int somename(ENUM_TIMEFRAMES TF=PERIOD_CURRENT);
    
    int somename(ENUM_TIMEFRAMES TF=0)   // error, type mismatch for the default parameter value, despite having the same value
      {
       return(42);
      }
  6. Identical identifiers are now prohibited across different enumerations. An identifier declared in one enumeration can no longer be reused in another within the same scope:
    enum A
      {
       Value
      };
      
    enum B
      {
       Value  // error, name 'Value' is already used in enumeration A
      };
      
    void OnStart(void)
      {
       enum C
         {
          Value // OK, 'Value' is not used within the OnStart scope
         };
      }
    Matching names can be used in different scopes.

  7. Introduced stricter requirements for template initializer functions. When creating matrices/vectors using initializer functions, the following features are now disabled:

    • Automatic type deduction in template functions
    • Default parameter values

    All template parameters and arguments must now be specified explicitly: 
    template<typename T>
    void Initializer(matrix<T>& mat,int method=0);
    
    matrix<double> A(10,10,Initializer,42);          // error, Initializer must be explicitly typed
    matrix<double> A(10,10,Initializer<double>);     // error, missing 'method' parameter (default values no longer supported)
    matrix<double> A(10,10,Initializer<double>,42);  // OK
  8. Improved ONNX support. Added implicit conversion of signed types when passing ulong arrays to functions, simplifying MQL5 integration with ONNX models.
    OnnxSetInputShape( … , ulong_array );
    OnnxSetOutputShape( … , ulong_array );
  9. Fixed display of types in compiler warnings related to implicit string conversions.
  10. Updated Python integration package. To install the update, run the command:
    pip install --upgrade MetaTrader5

MetaEditor

  1. Fixed the "Revert to Revision" command used with MQL5 Storage. Conflict evaluation between versions that may occur during a revert operation is now performed before the operation begins. If reverting is not possible, the operation is canceled.
  2. Updated user interface translations.

Tester

  1. Tester: Fixed the OrderCalcMargin function for accounts with the Exchange calculation mode.
  2. Tester: Fixed switching between charts during visual testing of multicurrency Expert Advisors.
  3. Updated user interface translations.

Web Terminal

  1. Fixed email verification during demo and preliminary account registration. In some cases, the input field for the confirmation code was not displayed.
  2. Fixed account connection issues when using the browser on Huawei devices.
  3. Fixed connection to accounts when using one-time passwords. In some cases, the input field for the OTP was missing on the first login attempt.