Probando el nuevo compilador MQL5 para plataformas x64 - ¡Cálculos de 2 a 10 veces más rápidos!

 

Como prometimos anteriormente, estamos lanzando un nuevo compilador MQL5 optimizado para la versión de 64 bits de MetaTrader 5.

Hemos mantenido la plena compatibilidad del código generado tanto para las versiones de 32 bits del terminal como para las versiones más antiguas de los terminales.

Ya puede actualizar a MetaTrader 5 build 1108 con su nueva funcionalidad en nuestro servidor MetaQuotes-Demo. Para activar el nuevo compilador de optimización, añada la clave Optimize=1 a [Expertos] en metaeditor.ini:

[Experts]
Author=Copyright 2014, MetaQuotes Software Corp.
Address=http://www.mql5.com
Optimize=1


Para comprobar el rendimiento de los compiladores MQL4, MQL5 y C++, hemos utilizado las pruebas estándar de los compiladores. Se adjuntan todos los archivos de origen junto con la hoja de cálculo Excel, para que todo el mundo pueda volver a comprobarlo.

De momento, veamos los resultados de la prueba en el siguiente entorno:

  • Intel Xeon E5-2687W v3 a 3,10 Ghz, 20 núcleos, 32 Gb DDR4 2100
  • MQL4 en MetaTrader 4 build 794
  • MQL5 en MetaTrader 5 build 1111 x64, modo normal
  • MQL5 en MetaTrader 5 build 1111 x64, nuevo compilador, modo Optimize=1
  • C++ con Visual Studio 2012 Update 4, código x64, máxima optimización
  • Tiempo en milisegundos, cuanto menos mejor

PruebaMT4 794MT5 1111 x64
MT5 1111 NuevoC++ x64Comentario de
TestAckermann 3718 3109 0 0 Perfecto, los dos compiladores fueron capaces de optimizar los cálculos de compilación desechando todo el código
TestArrays 15063 2531 203 31 Todavía hay margen de mejora
TestBubbleSort 10609 2484 656 860 Sorprendentemente, MQL5 se ha adelantado en la clasificación de la burbuja
TestCall 922 891 0 0 Perfecto, los dos compiladores fueron capaces de optimizar los cálculos de compilación desechando todo el código
TestFibo 2547 1187 0 0 Perfecto, los dos compiladores fueron capaces de optimizar los cálculos de compilación desechando todo el código
TestMatrix 15375 4359 422 281 Todavía hay margen de mejora
TestMoments 5719 4323 4078 0 Tal vez, al incluir más métodos de optimización, podremos destrozar el código como MSVC
TestNestedLoop 6219 6141 0 0 Perfecto, los dos compiladores fueron capaces de optimizar los cálculos de compilación desechando todo el código
TestPiCalculado 5047 3500 1875 1859 Nariz con nariz con MSVC
TestRandom 2375 1828 468 438 Casi tan bueno como MSVC
TestSieve 13578 4031 875 515 Cerrar
TestString 187 218 422 266 Optimizar y superar el MSVC, esto es un fracaso temporal debido a la insuficiente optimización
TestStrPrep 3938 3328 1703 1875 Más rápido que MSVC
TestStrRev 4000 3141 2719 438 Tenemos que resolverlo.
TestStrSum 5344 2812 2844 0 Posiblemente, añadiendo más métodos de optimización, podremos eliminar el código como en MSVC


Para ver el gráfico detallado, haga clic en él.


Cuáles son las conclusiones:

  1. MQL4 está perdiendo seriamente frente a MQL5, incluso basándose en un compilador

    MQL5 es más rápido que MQL4 desde decenas de porcentajes hasta varias veces. La razón está en el entorno de ejecución y en los 32 bits. MetaTrader 5 tiene un tiempo de ejecución mucho más eficiente y en constante desarrollo.

  2. El nuevo compilador MQL5 de 64 bits es de 2 a 10 veces más rápido que el actual MQL5

    El desarrollo del nuevo compilador llevó mucho tiempo, pero los beneficios fueron sorprendentes. Hay algunos problemas con la optimización de las operaciones de cadena, pero intentaremos acelerarlas también.

  3. El nuevo compilador está muy cerca de la calidad y la velocidad del compilador de Visual Studio 2012 x64.

    Aún no hemos activado todos los métodos de optimización, ya que todavía los estamos probando. Por tanto, los resultados seguirán mejorando.


