New MetaTrader 5 Platform Build 5260: Enhancements in Algo Forge, extended OpenBLAS support, and new inheritance rules in MQL5
Cloning Another Developer's Project
Open the project you want to clone on forge.mql5.io and click Fork. Enter a name and description for the fork and save.
"Forking" and "Cloning" are two completely different concepts. The described procedure is "Forking" and not "Cloning".
A "fork" no longer has access to updates from the original repository, while a "clone" continues to have access to any current changes and updates.
Please provide a mechanism for both and please don't mix the two up.
On Friday, September 5, 2025, an updated version of the MetaTrader 5 platform will be released.
In this build, we continue expanding the OpenBLAS linear algebra library in MQL5 with a new set of functions. These methods provide developers with a complete transformation cycle, from preliminary matrix preparation to precise and stable spectrum computation.
Will this OpenBlas update finally allow MT5 to recognize SMT (simultanous multi threading) CPU cores in the "agents" of the local network farm so that it can use each thread of each core for backtesting?
"Forking" and "Cloning" are two completely different concepts. The described procedure is "Forking" and not "Cloning".
A "fork" no longer has access to updates from the original repository, while a "clone" continues to have access to any current changes and updates.
Please provide a mechanism for both and please don't mix the two up.
Hi Fernando,
you are correct regarding the strict difference between fork and clone in Git. However, I believe MetaQuotes described it this way due to the design of Algo Forge:
- In MetaEditor, the only visible action to bring that repository locally is Clone. From the user's perspective, the actual operation they perform is cloning.
- For the sake of terminological simplification, MQ refers to the whole flow as cloning, even though technically it is a fork + clone sequence.
This avoids exposing two separate operations, even if Git makes a clear distinction between them.
- In MetaEditor, the only visible action to bring that repository locally is Clone. From the user's perspective, the actual operation they perform is cloning.
- For the sake of terminological simplification, MQ refers to the whole flow as cloning, even though technically it is a fork + clone sequence.
This avoids exposing two separate operations, even if Git makes a clear distinction between them.
No and please don't try to pass it off as a "feature"!
MetaQuotes' AlgoForge is built using the well known open-source ForgeJo solution, and it's MetaQuotes' implementation in MetaEditor that is flawed and misnamed, because the concepts are being mixed up.
As I explained in prior post on another topic, if one uses a external Git client to initiate the cloning process, then after that MetaEditor functions as expected to a certain degree. So, what is missing in MetaEditor is a proper implementation and not a mix of Clone and Fork.
- forgejo.org
No and please don't try to pass it off as a "feature"!
MetaQuotes' AlgoForge is built using the well known open-source ForgeJo solution, and it's MetaQuotes' implementation in MetaEditor that is flawed and misnamed, because the concepts are being mixed up.
As I explained in prior post on another topic, if one uses a external Git client to initiate the cloning process, then after that MetaEditor functions as expected to a certain degree. So, what is missing in MetaEditor is a proper implementation and not a mix of Clone and Fork.
My comment was descriptive, not justificative. I assume MQ chose this wording to keep the MetaEditor workflow simple for end-users who only see the Clone action.
Forum on trading, automated trading systems, and simulation of trading strategies.
Nickel Mendoza , 2025.09.06 13:12
Hello,
With the latest MT5 build 5260 , code that compiled correctly in previous versions now no longer compiles due to new changes to the function hiding rules .
The example code is as follows:
//+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class A { protected : int arr[]; public : void Init(); int operator []( const int index) { return arr[index]; } }; //+------------------------------------------------------------------+ void A::Init() { ArrayResize (arr, 10 ); MathSrand ( GetTickCount ()); for ( int i = 0 ; i < 10 ; i++) { arr[i] = MathRand (); } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class B : public A { public : using A:: operator []; int operator []( const string name) { return name == "Hello" ? arr[ 0 ] : arr[ 2 ]; } }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ enum ENUM_TYPE_SELECT { SELECT_0 = 0 , SELECT_1 = 1 }; //+------------------------------------------------------------------+ class C : public B { public : using B:: operator []; // int operator []( const ENUM_TYPE_SELECT type) { return arr[type]; } }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnStart () { C instance; instance.Init(); const int val = instance[ 0 ]; Print (val); } //+------------------------------------------------------------------+
Obviously, this code is a simplified recreation of what I actually have implemented (in my case it is adapted to a session logic).
With this new update, the operator[] defined in class C hides the other inherited operators. To avoid this behavior, I used "using" to "re-expose" the base class operators so they could be used in class C.
However, when calling instance[0] (which should theoretically call operator[](const int index)), the following error appears:
const int val = instance[ 0 ]; // function must have a body mc.mq5 72 27
From what I understand, the compiler interprets that the operator has no implementation and is only declared, when in reality all three operators have defined bodies.
Has this happened to anyone else with build 5260?
Any suggestions to solve it?
"Forking" and "Cloning" are two completely different concepts. The described procedure is "Forking" and not "Cloning".
A "fork" no longer has access to updates from the original repository, while a "clone" continues to have access to any current changes and updates.
Please provide a mechanism for both and please don't mix the two up.
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
On Friday, September 5, 2025, an updated version of the MetaTrader 5 platform will be released.
In this build, we continue expanding the OpenBLAS linear algebra library in MQL5 with a new set of functions. These methods provide developers with a complete transformation cycle, from preliminary matrix preparation to precise and stable spectrum computation.
In addition, MQL5 now enforces stricter control over inheritance and method overloading in classes and structures. The new inheritance behavior and compiler constraints help prevent potential errors in application logic.
We have also improved file handling in Algo Forge projects, accelerating hash calculations and eliminating false detections of file modifications.
On the service website, we have published comprehensive MQL5 Algo Forge documentation. It clearly demonstrates all the features and advantages of using the Git system for algorithmic traders: how to explore projects, follow interesting publications, collaborate, and clone repositories.
MetaTrader 5 Client Terminal
These methods give developers a complete transformation cycle, from preliminary matrix preparation to precise and stable spectrum computation.
The methods are based on LAPACK algorithms (GEBAL, GEBAK, GEHRD, ORGHR, HSEQR), ensuring high performance and reliability:
Previously, if a derived class or structure defined a method with the same name as in the base class, overloading was performed: all versions (from both the parent and child) were available in the derived class. Now, methods with the same name in a derived class hide base class methods (method hiding).
To call a hidden base class method, you must explicitly specify its scope when calling it: For some time, the MQL5 compiler will issue a warning if a hidden base method is a better match for the call parameters than the available derived method. Example for the above code d.Print(10):
see declaration of function 'Derived::Print'
see declaration of function 'Base::Print'
implicit conversion from 'number' to 'string'
To control the new behavior, MQL5 introduces the 'using' operator. It allows you to "pull" all overloads of a method from the base type into the scope of a class or structure:
If 'using Base::Print;' is removed, then calls to d.Print(42) and d.Print(3.14) will be unavailable; only Derived::Print(string) will remain.
Additionally, in this example, you can see that protected methods from the base class become accessible in the derived class (their visibility changes from protected to public).
This gives developers more flexible and predictable control over class hierarchies, allowing them to precisely define which base class method overloads should remain accessible in derived types.
Cloning Another Developer's Project
Open the project you want to clone on forge.mql5.io and click Fork. Enter a name and description for the fork and save.
In MetaEditor, using the same MQL5 account, run the Refresh command in the Navigator. Your fork will appear in the Shared Projects folder. Download it from Algo Forge using Git Clone. You'll receive not only the project files but also its full commit history and all branches. This means you can continue working on the fork while still having the entire history of the cloned project.
Web Terminal
The update will be available through the Live Update system.