Nueva versión de MetaTrader 5 build 5260: mejoras en Algo Forge, extensión OpenBLAS y nuevas reglas de herencia en MQL5

 

El viernes 5 de septiembre de 2025 se lanzará una versión actualizada de la plataforma MetaTrader 5.

En esta versión, hemos continuado la expansión de la biblioteca de álgebra lineal OpenBLAS en MQL5 añadiendo una nueva sección de funciones. Con estas herramientas, los desarrolladores conseguirán un ciclo de transformación completo: desde el preentrenamiento de la matriz hasta el cálculo preciso y estable de su espectro.

Además, MQL5 refuerza el control sobre la herencia y la sobrecarga de métodos en las clases y estructuras. El nuevo comportamiento de la herencia y las restricciones en el compilador evitarán posibles errores de aplicación.

Nueva versión MetaTrader 5 build 5260: mejoras en Algo Forge, extensión OpenBLAS y nuevas reglas de herencia en MQL5


También hemos mejorado el trabajo con archivos en los proyectos de Algo Forge: hemos acelerado los cálculos hash y corregido las falsas visualizaciones de los cambios en los archivos.

Asimismo, hemos publicado en el portal una guía de trabajo con MQL5 Algo Forge. En ella se muestran de forma accesible todas las características y ventajas del sistema Git para tráders algorítmicos: búsqueda y seguimiento de proyectos, suscripciones a publicaciones interesantes, trabajo en grupo y clonación de repositorios.


