Hola equipo de MetaQuotes, creo que he encontrado un bug respecto al uso del especificador "final".
Comenzaré explicando un breve ejemplo de cómo "ocurre" este bug. Digamos que tengo una clase base CObject con una función virtual Function().
Ahora también crearé otra clase CFigure; esta clase hereda de CObject, sobrescribiendo la función Function() con el especificador final. A este punto, si se crea otra clase heredera de CFigure y se sobrescribe la función Function(), nos debería dar un error de compilación indicando que la función no puede ser sobrescrita, dado que ha sido declarada con el especificador final, y efectivamente da ese error.
El código que se basa en mi idea es el siguiente.
//+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class CObject { public: CObject(void) {} ~CObject(void) {} virtual void Function() { Print("CObject");} }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class CFigure : public CObject { public: CFigure(void) {} ~CFigure(void) {} void Function() override final { Print("CFigure"); } }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class CRect : public CFigure { public: CRect(void) {} ~CRect(void) {} void Function() override final { Print("CRect"); } }; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { CObject* ptr = new CRect(); ptr.Function(); delete ptr; Print(__MQLBUILD__); } //+------------------------------------------------------------------+
Al tratar de compilar este script, obtuvimos un error de compilación como era de esperarse.
'CFigure::Function' method declared as 'final' cannot be overridden by 'CFigure::Function' test.mq5 33 22 see declaration of function 'CFigure::Function' test.mq5 21 22 1 errors, 0 warnings 1 0
Bueno, el bug en cuestión aparece cuando, en vez de definir el cuerpo de la función CFigure::Function() en el cuerpo de la clase CFigure, la definimos fuera de esta.
//+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class CObject { public: CObject(void) {} ~CObject(void) {} virtual void Function() { Print("CObject");} }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class CFigure : public CObject { public: CFigure(void) {} ~CFigure(void) {} void Function() override final; }; //+------------------------------------------------------------------+ void CFigure::Function(void) { Print("CFigure"); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class CRect : public CFigure { public: CRect(void) {} ~CRect(void) {} void Function() override final { Print("CRect"); } }; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { CObject* ptr = new CRect(); ptr.Function(); delete ptr; Print(__MQLBUILD__); } //+------------------------------------------------------------------+
Al compilar el script, sorprendentemente no obtenemos errores.
code generated 0 0 errors, 0 warnings, 511 msec elapsed, cpu='X64 Regular' 0
Ahora, ejecutado el script test.mq5, como output en la sección Experts obtenemos esto.
2025.12.21 20:05:58.339 test (USDCAD,M15) CRect 2025.12.21 20:05:58.339 test (USDCAD,M15) 5430
Y esto también es un error, dado que debería imprimirse CFigure si se respeta el especificador final, pero no.
Debido a lo anterior, agradecería al equipo de MetaQuotes si pudiera revisar este bug y considerar una posible corrección en futuras builds.
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
El viernes 14 de noviembre de 2025 se lanzará la versión actualizada de la plataforma MetaTrader 5.
En esta versión hemos actualizado el núcleo gráfico para renderizar gráficos. Ahora se usa el moderno motor Blend2D en lugar del anticuado GDI. El motor ofrece una representación mucho más rápida y fluida de gráficos e indicadores. Gracias a los modernos algoritmos de renderizado y a la compatibilidad con optimizaciones de hardware, ofrece gráficos nítidos y detallados, un trabajo correcto con la transparencia y una visualización estable en todos los sistemas, incluidas las pantallas de alta resolución.
Además, hemos ampliado el soporte de la biblioteca de álgebra lineal OpenBLAS en MQL5 agregando unas 20 nuevas funciones para trabajar con matrices y vectores.
Asimismo, en la nueva versión hemos mejorado la versión web de la plataforma: ahora es aún más estable y segura, y existe la posibilidad de cambiar el modo de visualización del volumen en la profundidad de mercado.
MetaTrader 5 Client Terminal
Mayor rendimiento
Blend2D utiliza una arquitectura de renderizado moderna y usa eficientemente procesadores multinúcleo, lo que garantiza un renderizado fluido de gráficos e indicadores incluso con un gran número de objetos en pantalla.
Aceleración y optimización de hardware para CPU modernas
Blend2D está optimizado para los modernos conjuntos de instrucciones (SSE, AVX), lo cual aumenta significativamente la velocidad de renderizado en comparación con GDI, que no utiliza estas características.
Gráficos claros y fluidos
Con algoritmos avanzados de antialiasing y un manejo preciso del color, Blend2D ofrece líneas más suaves, transiciones más fluidas y gráficos visualmente más limpios, especialmente perceptibles al escalar y trabajar en altas resoluciones (HiDPI, 4K).
Efectos modernos y transparencia
Blend2D admite la composición alfa y operaciones avanzadas de color, lo que permite mostrar elementos translúcidos, sombras y otros efectos gráficos avanzados.
Renderizado unificado y estable
Blend2D funciona con la misma estabilidad en todos los sistemas, ofreciendo resultados idénticos independientemente de la versión del sistema operativo o de la configuración del controlador de vídeo.
MetaTrader 5 WebTerminal
La actualización estará disponible a través del sistema Live Update.