¿Qué aporta a los comerciantes?

La posibilidad de hacer más cálculos en el mismo tiempo y menos pensar en cambiar a una DLL. Esto es especialmente importante para los que se dedican a las matemáticas pesadas.

 

¡Bien hecho!

 

Profesionales en su campo.

Gracias.

 

Además, es muy probable que la próxima versión del 20 de mayo cuente con un depurador de datos históricos.

Lo mostraremos en la iFX Expo del 26 al 28 de mayo.

iFX EXPO International 2015
  • iFX EXPO
  • www.ifxexpo.com
Booth 01 Get the world’s fastest HTML5 chart for mobile & desktop, and the highest user-rated mobile apps - with or without trading. Founded in 1998, NetDania pioneered streaming price technology, and have since delivered solutions to global Tier-1 banks, brokers, currency managers, and analysts. With a strong position within corporate FX and...
 

Renat Fatkhullin:

  1. El nuevo compilador MQL5 de 64 bits es de 2 a 10 veces más rápido que el actual compilador MQL5.

    El desarrollo del nuevo compilador ha llevado mucho tiempo, pero los logros han sido sorprendentes. Hay algunos problemas de optimización de las operaciones de cadena, pero intentaremos acelerarlas también.

  2. El nuevo compilador está muy cerca de la calidad y la velocidad del compilador de Visual Studio 2012 x64.

    Aún no hemos activado todos los métodos de optimización, ya que todavía los estamos probando. Por lo tanto, los resultados seguirán mejorando.


Además, lo más probable es que en la próxima versión esté disponible un depurador de datos históricos para el 20 de mayo.

Lo demostraremos en la iFX Expo del 26 al 28 de mayo.

Muy buena noticia, ¡gracias!
 
Gracias, le deseo más éxito.
 
Renat Fatkhullin:

El nuevo compilador se acerca mucho a la calidad y velocidad del compilador de Visual Studio 2012 x64

Aún no hemos activado todos los métodos de optimización, ya que todavía los estamos probando. Por ello, los resultados seguirán mejorando.

¡Buenas noticias! ¡Bien hecho!

Renat Fatkhullin:

Puede realizar más cálculos al mismo tiempo y pensar menos en cambiar a DLL. Esto es especialmente importante para los que hacen muchas matemáticas.


Sí, realmente no se me ocurren más tareas en las que se necesiten DLLs externas.


Renat Fatkhullin:

Además, la próxima versión del 20 de mayo probablemente tendrá un depurador de datos históricos.

Esta es realmente la característica más útil. Muchas gracias.

Personalmente sólo tengo una duda: los punteros a arrays. Para los arrays privados el problema se resuelve envolviendo un array en una clase.

Pero para los arrays pasados a la función OnCalculate() tengo que copiar los datos en búferes internos cada vez, y sólo entonces pasar punteros a los objetos analizadores y manejadores. Una vez he intentado pasar punteros usando memcpy, pero de alguna manera la velocidad era casi la misma, y en mi opinión, tales "trucos" no deben ser aplicados.

Tal vez la posibilidad de utilizar el tipo de referencia sería más aceptable. En general, la tarea es acceder a los elementos de la matriz sin copiarlos.

 
George Merts:

Sí, la verdad es que no se me ocurren más tareas en las que se necesiten DLL externas.

Por ejemplo, las comunicaciones entre terminales.
 
He intentado compilar uno de mis robots con optimización.
Resultó que la asignación del parámetro de entrada de desviación al campo de desviación de la instancia de la estructura MqlTradeRequest conduce a un error de generación de código.
Ejemplo hipotético (se ha eliminado todo lo demás):
sinput ulong deviation = 100;
int OnInit()
  {
        MqlTradeRequest request =
        {
                0
        };
        request.deviation = deviation;
//---
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
Me sale"error de generación de código 1 1".

Si sólo asignas "100":

int OnInit()
  {
        MqlTradeRequest request =
        {
                0
        };
        request.deviation = 100;
//---
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }

...entonces la compilación se realizará sin errores. Nota, tengo AMD Athlon II X4 645, procesador de 3,1 GHz. Tal vez sea importante (esta misma semana MQL4 con servicedesk han cogido algún bug en AMD).

Mi compilador no se queja de nada más.

 
Gracias por informar del error - lo arreglaremos.