MetaTrader 5 Client Terminal

  1. Terminal: Corregida la visualización de los ajustes de margen en las especificaciones del instrumento comercial. Antes, al utilizarse el apalancamiento flotante (por ejemplo, según el volumen de las posiciones en la cuenta), en algunos casos la configuración del margen en las especificaciones del contrato se mostraba incorrectamente.
  2. Terminal: Corregida la clasificación de las órdenes en la pila, si el símbolo permite comerciar con precios negativos. Las solicitudes con precios positivos, negativos y cero ahora se muestran correctamente y en el orden correcto. 
  3. Terminal: Añadido al manual del terminal el apartado Cómo el simulador descarga los datos históricos En él hemos reunido la información básica necesaria para comprender el trabajo del simulador de estrategias con la historia comercial. El simulador carga siempre un "búfer histórico previo al arranque" para garantizar la estabilidad de los cálculos:
    • D1 y siguientes desde principios del año anterior. Esto ofrece una reserva de al menos 1 año de historia.  Por ejemplo, si la fecha de inicio de la prueba es el 01.03.2023, el simulador descargará los datos del terminal histórico a partir del 01.01.2022. Es decir, 14 meses antes de la fecha de inicio de las pruebas.
    • W1 - 100 barras semanales (~2 años).
    • MN1 - 100 barras mensuales (~8 años).

    Si existen menos datos, el simulador desplazará la fecha de inicio real a la fecha disponible más próxima en la que se cumplan las condiciones.

    Debido a estos requisitos, a veces sucede que las pruebas no empiezan en la fecha especificada, sino en una fecha posterior. Y esto se ve acompañado de un mensaje en el diario del simulador:

    start time changed to 2024.03.15 00:00 to provide data at beginning
  4. MQL5: Añadido 5 nuevos métodos a OpenBLAS: la nueva sección Matrix Balance, que amplía las posibilidades de trabajar con matrices cuadradas. El nuevo conjunto de funciones ofrece:
    • Equilibrado de matrices para mejorar la precisión de los cálculos de valores propios.
    • Recuperación de los vectores propios tras las transformaciones pertinentes.
    • Reducción a la forma de Hessenberg y la descomposición de Schur, incluida la generación de matrices ortogonales.

    Con estas herramientas, los desarrolladores conseguirán un ciclo de transformación completo: desde el preentrenamiento de la matriz hasta el cálculo preciso y estable de su espectro.

    Para ello, se utilizan algoritmos LAPACK de eficacia probada (GEBAL, GEBAK, GEHRD, ORGHR, HSEQR) que garantizan un alto rendimiento y fiabilidad:

    • MatrixBalance equilibra las matrices cuadradas (reales o complejas) usando permutaciones y/o escalado de filas y columnas. Reduce la norma 1, mejorando la precisión del cálculo posterior de los valores/vectores propios (usando como base la función LAPACK GEBAL).
    • EigenVectorsBackward — forma vectores propios (derechos o izquierdos) de la matriz original después de equilibrar, ejecuta la transformación inversa (basada en GEBAK). 
    • ReduceToHessenbergBalanced — convierte la matriz equilibrada a la forma de Hessenberg triangular superior usando una transformación ortogonal (GEHRD).
    • ReflectHessenbergBalancedToQ — genera una matriz ortogonal Q, que es el producto de matrices reflexivas formadas por reducción a la forma de Hessenberg (ORGHR).
    • EigenHessenbergBalancedSchurQ — realiza la descomposición de Schur: calcula los valores propios de la matriz de Hessenberg, así como las matrices T (forma de Schur triangular superior) y Z (matriz vectorial), y de ser necesario, actualiza Q (HSEQR).


  5. MQL5: Añadidos dos nuevos métodos a la sección Eigen Values. Ambas funciones permiten obtener eficientemente los vectores propios tras la descomposición de Shur y complementan el conjunto completo de herramientas de álgebra lineal en MQL5:

    • EigenVectorsTriangularZ — calcula los vectores propios de una matriz real cuasi-triangular superior o compleja triangular superior (forma de Schur). Utiliza la descomposición A = Q · T · Qᴴ (TREVC). Se caracteriza por su gran precisión.
    • EigenVectorsTriangularZBlocked — variante en bloque del cálculo de vectores propios (TREVC3). Funciona más rápido que EigenVectorsTriangularZ, pero puede resultar menos precisa.


  6. MQL5: Introducido un cambio importante en la herencia: la regla de method hiding.

    Antes, si una clase o estructura derivada definía un método con el mismo nombre que en la clase básica, se producía la sobrecarga: todas las variantes de los métodos (tanto del ancestro como del descendiente) estaban disponibles en el descendiente. Ahora, los métodos con el mismo nombre en el descendiente ocultan los métodos del ancestro (method hiding).

    Si necesita llamar a un método ancestro oculto, deberá especificar explícitamente el ámbito al llamarlo:
    class Base
      {
    public: 
       void Print(int x)   { ::Print("Base int: ", x); }
       void Print(double y){ ::Print("Base double: ", y); }
      };
    
    class Derived : public Base
      {
    public:
       void Print(string s){ ::Print("Derived string: ", s); }
      };
    
    void OnStart()
      {
       Derived d;
       d.Print("text");    // call of Derived::Print(string)
       d.Print(10);        // ATTENTION! Calling Derived::Print(string) since Base::Print is hidden (inaccessible)
       d.Base::Print(10);  // explicit call to hidden parent method
      }
    Durante algún tiempo, el compilador MQL5 generará una advertencia si un método ancestro oculto es más adecuado según los parámetros de llamada que un método descendiente disponible. El ejemplo para el código anterior es d.Print(10):
    call resolves to 'void Derived::Print(string)' instead of 'void Base::Print(int)' due to new rules of method hiding
       see declaration of function 'Derived::Print'
       see declaration of function 'Base::Print'
    implicit conversion from 'number' to 'string'

  7. MQL5: Añadido el operador using para recuperar sobrecargas de métodos ancestros.

    Para gestionar el nuevo comportamiento, en MQL5 ha aparecido el operador using. Este permite "atraer" al ámbito de una clase o estructura todas las sobrecargas de métodos del tipo básico:
    class Base
      {
    protected:
       void Print(int x)   { ::Print("Base int: ", x); }
       void Print(double y){ ::Print("Base double: ", y); }
      };
    
    class Derived : public Base
      {
    public:
       void Print(string s){ ::Print("Derived string: ", s); }
       using Base::Print;  // return Print overloads from Base
      };
    
    void OnStart()
      {
       Derived d;
       d.Print("text");   // Derived::Print(string)
       d.Print(42);       // Base::Print(int)
       d.Print(3.14);     // Base::Print(double)
      }
    Si eliminamos using Base::Print;, las llamadas d.Print(42) y d.Print(3.14) no estarán disponibles, solo quedará el método Derived::Print(string)

    Además, en el ejemplo anterior, podemos ver que los métodos protegidos del ancestro ahora están disponibles en el descendiente (protected ha cambiado a public)

    De este modo, los desarrolladores tienen ahora un control más flexible y predecible sobre las jerarquías de las clases y pueden determinar exactamente qué sobrecargas de los métodos del ancestro deben permanecer disponibles en el descendiente.

  8. MetaEditor: Acelerados los cálculos hash SHA-1 para operaciones Git al trabajar con Algo Forge. El resultado es un aumento de la productividad de más de un 40% en las operaciones masivas.
  9. MetaEditor: Corregida la lógica de comprobación de las modificaciones de archivos para operaciones Git. Si solo hemos cambiado la hora de modificación pero el contenido sigue siendo el mismo, el archivo ya no se considerará modificado. Esto eliminará las falsas detecciones y evitará conflictos con el repositorio remoto.
  10. Algo Forge: Publicada la Guía de trabajo con MQL5 Algo Forge. Con ella, aprenderá todas las ventajas clave de Git, sin su complejidad:
    • almacenamiento seguro de la historia de versiones y la gestión de ramas
    • experimentación rápida y fusión segura de los cambios,
    • repositorios propios o bifurcaciones del proyecto de otra persona con un solo clic,
    • trabajo en equipo transparente en el que se registrará la contribución de todos,
    • catálogo de proyectos abiertos y la oportunidad de aprender de los demás.


    Clonación de proyectos ajenos
    En forge.mql5.io, vaya al proyecto que desea clonar y ejecute el comando Fork. Rellene el nombre de la bifurcación que está creando con su correspondiente descripción, y guarde luego los cambios:

    Clonación de proyectos

    A continuación, vaya a MetaEditor con la misma cuenta MQL y ejecute el comando (Refresh) en el Navegador.  El proyecto clonado aparecerá en la carpeta Shared projects. Ahora cárguelo desde el portal Algo Forge con el comando Git Clone. Descargará no solo todos los archivos del proyecto, sino también toda la historia de confirmaciones y todas las ramas de ese proyecto. Es decir, podrá seguir trabajando en la bifurcación con toda la historia del proyecto clonado.  

    Comando Git Clone para obtener un proyecto de Algo Forge

  11. Añadida traducción del terminal al irlandés.
  12. Actualizadas las traducciones de la interfaz de usuario.


Web Terminal

  1. Corregida la visualización de la hora de la sesión de trabajo y de cotización en las especificaciones del símbolo
  2. Corregida la visualización de la configuración de márgenes en las especificaciones del símbolo
  3. Modificada la visualización de las sesiones de los instrumentos comerciales en las especificaciones del símbolo
  4. Añadido soporte para cuentas comerciales de tipo Contest, estas cuentas se muestran en color azul, las Demo, en verde.
  5. Corregida la precisión de los cálculos de márgenes con apalancamiento flotante en algunos casos. 
  6. Corregido el siguiente error al abrir una cuenta nueva: en algunos casos, el botón "Next" para pasar al siguiente paso no funcionaba.
  7. Corregido el error que impedía colocar una orden límite entre los precios de compra y venta en el modo de ejecución bursátil.
  8. Corregido el error de visualización del precio de ejecución de una orden. Tras el envío de la orden, en la ventana se mostrará el resultado de su ejecución: la ejecución con éxito de la operación comercial o el rechazo con la descripción del motivo donde se explica porqué no ha sido ejecutada. En algunos casos, el precio de ejecución aparecía como "0".
  9. Corregido el error que impedía mostrar el botón de cierre rápido de posiciones.

    Botón de cierre de posición

  10. Corregida la visualización de las divisas de las cuentas comerciales en la ventana de selección de la lista de cuentas.


La actualización estará disponible a través del sistema Live Update.

Documentación para MQL5: Métodos de matrices y vectores / OpenBLAS
Documentación para MQL5: Métodos de matrices y vectores / OpenBLAS
  • www.mql5.com
OpenBLAS is a high-performance open-source linear algebra library that implements BLAS (Basic Linear Algebra Subprograms) and some LAPACK functions...
 

Foro sobre el trading, sistemas de trading automáticos y simulación de estrategias comerciales.

Eventos del calendario con mas de 1 semana no cargan sus valores actuales.

Niquel Mendoza, 2025.09.07 17:09

Hola a todos,

Estoy trabajando con un EA de noticias que requiere del historial de eventos económicos para poder simularlos en el probador de estrategias. Durante las pruebas, noté resultados extraños, como la aparición del valor LONG_MIN.

Esto me recordó que los miembros de la estructura MqlCalendarValue, como actual_value entre otros miembros, están establecidos con el valor LONG_MIN cuando dicho valor no está definido. Por esa razón revisé el archivo CSV desde el cual el bot lee los eventos y confirmé que, efectivamente, algunos registros contenían ese valor.

Al consultar directamente en el calendario, observé que ciertos eventos aparecen con la marca ND (No Definido), por ejemplo: "dallas-fed-services-revenues" de USA. Sin embargo, al verificar en otras fuentes, encontré que este evento sí cuenta con un valor actualizado.

Todo indica que se trata de un error reciente.

Alguien sabe si este problema se podrá solucionar a futuro?


 

Foro sobre el trading, sistemas de trading automáticos y simulación de estrategias comerciales.

Error al usar using

Niquel Mendoza, 2025.09.06 13:12

Hola,

Con la última versión build 5260 de MT5, un código que compilaba correctamente en versiones anteriores ahora ya no compila debido a los nuevos cambios en las reglas de ocultación de funciones.

El código de ejemplo es el siguiente:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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);
 }
//+------------------------------------------------------------------+

Obviamente, este código es una recreación simplificada de lo que realmente tengo implementado (en mi caso está adaptado a una lógica de sesiones).

Con esta nueva actualización, el operator[] definido en la clase C oculta a los demás operadores heredados. Para evitar este comportamiento utilicé "using", con el objetivo de "re-exponer" los operadores de las clases base y poder usarlos en la clase C.

Sin embargo, al momento de llamar a instance[0] (que en teoría debería invocar a operator[](const int index)), aparece el siguiente error:

const int val = instance[0]; // function must have a body       mc.mq5  72      27

Por lo que entiendo, el compilador interpreta que el operador no tiene implementación y solo está declarado, cuando en realidad los tres operadores tienen cuerpo definido.

¿A alguien más le ha sucedido esto con la build 5260?
¿Alguna sugerencia para resolverlo?