¿Qué novedades tiene MetaTrader 5?

Historial de actualizaciones de las plataformas desktop, móvil y web

16 diciembre 2022
MetaTrader 5 build 3550: mejoras y correcciones

Terminal

  1. Terminal: Actualizadas las traducciones de la interfaz de usuario.
  2. Correcciones de crash logs.

Web Terminal

9 diciembre 2022
MetaTrader 5 build 3540: Autenticación 2FA/TOTP y Observación de Mercado mejorada en el terminal web

WebTerminal

  1. Añadido soporte para la autenticación 2FA/TOTP usando Google Authenticator y aplicaciones similares.

    El uso de la autenticación de dos factores le permitirá proteger aún más su cuenta comercial contra el acceso no autorizado, incluso si su nombre de usuario y su contraseña permanente se filtran. Existen muchas aplicaciones móviles que permiten la autenticación en dos pasos utilizando el algoritmo Time-based One-time Password Algorithm (TOTP). Entre los más populares, están Google Authenticator, Microsoft Authenticator, LastPass Authenticator y Authy. En el terminal de cliente de MetaTrader 5, ahora es posible autenticarse usando contraseñas de un solo uso obtenidas de dichas aplicaciones Authenticator.

    Para habilitar la autenticación en dos pasos, primero deberá iniciar sesión en el terminal de cliente de MetaTrader 5 de la forma habitual. Luego clique en su cuenta en el menú y seleccione "Habilitar 2FA/TOTP" en la ventana de diálogo que se abrirá. Inicie el Authenticator en su teléfono móvil, pulse el botón "+" en él para añadir su cuenta comercial y escanee el código QR del terminal. Introduzca el código obtenido en el campo "One-time password" y clique en "Enable 2FA": el secreto de su cuenta se añadirá al servidor comercial del bróker.


    Añadido el soporte para la autenticación 2FA/TOTP usando Google Authenticator y aplicaciones similares


    El secreto guardado se usará ahora en la aplicación Authenticator para generar una contraseña OTP para cada conexión posterior. Cada contraseña será válida durante 30 segundos, luego se generará una nueva.


    Para conectarse a su cuenta comercial, ahora necesitará una contraseña OTP adicional de la aplicación Authenticator


    En la ventana de diálogo, junto con el código QR de vinculación al generador, también se mostrará un código de respaldo: guárdelo en un lugar seguro. Si pierde la posibilidad de acceder a su dispositivo vinculado, el código le permitirá añadir nuevamente su cuenta a la aplicación Authenticator.

    Si decide eliminar de la aplicación Authenticator el secreto almacenado, primero desactive el uso de la autenticación 2FA/TOTP utilizando el comando del menú contextual de la cuenta correspondiente. Si la autenticación 2FA/TOTP no está disponible en su cuenta, pida a su bróker que la active.

  2. Ampliada la cantidad de información mostrada en Market Watch. Ahora, además de los precios Bid/Ask actuales y el porcentaje de cambio del precio, podrá ver:

    • El precio Bid/Ask máximo y mínimo para la sesión comercial actual
    • Los precios de apertura de la sesión comercial actual y los precios de cierre de la sesión comercial anterior

    Para configurar la información mostrada, utilice el menú contextual:


    Información adicional en la Observación de Mercado


  3. Añadida la visualización de la notificación sobre riesgos cuando la configuración correspondiente está habilitada en el lado del bróker. Algunos reguladores requieren que el tráder lea y acepte el aviso antes de comenzar a comerciar.
  4. Corregida la visualización de la barra de herramientas superior en los modelos de iPhone con una muesca en la parte superior de la pantalla. En algunos casos, esta podía cubrir los botones del panel.
  5. Corregida la visualización de los indicadores financieros finales de la cuenta (beneficio, equidad, etc.) en el navegador Google Chrome. En algunos casos, los valores podían no actualizarse.

Terminal

  1. Optimizada y acelerada significativamente la apertura de la ventana de diálogo para crear cuentas demo.
  2. Actualizadas las traducciones de la interfaz de usuario.
  3. Correcciones de crash logs.

MQL5

  1. En la clase COpenCL de la Biblioteca Estándar se han añadido nuevos métodos:

    • BufferFromMatrix — rellenar el búfer del dispositivo con los datos de la matriz
    • BufferToMatrix — leer los datos del búfer del dispositivo en una matriz
    • ContextCreate — crear un contexto de dispositivo (primera parte del método Initialize)
    • ProgramCreate — crear un programa basado en el código fuente de OpenCL (segunda parte del método Initialize)
    • ContextClean — liberar todos los datos pertenecientes al contexto del dispositivo (similar al método Shutdown, pero sin eliminar el contexto)
    • GetDeviceInfoInteger — obtener una propiedad entera del dispositivo
    • GetKernelInfoInteger — obtener una propiedad entera del kernel
    • GetDeviceInfo — obtener cualquier propiedad entera única del dispositivo que no se encuentre en la enumeración ENUM_OPENCL_PROPERTY_INTEGER

    Ejemplo de uso de GetDeviceInfo:
    long preferred_workgroup_size_multiple=OpenCL.GetDeviceInfo(0x1067);
  2. Añadidos los valores TERMINAL_CPU_NAME y TERMINAL_OS_VERSION a la enumeración ENUM_TERMINAL_INFO_STRING. Estos valores permiten obtener el nombre del procesador y el sistema operativo del usuario.
    void OnStart()
      {
       string cpu,os;
    //---
       cpu=TerminalInfoString(TERMINAL_CPU_NAME);
       os=TerminalInfoString(TERMINAL_OS_VERSION);
       PrintFormat("CPU: %s, OS: %s",cpu,os);
      }
    
    Resultado:
    UPC: Intel Xeon  E5-2630 v4 @ 2.20GHz, OS: Windows 10 build 19045
  3. Corregido el parámetro "table_or_sql" en las funciones DatabasePrint y DatabaseExport. Ahora podrá transmitir el nombre del recuadro en él, no solo una solicitud SQL.
MetaEditor
  1. Corregida la verificación del número máximo de columnas a mostrar en la base de datos. Ahora se podrán mostrar hasta 64 columnas.
  2. Corregido el funcionamiento de los puntos de interrupción en las construcciones cortas del tipo IF[ if(cond) break; ].
25 noviembre 2022
MetaTrader 5 build 3520: añadida la autenticación 2FA/TOTP con Google Authenticator

Terminal

  1. Añadido soporte para la autenticación 2FA/TOTP usando Google Authenticator y aplicaciones similares.

    El uso de la autenticación de dos factores le permitirá proteger aún más su cuenta comercial contra el acceso no autorizado, incluso si su nombre de usuario y su contraseña permanente se filtran. Existen muchas aplicaciones móviles que permiten la autenticación en dos pasos utilizando el algoritmo Time-based One-time Password Algorithm (TOTP). Entre los más populares, están Google Authenticator, Microsoft Authenticator, LastPass Authenticator y Authy. En el terminal de cliente de MetaTrader 5, ahora es posible autenticarse usando contraseñas de un solo uso obtenidas de dichas aplicaciones Authenticator.

    Para activar la autenticación en dos pasos, primero deberá iniciar sesión en el terminal de cliente de MetaTrader 5 de la forma habitual. A continuación, clique con el botón derecho del ratón en la cuenta comercial para que aparezca el menú y seleccione "Permitir 2FA/TOTP". Inicie el Authenticator en su teléfono móvil, pulse el botón "+" en él para añadir su cuenta comercial y escanee el código QR del terminal. Introduzca el código obtenido en el campo "One-time password" y clique en "Enable 2FA": el secreto de su cuenta se añadirá al servidor comercial del bróker.


    Añadido el soporte para la autenticación 2FA/TOTP usando Google Authenticator y aplicaciones similares.

    El secreto guardado se usará ahora en la aplicación Authenticator para generar una contraseña OTP para cada conexión posterior. Cada contraseña será válida durante 30 segundos, luego se generará una nueva.



    Para conectarse a su cuenta comercial, ahora necesitará una contraseña OTP adicional de la aplicación Authenticator

    Si decide eliminar el secreto almacenado de la aplicación Authenticator, primero desactive el uso de la autenticación 2FA/TOTP usando el comando del menú contextual de la cuenta correspondiente. Si la autenticación 2FA/TOTP no está disponible en su cuenta, pida a su bróker que active dicha opción.

MQL5

  1. Corregida la función CopyTicks para los instrumentos comerciales de usuario. En algunos casos, al trabajar con símbolos personalizados, se retornaban los ticks iniciales de la sesión comercial anterior en lugar de los datos solicitados.

  2. Añadidos nuevos valores a la enumeración para obtener información sobre el último error de OpenCL, lo cual permite obtener el código de error y la descripción de texto.
    1. Añadida a la enumeración ENUM_OPENCL_PROPERTY_INTEGER el valor CL_LAST_ERROR (código 4094) 

      Para obtener el último error de OpenCL a través de CLGetInfoInteger, el parámetro handle será ignorado, es decir, no tendrá ningún significado. Descripción del error: https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESS
      Al darse un código de error desconocido, se retornará la línea "unknown OpenCL error N", donde, en lugar de N, se dará el código de error.

      Ejemplo:
      //--- el primer parámetro handle se ignora al obtener el código del últimoo error
      int code = (int)CLGetInfoInteger(0,CL_LAST_ERROR);

    2. Añadida a la enumeración ENUM_OPENCL_PROPERTY_STRING el valor CL_ERROR_DESCRIPTION (4093).
      Podemos obtener una descripción de texto del error de OpenCL usando CLGetInfoString. Descripción del error: https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESS

      Al usar CL_ERROR_DESCRIPTION como parámetro handle, el código de error deberá transmitirse a CLGetInfoString . Si transmitimos CL_LAST_ERROR en lugar del código de error, la función retornará una descripción del último error.

      Ejemplo:
      //--- obtener código del último error de OpenCL
      int    code = (int)CLGetInfoInteger(0,CL_LAST_ERROR);
      string desc; // para obtener la descripción de texto del error
      
      //--- utilizamos el código de error para obtener la descripción de texto del error
      if(!CLGetInfoString(code,CL_ERROR_DESCRIPTION,desc))
         desc = "cannot get OpenCL error description, " + (string)GetLastError();
      Print(desc);
      
      
      //--- para obtener la descripción del último error de OpenCL sin obtención previa del código, deberemos transmitir CL_LAST_ERROR  
      if(!CLGetInfoString(CL_LAST_ERROR,CL_ERROR_DESCRIPTION, desc))
         desc = "cannot get OpenCL error description, " + (string)GetLastError();
      Print(desc);
      Por ahora, como descripción del error, se ofrece el nombre de la enumeración interna cuyo desciframiento puede verse en la página https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESS. Por ejemplo, si obtenemos CL_INVALID_KERNEL_ARGS, la descripción para ello será "Returned when enqueuing a kernel when some kernel arguments have not been set or are invalid".

  3. Corregido el método matrix::MatMul. Al trabajar con matrices grandes, el terminal se bloqueaba con algunos tamaños.

Correcciones de crash logs.
18 noviembre 2022
MetaTrader 5 build 3510: mejoras del terminal web

MetaTrader 5 WebTerminal

  1. En la versión móvil, hemos añadido a la sección de la historia de transacciones la clasificación de estas y el filtrado según la profundidad. Para configurar la visualización de la historia, utilice los comandos del panel superior:


    La versión móvil tiene ahora un ajuste de visualización para la historia de transacciones


    Las transacciones pueden clasificarse según parámetros básicos: fecha, ticket, símbolo, volumen, etc.

  2. Mejorado el acceso a la información de sus cuentas comerciales.

    • En la versión de escritorio, ahora podrá clicar en los datos de la cuenta actual en el menú hamburguesa. Al clicar en una cuenta, se accederá a la visualización de sus detalles.
    • En la versión móvil, se ha añadido la visualización de la cuenta corriente en «Settings». Al clicar en una cuenta, se accederá a la visualización de sus detalles.


    Mejorado el acceso a los datos de la cuenta comercial

  3. Corregida la visualización del tipo de cuenta en la ventana de gestión de cuentas.
  4. Corregida la visualización de la equidad y el margen libre después de actualizar la página del terminal web en los navegadores móviles.
  5. Corregida la visualización de la barra inferior en el navegador móvil Firefox.

Terminal

  1. Corregido un error en el cálculo de los gráficos de balance y equidad en el informe comercial.

MQL5

  1. El comportamiento de typename(expr) ha sido modificado. La función ahora proporciona el tipo completo con los modificadores y dimensiones (para arrays):
    class A
      {
      };
    
    void OnStart(void)
      {
       const A *const arr[][2][3]={};
       Print(typename(arr));
      }
    
    Resultado:
    "clase A const * const [][2][3]"

Correcciones de crash logs.
11 noviembre 2022
MetaTrader 5 build 3500: mejoras y correcciones

Terminal

  1. Añadido un comando para acceder al nuevo informe comercial en el menú contextual de las secciones "Trading" e "Historia":


    El informe comercial incluye:
    • Valores de crecimiento mensual en forma de gráfico y recuadro
    • Un gráfico del cambio de equidad
    • Un esquema de pétalos que le permitirá evaluar rápidamente el estado de la cuenta
    • Estadísticas de las transacciones por instrumentos
    • Multitud de indicadores adicionales para el análisis comercial

  2. Corregido el cálculo del depósito inicial en el informe comercial.
  3. Corregida la configuración de los niveles de "Stop Loss" y "Take Profit" al usar paneles de comercio rápido en el gráfico y en la "Observación de mercado". Los niveles podían heredarse erróneamente de posiciones abiertas con anterioridad, incluso si no fuera necesario (la funcionalidad está destinada a cuentas FIFO).
  4. Actualizadas las traducciones de la interfaz de usuario.

MQL5

  1. Solucionado un error del compilador que permitía acceder a un campo de estructura usando una cadena constante cuyo valor es el nombre del campo.
  2. Corregida la verificación del estado de la clave con la ayuda de TerminalInfoInteger(TERMINAL_KEYSTATE_*).

Correcciones de crash logs.

MetaTrader 5 WebTerminal build 3500

  1. Corregido el cierre de posiciones al recibir una recotización.
  2. Corregida la reconexión al servidor después de expandir una ventana del navegador que había estado inactiva durante mucho tiempo.
  3. Corregida la visualización de fondos de crédito en la cuenta.
  4. Multitud de mejoras y correcciones.
4 noviembre 2022
MetaTrader 5 build 3490: versión móvil del terminal web y nuevos métodos de matrices en MQL5

Versión móvil del terminal web

En la nueva versión del terminal web se ha añadido el soporte completo para dispositivos móviles. Ahora la interfaz se adapta automáticamente al tamaño de la pantalla, lo cual permite a los usuarios trabajar cómodamente en la plataforma tanto en teléfonos como tabletas con iOS y Android:


Además, hemos introducido en el terminal web numerosas correcciones y mejoras.

El nuevo terminal web MetaTrader 5 ofrece todas las funciones que necesita un tráder moderno. La aplicación le permitirá:

  • Trabajar con cuentas demo y reales
  • Recibir cotizaciones de cualquier instrumento financiero
  • Comerciar en cualquier mercado
  • Realizar el análisis técnico de las cotizaciones con más de 30 indicadores y 20 objetos gráficos
  • Analizar los datos del Calendario Económico

Terminal

  1. Ampliadas las funciones del gestor de tareas. Ahora permite monitorear de forma más precisa el consumo de recursos.

    • Añadida la visualización del tamaño de la pila para los hilos
    • Añadida la visualización del número de cambios de contexto
    • Añadido el reconocimiento de los hilos del sistema y los hilos de las DLL de terceros
    • Añadida la visualización del tiempo de ejecución en el modo kernel. Un aumento de este indicador comparado con el tiempo de ejecución en el modo usuario puede indicar problemas a nivel de sistema: problemas de drivers, errores de hardware, hardware lento. Encontrará más información en la documentación de Microsoft.
    • Añadida la visualización del tiempo de funcionamiento en el modo usuario.



  2. Añadida una pestaña OpenCL a la configuración del terminal para administrar los dispositivos disponibles. El nuevo administrador de OpenCL nos permitirá indicar explícitamente los dispositivos que se utilizarán para los cálculos.




  3. Agregada la adición de niveles de Stop Loss y Take Profit en la Profundidad de Mercado para las cuentas que operan en el modo FIFO (se puede activar en el lado del bróker).

    El modo FIFO implica que las posiciones de cada instrumento deberán cerrarse en el orden en que se han abierto. Para garantizar que el cierre de posiciones según los niveles stop siempre se corresponda con la regla FIFO, en el lado del terminal del cliente se implementa siguiente lógica :

    Si hay varias posiciones para el mismo instrumento, la colocación de niveles stop para cualquiera de ellas dará lugar a la colocación de niveles stop similares para todas las demás. En consecuencia, al activarse un nivel, todas las posiciones se cerrarán según el orden de la regla FIFO.

    Al abrir la Profundidad de Mercado para un instrumento del que ya existen posiciones, los campos Stop Loss y Take Profit se rellenarán ahora automáticamente con los niveles de las posiciones existentes (si han sido establecido).

  4. Corregida la eliminación de los niveles de Stop Loss y Take Profit con los botones "X" en el apartado «Herramientas/Trading». El error se producía cuando la función de comercio rápido estaba desactivada. Al pulsar el botón, se abrirá una ventana de diálogo comercial con un valor en blanco para el nivel correspondiente.

  5. Se han realizado cambios en el informe comercial, hemos corregido los rótulos fijos en los gráficos y el cálculo de la comisión final. Salvo en algunos casos, se mostraba un beneficio incorrecto en las estadísticas del informe, además de valores incorrectos en la información sobre las herramientas al pasar el cursor del ratón sobre los gráficos de equidad y balance.

MQL5

  1. Añadidos los métodos vectoriales y matriciales CopyTicks y CopyTicksRange. Estos permiten copiar fácilmente los arrays de datos de precio en vectores y matrices.
    bool matrix::CopyTicks(string symbol,uint flags,ulong from_msc,uint count);
    bool vector::CopyTicks(string symbol,uint flags,ulong from_msc,uint count);
    
    bool matrix::CopyTicksRange(string symbol,uint flags,ulong from_msc,ulong to_msc);
    bool matrix::CopyTicksRange(string symbol,uint flags,ulong from_msc,ulong to_msc);
    El tipo de datos a copiar se indica en el parámetro rates_mask con la ayuda de la enumeración ENUM_COPY_RATES. Están disponibles los valores siguientes:
    COPY_TICKS_INFO    = 1,       // ticks llamados por los cambios de Bid y/o Ask
    COPY_TICKS_TRADE   = 2,       // ticks llamados por los cambios de Last y Volume
    COPY_TICKS_ALL     = 3,       // todos los ticks en en los que hay cambios
    COPY_TICKS_TIME_MS = 1<<8,    // tiempo en milisegundos
    COPY_TICKS_BID     = 1<<9,    // precio Bid
    COPY_TICKS_ASK     = 1<<10,   // precio Ask
    COPY_TICKS_LAST    = 1<<11,   // precio Last
    COPY_TICKS_VOLUME  = 1<<12,   // volumen
    COPY_TICKS_FLAGS   = 1<<13,   // banderas de tick
    Al seleccionar varios tipos de datos (solo disponible para matrices), el orden de las filas de la matriz se corresponderá con el orden de los valores de la enumeración.

  2. Ampliados los métodos matrix::Assign y vector::Assign.

    Ahora se puede asignar a la matriz un array o vector unidimensional:
    bool matrix::Assign(const vector &vec);
    Obtendremos como resultado una matriz de una línea.

    Ahora también se puede asignar una matriz a un vector (se realizará el suavizado de la matriz):
    bool vector::Assign(const matrix &mat);
  3. Añadidos los métodos Swap para vectores y matrices.
    bool vector::Swap(vector &vec);
    bool vector::Swap(matrix &vec);
    bool vector::Swap(double &arr[]);
    bool matrix::Swap(vector &vec);
    bool matrix::Swap(matrix &vec);
    bool matrix::Swap(double &arr[]);
    Cada array, vector o matriz se refiere a un búfer de memoria que contiene elementos de ese objeto. El método Swap realmente intercambia los punteros a estos búferes sin escribir los elementos en la memoria. Así que una matriz sigue siendo una matriz, y un vector un vector. Al intercambiar una matriz y un vector se obtiene una matriz de una línea con elementos vectoriales y un vector con elementos matriciales en representación plana (puede consultar el método Flat).
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //---
      matrix a= {{1, 2, 3}, {4, 5, 6}};
      Print("a before Swap: \n", a);
      matrix b= {{5, 10, 15, 20}, {25, 30, 35, 40}, {45, 50, 55, 60}};
      Print("b before Swap: \n", b);  
    //--- intercambiamos de sitio los punteros por las matrices
      a.Swap(b);
      Print("a after Swap: \n", a);
      Print("b after Swap: \n", b);
      /*
      a before Swap:
      [[1,2,3]
      [4,5,6]]
      b before Swap:
      [[5,10,15,20]
      [25,30,35,40]
      [45,50,55,60]]
      
      a after Swap:
      [[5,10,15,20]
      [25,30,35,40]
      [45,50,55,60]]
      b after Swap:
      [[1,2,3]
      [4,5,6]]
      */
      vector v=vector::Full(10, 7);
      Print("v before Swap: \n", v);
      Print("b before Swap: \n", b);
      v.Swap(b);
      Print("v after Swap: \n", v);
      Print("b after Swap: \n", b);
      /*
      v before Swap:
      [7,7,7,7,7,7,7,7,7,7]
      b before Swap:
      [[1,2,3]
      [4,5,6]]
      
      v after Swap:
      [1,2,3,4,5,6]
      b after Swap:
      [[7,7,7,7,7,7,7,7,7,7]]
      */
     }
    El método Swap también permite trabajar con arrays dinámicos (no se puede transmitir un array de tamaño fijo como parámetro). En este caso, el array puede ser de cualquier dimensión, pero de un tamaño consistente. Esto significa que el tamaño total de la matriz o del vector deberá ser un múltiplo de la dimensionalidad cero de un array. La dimensionalidad cero de un array es el número de elementos que contiene el primer índice del array. Por ejemplo, para un array dinámico tridimensional double array[][2][3], la dimensionalidad cero será el producto de los tamaños de la segunda y tercera dimensión, es decir, 2x3=6. Por lo tanto, un array de este tipo solo podrá utilizarse en un método Swap con matrices y vectores cuyo tamaño total sea un múltiplo de 6: 6, 12, 18, 24, etc.

    Vamos a mostrar esto con un ejemplo:
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //--- rellenamos la matriz 1x10 con el valor 7.0
      matrix m= matrix::Full(1, 10, 7.0);
      Print("matrix before Swap:\n", m);
    //--- intentamos realizar el intercambio entre la matriz y el array
      double array_small[2][5]= {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}};
      Print("array_small before Swap:");
      ArrayPrint(array_small);
      if(m.Swap(array_small))
       {
        Print("array_small after Swap:");
        ArrayPrint(array_small);
        Print("matrix after Swap: \n", m);
       }
      else // el tamaño de la matriz no es múltiplo del tamaño de la primera dimensión del array
       {
        Print("m.Swap(array_small) failed. Error ", GetLastError());
       }
      /*
      matrix before Swap:
      [[7,7,7,7,7,7,7,7,7,7]]
      array_small before Swap:
               [,0]     [,1]     [,2]     [,3]     [,4]
      [0,]  1.00000  2.00000  3.00000  4.00000  5.00000
      [1,]  6.00000  7.00000  8.00000  9.00000 10.00000
      m.Swap(array_small) failed. Error 4006
      */
    //--- tomamos una matriz mayor e intentamos realizar el intercambio de nuevo
      double array_static[3][10]= {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
         {2, 4, 6, 8, 10, 12, 14, 16, 18, 20},
         {3, 6, 9, 12, 15, 18, 21, 24, 27, 30}
       };
      Print("array_static before Swap:");
      ArrayPrint(array_static);
      if(m.Swap(array_static))
       {
        Print("array_static after Swap:");
        ArrayPrint(array_static);
        Print("matrix after Swap: \n", m);
       }
      else // no se puede utilizar un array dinámico para el intercambio con una matriz
       {
        Print("m.Swap(array_static) failed. Error ", GetLastError());
       }
      /*
      array_static before Swap:
             [,0]     [,1]     [,2]     [,3]     [,4]     [,5]     [,6]     [,7]     [,8]     [,9]
      [0,]  1.00000  2.00000  3.00000  4.00000  5.00000  6.00000  7.00000  8.00000  9.00000 10.00000
      [1,]  2.00000  4.00000  6.00000  8.00000 10.00000 12.00000 14.00000 16.00000 18.00000 20.00000
      [2,]  3.00000  6.00000  9.00000 12.00000 15.00000 18.00000 21.00000 24.00000 27.00000 30.00000
      m.Swap(array_static) failed. Error 4006
      */
    //--- un nuevo intento de de intercambiar el array y la matriz
      double array_dynamic[][10];    // array dinámico
      ArrayResize(array_dynamic, 3); // indicamos el tamaño de la primera dimensión
      ArrayCopy(array_dynamic, array_static);
    //--- ahora utilizaremos un array dinámico para el intercambio
      if(m.Swap(array_dynamic))
       {
        Print("array_dynamic after Swap:");
        ArrayPrint(array_dynamic);
        Print("matrix after Swap: \n", m);
       }
      else //  no hay error
       {
        Print("m.Swap(array_dynamic) failed. Error ", GetLastError());
       }
      /*
      array_dynamic after Swap:
            [,0]    [,1]    [,2]    [,3]    [,4]    [,5]    [,6]    [,7]    [,8]    [,9]
      [0,] 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000
      matrix after Swap:
      [[1,2,3,4,5,6,7,8,9,10,2,4,6,8,10,12,14,16,18,20,3,6,9,12,15,18,21,24,27,30]]
      */
     }
  4. Añadidos los métodos LossGradient para vectores y matrices. Este método calcula un vector o matriz de derivadas parciales de la función de pérdida con respecto a los valores predichos. En álgebra lineal, dicho vector se denomina gradiente y se usa en el aprendizaje automático.
    vector vector::LossGradient(const vector &expected,ENUM_LOSS_FUNCTION loss) const;
    matrix matrix::LossGradient(const matrix &expected,ENUM_LOSS_FUNCTION loss) const;
  5. Habilitado el uso de FOREIGN KEYS en SQLite, lo cual nos permitirá crear relaciones entre tablas en solicitudes SQL.   Ejemplo:
    CREATE TABLE artist(
      artistid    INTEGER PRIMARY KEY, 
      artistname  TEXT
    );
    
    CREATE TABLE track(
      trackid     INTEGER, 
      trackname   TEXT, 
      trackartist INTEGER,
      FOREIGN KEY(trackartist) REFERENCES artist(artistid)
    );

  6. Corregida la selección del método de clase requerido dependiendo de la consistencia del método y el objeto.

MetaEditor

  1. Aumentada la longitud de comentario admitida para las confirmaciones en el repositorio MQL5 Storage.  Los comentarios detallados al enviar cambios al repositorio se consideran de buenos modales al trabajar en grandes proyectos, pero la longitud de tales mensajes antes estaba limitada a 128 caracteres. El límite ahora se ha establecido en 260 caracteres.

MetaTester

  1. Aumentada la sensibilidad en el interruptor de velocidad de simulación en el modo visual.
Correcciones de crash logs.


17 septiembre 2022
MetaTrader 5 build 3440: Nuevo informe sobre la cuenta comercial

Terminal

  1. Añadido un nuevo informe sobre el historial de operaciones de la cuenta. En cuanto a su conjunto de parámetros y presentación de la información, es semejante a los informes ya conocidos sobre las Señales. En la propia plataforma, ahora tendrá también a su disposición:
    • Los valores de crecimiento mensual en forma de gráfico y recuadro
    • Un gráfico del cambio de equidad
    • Un gráfico de radar que le permitirá evaluar rápidamente el estado de su cuenta
    • Estadísticas de las transacciones por instrumentos
    • Muchos indicadores adicionales para el análisis comercial

    Ahora, el informe podrá verse directamente en la plataforma, sin que haya que exportarlo primero a un archivo. Para abrirlo, clique en "Informes" en el menú "Ver".



  2. Corregido el rellenado del tablero de opciones cuando el número o el tipo de instrumento en los contratos Call y Put no coinciden.
  3. Corregida la selección incorrecta de la posición en la ventana de diálogo comercial al cerrar una posición con otra opuesta. El error se producía al clasificar las órdenes opuestas disponibles según cualquier columna que no fuera el ticket.
  4. Acelerada la muestra de entradas en el diario de registro de la plataforma.
  5. Corregida la representación de los comentarios en los gráficos de los símbolos de usuario.

MQL5

  1. Corregida la operación de la función CArrayList::LastIndexOf. Antes, siempre retornaba -1 en lugar del índice del último elemento encontrado.
  2. Añadido el método de vectores y matrices Assign. Este permite sustituir el contenido de una matriz/vector por los datos de la matriz/vector o array transmitidos.
    bool vector<TDst>::Assign(const vector<TSrc> &assign);
    bool matrix<TDst>::Assign(const matrix<TSrc> &assign);
    
    Ejemplo:
      //--- copying matrices
      matrix b={};
      matrix a=b;
      a.Assign(b);
      
      //--- copying an array to a matrix
      double arr[5][5]={{1,2},{3,4},{5,6}};
      Print("array arr");
      ArrayPrint(arr);
      b.Assign(arr);
      Print("matrix b \n",b);
    /*
    array arr
            [,0]    [,1]    [,2]    [,3]    [,4]
    [0,] 1.00000 2.00000 0.00000 0.00000 0.00000
    [1,] 3.00000 4.00000 0.00000 0.00000 0.00000
    [2,] 5.00000 6.00000 0.00000 0.00000 0.00000
    [3,] 0.00000 0.00000 0.00000 0.00000 0.00000
    [4,] 0.00000 0.00000 0.00000 0.00000 0.00000
    matrix b 
    [[1,2,0,0,0]
     [3,4,0,0,0]
     [5,6,0,0,0]
     [0,0,0,0,0]
     [0,0,0,0,0]]
    
    */

  3. Añadido el método de vectores y matrices CopyRates. Permite copiar fácilmente los arrays de datos de precios en vectores y matrices.
    bool matrix::CopyRates(string symbol,ENUM_TIMEFRAMES period,ulong rates_mask,ulong from,ulong count);
    bool vector::CopyRates(string symbol,ENUM_TIMEFRAMES period,ulong rates_mask,ulong from,ulong count);
    El tipo de datos a copiar se indica en el parámetro rates_mask usando la enumeración ENUM_COPY_RATES. Están disponibles los siguientes valores:
    COPY_RATES_OPEN
    COPY_RATES_HIGH
    COPY_RATES_LOW
    COPY_RATES_CLOSE
    COPY_RATES_TIME
    COPY_RATES_VOLUME_TICK
    COPY_RATES_VOLUME_REAL
    COPY_RATES_SPREAD
    COPY_RATES_OHLC
    COPY_RATES_OHLCT
    Los dos últimos valores sirven para seleccionar a la vez y de forma sencilla varios parámetros básicos de la barra: precios Open, High, Low, Close y la hora.

    Si se seleccionan varios tipos de datos (algo solo disponible para las matrices), el orden de las filas de la matriz se corresponderá con el orden de los valores en la enumeración.

  4. Corregida la representación de los objetos "Marca de texto". Al utilizar las propiedades OBJPROP_XOFFSET y OBJPROP_YOFFSET, podía mostrarse un fragmento de imagen incorrecto en el gráfico.

  5. Corregido el error de cambio de un parámetro constante transmitido a una función como referencia a un puntero de objeto.

    Recordemos que el especificador const declara una variable como constante y no permite cambiar el valor de esa variable en la ejecución del programa. Solo permite la inicialización única de la variable al realizarse su declaración. Ejemplo de constantes en la función OnCalculate:

    int OnCalculate (const int rates_total,      // price[] array size
                     const int prev_calculated,  // bars processed on previous call
                     const int begin,            // meaningful data starts at
                     const double& price[]       // array for calculation
       );
    

    Sin embargo, en el ejemplo siguiente, se encontró un error del compilador que permitía la conversión implícita de punteros para los parámetros de referencia:

    class A {};
    const A *a = new A;
    
    void foo( const A*& b )
      {
       b = a;
      }
    
    void OnStart()
      {
            A *b; 
            foo(b);  // no permitido
            Print( a,":",b );
      }
    Esta operación no válida será ahora detectada por el compilador y generará un error.

MetaEditor

  1. Corregida la representación de referencias a números complejos en el depurador.
  2. Mejorado el funcionamiento del MQL5 Cloud Protector. Antes, en raras ocasiones, la protección de archivos podía finalizar con un error.
  3. Correcciones de crash logs.


Nuevo terminal web de MetaTrader 5

Le presentamos el nuevo terminal web para MetaTrader 5. Lo hemos hecho más moderno y rápido, no solo actualizando su aspecto, sino también reescribiendo completamente el núcleo. En cuanto a su interfaz, el terminal web ahora se parece a la ya conocida versión de la plataforma para iPad:




En comparación con la versión anterior, tiene multitud de características nuevas:

  • Posibilidad de solicitar cuentas reales rellenando un formulario de registro detallado y proporcionando documentos de confirmación
  • Soporte de suscripción de datos de precios y posibilidad de recibir cotizaciones en diferido
  • Más objetos de análisis, con una gestión más cómoda
  • Visualización de las entradas y salidas del mercado en el gráfico
  • Representación en el gráfico de los eventos del calendario económico
  • Cómodo ajuste de instrumentos en la Observación de Mercado, visualización de los movimientos de precio diarios
  • La interfaz se ha simplificado considerablemente: hemos eliminado el menú contextual del gráfico y el menú superior; todos los comandos para la gestión del gráfico y la superposición de objetos e indicadores han sido colocados en los paneles izquierdo y superior; los comandos restantes se han colocado en un único menú-hamburguesa
  • Tema nocturno de la interfaz

Pruebe ahora el nuevo terminal web en www.mql5.com. Sus brókeres lo tendrán pronto a su disposición.

4 agosto 2022
MetaTrader 5 build 3390: Float en OpenCL y funciones matemáticas, métodos de activación y pérdida para el aprendizaje automático

Terminal

  1. Añadida la apertura automática del tutorial la primera vez que se conecte a su cuenta comercial. Esto permitirá a los principiantes aprender los fundamentos del comercio más rápidamente y familiarizarse con las características de la plataforma directamente en el terminal. El tutorial está dividido en varias secciones, cada una con una breve información. El progreso de la rúbrica se mostrará con una línea azul.

    Añadida la apertura automática del tutorial la primera vez que se conecte a su cuenta comercial.

  2. Corregido el error de las operaciones grupales "Cerrar posiciones con beneficios/pérdidas". Antes, la plataforma usaba las posiciones opuestas para cerrar las posiciones correspondientes, si las había. Por ejemplo, si teníamos dos posiciones de compra con pérdidas en EURUSD y una posición de venta con beneficios en EURUSD, al realizar el cierre masivo de las posiciones con pérdidas, las tres posiciones existentes se cerrarían. Las posiciones Buy y Sell se cerrarían con una operación Close by, mientras que la posición Buy restante se cerraría con una operación de cierre normal. Los comandos ahora funcionan según lo previsto, cerrando solo las posiciones seleccionadas, sean o no rentables.

  3. Corregida la visualización de la historia de precios para los precios negativos en los gráficos del periodo D1. Los gráficos de precios negativos se muestran ahora correctamente en todos los marcos temporales.
  4. Optimizado y significativamente reducido el consumo de recursos del sistema por parte del terminal.
  5. Actualizada la base de datos fundamentales de los instrumentos comerciales. El número de agregadores disponibles para ver un instrumento bursátil se ha ampliado a 15, lo cual le permitirá encontrar información sobre el mayor número posible de tickers en los agregadores económicos más populares.

    Actualizada la base de datos fundamentales de los instrumentos comerciales

    En todo el mundo cotizan al menos 7.000 acciones líquidas y más de 2.000 ETF. Además, hay muchos futuros y otros derivados. La plataforma MetaTrader 5 contiene una enorme base de datos de instrumentos bursátiles y le permite ir directamente desde la Observación de Mercado a la página web del agregador en un solo clic para obtener datos fundamentales. Para la comodidad de los inversores, ofrecemos una variedad de fuentes de información a elegir para cada valor.

  6. Corregido el ajuste de los niveles de Stop Loss y Take Profit en la nueva ventana de colocación de nuevas órdenes. En el caso de las cuentas FIFO, los niveles de stop se fijarán ahora de manera automática según los niveles de stop de las posiciones ya abiertas para el mismo instrumento. Esto será necesario para cumplir con la regla FIFO.

MQL5

  1. Las funciones matemáticas ahora pueden trabajar con matrices y vectores.

    Seguimos ampliando las capacidades de la plataforma MetaTrader 5 para el trading algorítmico y el aprendizaje automático. Antes, añadimos un nuevo tipo de datos, matrices y vectores, que nos permite eliminar el uso de arrays para el procesamiento de datos. Para manejarlos, hemos añadido al lenguaje MQL5 más de 70 métodos que nos permiten realizar cálculos de álgebra lineal y estadística como una sola operación. La multiplicación, la conversión y la resolución de un sistema de ecuaciones se realizan ahora de forma sencilla y sin programación innecesaria. La incorporación de nuevos tipos no ha dejado intactas las funciones matemáticas.

    Las funciones matemáticas se diseñaron originalmente para realizar operaciones matemáticas con cantidades escalares. Ahora la mayoría de estas funciones pueden utilizarse con los nuevos tipos de datos (matrices y vectores) MathAbs, MathArccos, MathArcsin, MathArctan, MathCeil, MathCos, MathExp, MathFloor, MathLog, MathLog10, MathMod, MathPow, MathRound, MathSin, MathSqrt, MathTan, MathExpm1, MathLog1p, MathArccosh, MathArcsinh, MathCosh, MathSinh, MathTanh. En este caso, la matriz o el vector se procesarán término a término. Ejemplo:
    //---
      matrix a= {{1, 4}, {9, 16}};
      Print("matrix a=\n",a);
    
      a=MathSqrt(a);
      Print("MatrSqrt(a)=\n",a);
      /*
       matrix a=
       [[1,4]
        [9,16]]
       MatrSqrt(a)=
       [[1,2]
        [3,4]]
      */
    En el caso de MathMod y MathPow, el segundo parámetro podrá ser un escalar, o una matriz o vector del tamaño correspondiente.

    Vamos a mostrar con un ejemplo cómo calcular la desviación estándar usando las funciones matemáticas sobre un vector.
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //--- используем инициализирующую функцию для заполнения вектора
      vector r(10, ArrayRandom); // массив случайных чисел от 0 до 1
    //--- вычислим среднее значение
      double avr=r.Mean();       // среднее значение массива
      vector d=r-avr;            // вычислим массив отклонений от среднего значения
      Print("avr(r)=", avr);
      Print("r=", r);
      Print("d=", d);
      vector s2=MathPow(d, 2);   // массив квадратов отклонений
      double sum=s2.Sum();       // сумма квадратов отклонений
    //--- вычислим стандартное отклонение 2-мя способами
      double std=MathSqrt(sum/r.Size());
      Print(" std(r)=", std);
      Print("r.Std()=", r.Std());    
     }
    /*
      avr(r)=0.5300302133243813
      r=[0.8346201971495713,0.8031556138798182,0.6696676534318063,0.05386516922513505,0.5491195410016175,0.8224433118686484,...
      d=[0.30458998382519,0.2731254005554369,0.1396374401074251,-0.4761650440992462,0.01908932767723626,0.2924130985442671, ...
       std(r)=0.2838269732183663
      r.Std()=0.2838269732183663
    */ 
    //+------------------------------------------------------------------+
    //| Заполняет вектор случайными значениями                           |
    //+------------------------------------------------------------------+
    void ArrayRandom(vector& v)
     {
      for(ulong i=0; i<v.Size(); i++)
        v[i]=double(MathRand())/32767.;
     }
    

  2. Las funciones de plantilla pueden ahora utilizar las entradas matrix<double>, matrix<float>, vector<double>, vector<float> en lugar de los tipos de matriz correspondientes, matrixf, vector, vectorf.
  3. Mejoradas las funciones matemáticas para trabajar con el tipo float. Debido a la nueva posibilidad de aplicar funciones matemáticas a matrices y vectores de tipo float, también se han mejorado las funciones correspondientes aplicadas a escalares del tipo float. Antes, los parámetros de estas funciones se convertían incondicionalmente al tipo double, se llamaba a la implementación correspondiente de la función matemática y luego el resultado se convertía en float. Ahora, en el caso del tipo float, los parámetros y los resultados no se convierten, ya que se llaman las implementaciones de las funciones matemáticas correspondientes al tipo float.

    Diferencia en los cálculos usando como ejemplo el seno matemático:

    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //---  массив случайных чисел от 0 до 1
      vector d(10, ArrayRandom);
      for(ulong i=0; i<d.Size(); i++)
       {
        double delta=MathSin(d[i])-MathSin((float)d[i]);
        Print(i,". delta=",delta);
       }
     }
    /*
       0. delta=5.198186103783087e-09
       1. delta=8.927621308885136e-09
       2. delta=2.131878673594656e-09
       3. delta=1.0228555918923021e-09
       4. delta=2.0585739779477308e-09
       5. delta=-4.199390279957527e-09
       6. delta=-1.3221741035351897e-08
       7. delta=-1.742922250969059e-09
       8. delta=-8.770715820283215e-10
       9. delta=-1.2543186267421902e-08
    */
    //+------------------------------------------------------------------+
    //| Заполняет вектор случайными значениями                           |
    //+------------------------------------------------------------------+
    void ArrayRandom(vector& v)
     {
      for(ulong i=0; i<v.Size(); i++)
        v[i]=double(MathRand())/32767.;
     }

  4. Añadidos los métodos de matrices y vectores Activation (función de activación) y Derivative (derivada de la función de activación) con los parámetros:
    AF_ELU               Exponential Linear Unit
    AF_EXP               Exponential
    AF_GELU              Gaussian Error Linear Unit
    AF_HARD_SIGMOID      Hard Sigmoid
    AF_LINEAR            Linear
    AF_LRELU             Leaky REctified Linear Unit
    AF_RELU              REctified Linear Unit
    AF_SELU              Scaled Exponential Linear Unit
    AF_SIGMOID           Sigmoid
    AF_SOFTMAX           Softmax
    AF_SOFTPLUS          Softplus
    AF_SOFTSIGN          Softsign
    AF_SWISH             Swish
    AF_TANH              Hyperbolic Tangent
    AF_TRELU             Thresholded REctified Linear Unit
    La función de activación en una red neuronal determina cómo la suma ponderada de la señal de entrada se transforma en la señal de salida de un nodo o varios nodos a nivel de red. La elección de la función de activación ejerce una gran influencia en las capacidades y el rendimiento de la red neuronal. Las diferentes partes del modelo pueden usar funciones de activación distintas. En MQL5 no solo se implementan todas las funciones de activación conocidas, sino también las derivadas de la función de activación. Las funciones derivadas son necesarias a la hora de calcular rápidamente una corrección basada en el error resultante durante el entrenamiento de una red neuronal.
  5. Añadido el método de matrices y vectores Loss (función de pérdida) con los siguientes parámetros:
    LOSS_MSE            Mean Squared Error
    LOSS_MAE            Mean Absolute Error
    LOSS_CCE            Categorical Crossentropy
    LOSS_BCE            Binary Crossentropy
    LOSS_MAPE           Absolute Percentage Error
    LOSS_MSLE           Mean Squared Logarithmic Error
    LOSS_KLD            Kullback-Leibler Divergence
    LOSS_COSINE         Cosine similarity/proximity
    LOSS_POISSON        Poisson
    LOSS_HINGE          Hinge
    LOSS_SQ_HINGE       Squared Hinge
    LOSS_CAT_HINGE      Categorical Hinge
    LOSS_LOG_COSH       Logarithm of the Hyperbolic Cosine
    LOSS_HUBER          Huber

    La función de pérdida se encarga de valorar lo bien que el modelo predice el valor real. La construcción del modelo se reduce a resolver el problema de la minimización del valor de esta función en cada etapa. Dependiendo del tipo de datos, se requerirán enfoques distintos, es decir, funciones diferentes. La función de pérdida también puede depender de las variables de los pesos y el desplazamiento. La función de pérdida es unidimensional y no supone un vector, ya que evalúa el rendimiento global de la red neuronal.

  6. Añadidos los métodos de matrices y vectores matrix::CompareByDigits y vector::CompareByDigits. Estos comparan los elementos de dos matrices/vectores para que coincidan los dígitos significativos.

  7. Añadido el soporte para las funciones MathMin y MathMax para líneas. En este caso, las funciones utilizarán la comparación lexicográfica: las letras se compararán según el alfabeto y distinguiendo entre mayúsculas y minúsculas.

  8. Aumentado el número máximo de objetos OpenCL de 256 a 65536. Los manejadores de los objetos OpenCL en el programa MQL5 se crean mediante las funciones CLContextCreate, CLBufferCreate y CLProgramCreate. La anterior limitación de 256 manejadores no permitía usar métodos eficaces de aprendizaje automático.

  9. Permitido el uso de OpenCL en tarjetas sin soporte de double. Antes, los programas MQL5 ciertamente solo usaban GPUs con soporte de double, aunque muchas tareas permiten y están diseñadas para los cálculos con uso de float. El tipo float se considera originalmente nativo de la computación paralela porque ocupa menos espacio. Este requisito ha sido eliminado.

    Si el problema requiere usar solo GPUs que soporten double, esto podrá indicarse explícitamente al llamar a CLContextCreate utilizando el nuevo valor CL_USE_GPU_DOUBLE_ONLY (solo se permiten dispositivos con soporte de cálculos de tipo double).
       int cl_ctx;
    //--- инициализация OpenCL контекста
       if((cl_ctx=CLContextCreate(CL_USE_GPU_DOUBLE_ONLY))==INVALID_HANDLE)
         {
          Print("OpenCL not found");
          return;
         }

  10. Corregida la función CustomBookAdd. Antes, si se indicaba un valor nulo en el campo MqlBookInfo::volume_real, no se creaba una instantánea de la profundidad de mercado. La comprobación ahora se realiza de la siguiente forma:
    Se comprueba que los datos transmitidos sean correctos: para cada elemento hay que especificar el tipo, el precio y el volumen. MqlBookInfo.volume y MqlBookInfo.volume_real no deben ser cero o negativos: si ambos volúmenes son negativos, se considerará un error. Se puede especificar uno o ambos volúmenes; se tomará el indicado o el que sea positivo:

       volume=-1 && volume_real=2 — se utilizará volume_real=2,

       volume=3 && volume_real=0 — se utilizará volume=3.

    El volumen con la precisión MqlBookInfo.volume_real tiene mayor prioridad en comparación con MqlBookInfo.volume normal. Si se especifican ambos valores para un elemento de la profundidad de mercado, se usará volume_real.

    Si al menos un elemento de la profundidad de mercado se describe de forma incorrecta, el sistema descartará por completo el estado transmitido.

  11. Corregida la función CalendarValueLast. En algunos casos, se daba un error consistente en que las llamadas sucesivas a la función después de los cambios en el calendario económico (el parámetro de cambio recibía un nuevo valor después de la llamada) podían pasar por alto los eventos al usar el filtro según la divisa.
    CalendarValueLast(change, result, "", "EUR")
  12. Corregido el comportamiento de la función ArrayBSearch: si hay varios elementos idénticos, se retornará el enlace al primero por orden, en lugar de uno aleatorio, como antes.
  13. Corregida la visibilidad de la función de plantilla en la clase. El error consistía en que las funciones de plantilla de las clases declaradas como privadas/protegidas estaban en realidad disponibles públicamente (public).

MetaEditor

  1. Corregidos los errores y el comportamiento ambiguo de MetaAssist.
  2. Añadido el soporte para la macro %terminal%, que indica la ruta al directorio de datos de la plataforma donde se encuentra instalado este terminal. Por ejemplo, %terminal%\MQL5\Experts. 


    Añadido el soporte para la macro %terminal%, que indica la ruta al directorio de datos de la plataforma donde se encuentra instalado este terminal.

  3. Mejorada la visualización de arrays en el depurador.
  4. Aumentado el búfer para copiar valores del depurador.
  5. Mejoradas las indicaciones de error.
  6. Las rutas relativas se escriben ahora en el archivo *.mproj del proyecto. Antes, las rutas eran absolutas, lo cual provocaba errores de compilación al mover el proyecto.
  7. Añadida la incorporación automática de recursos BMP como matrices de mapas de bits de 32 bits disponibles globalmente cuando se incluyen en los proyectos. Esto elimina la necesidad de llamar a ResourceReadImage en el código para leer el recurso gráfico.
    'levels.bmp' as 'uint levels[18990]'
    
  8. Mejorada la lectura de los formatos extendidos de los archivos BMP.
  9. Actualizadas las traducciones de la interfaz de usuario.
  10. Correcciones de crash logs.


27 mayo 2022
MetaTrader 5 build 3320: Mejoras y correcciones

Terminal

  1. Ampliadas las pistas sobre los objetos comerciales mostrados en los gráficos.
    • Para las transacciones de salida del mercado se ha añadido la muestra del beneficio.
    • Para las transacciones realizadas como resultado de la activación de un Take Profit o un Stop Loss, se ha añadido la indicación correspondiente: TP/SL.

    Asimismo, se han añadido pistas similares a las líneas que conectan las transacciones de entrada y salida.

    Información extendida sobre herramientas para los objetos comerciales


  2. Acelerado el funcionamiento del sistema gráfico.
  3. Añadido el registro de operaciones grupales en las órdenes y posiciones abiertas. Al ejecutarse un comando de este tipo, se registrará un mensaje del tipo "bulk closing of XXX positions started".
  4. Corregido el cierre grupal de las posiciones opuestas.
  5. Corregida la actualización de los objetos que muestran la historia de transacciones en el gráfico. El error se producía al cambiar el instrumento comercial en el gráfico.

MQL5

  1. Continúa el trabajo relacionado con las funciones para las matrices y vectores: se ha añadido el soporte para float y complex.
  2. El operador "!" (LNOT) para un puntero comprueba ahora su validez usando una llamada implícita a la función CheckPointer Para comprobar rápidamente la existencia de NULL, use el operador "==". Por ejemplo: ptr==NULL o ptr!=NULL.

MetaTester

  1. Corregida la representación de objetos comerciales en el gráfico de prueba.
  2. Acelerado el funcionamiento del sistema gráfico.

MetaEditor

  • Actualizadas las traducciones de la interfaz.

Correcciones de crash logs.

20 mayo 2022
MetaTrader 5 build 3300: Compilación rápida y mejor navegación por el código de MetaEditor

Terminal

  1. Se agregó la capacidad de cambiar el tamaño del objeto gráfico "Rectángulo" arrastrando cualquiera de las cuatro esquinas.


  2. Se aceleró la representación generada por GUI.
  3. Se mejoró la compatibilidad con direcciones IPv6.
  4. Se corrigió el cálculo de la altura del campo de fecha y el ancho del campo de precio, durante la primera inicialización de la plataforma.

MQL5

  1. Se agregó la función para manejar matrices y vectores — RegressionMetric. Especifica el cálculo para evaluar la regresión.
     double vector.RegressionError(const enum lr_error);
     double matrix.RegressionError(const enum lr_error);
     vector matrix.RegressionError(const enum lr_error,const int axis);
    Los cálculos que se pueden utilizar son:
    enum REGRESSION_ERROR
      {
       REGRESSION_MAE,     // Error medio absoluto
       REGRESSION_MSE,     // Error medio cuadrático
       REGRESSION_RMSE,    // Raíz del error medio cuadrático
       REGRESSION_R2,      // R al cuadrado
       REGRESSION_MAPE,    // Error medio absoluto en porcentaje
       REGRESSION_MSPE,    // Error medio cuadrático en porcentaje
       REGRESSION_RMSLE    // Error medio logarítmico cuadrático
      };
  2. Se agregó la función para escribir matrices con un tamaño de datos superior a INT_MAX (matrices de estructuras).

MetaEditor

  1. Se ha rediseñado el panel de pestañas:
    • El panel no está oculto incluso si solo hay una ventana abierta. Por lo tanto, los comandos del menú contextual de la pestaña siempre están disponibles.
    • Se ha agregado un botón "X" a cada pestaña, este sirve para cerrar la misma. Además, las pestañas se pueden cerrar con el botón central del mouse o mediante el menú contextual.


  2. Se ha agregado el comando para la compilación rápida de programas. No se realiza optimización de código en este modo, lo que reduce significativamente el tiempo necesario para crear un archivo EX5 ejecutable. Utilice este modo cuando se encuentre en una etapa activa de desarrollo y necesite verificar rápidamente el código escrito. Al compilar el programa, cambie al modo de máxima optimización para obtener el mejor rendimiento.


    El parámetro "Máxima optimización" en la configuración del proyecto realiza la misma función.
    Todas las operaciones relacionadas con la compilación se han colocado en el menú "Compilación".

  3. Se ha mejorado la gestión de código:
    • Se separaron los comandos para acceder a la declaración y la implementación. Anteriormente, se usaba un comando que mostraba un menú de selección. Ahora se puede saltar inmediatamente a la parte necesaria del código.
    • Se agregó el reemplazo de la palabra clave asignada presionando "Tab" además de "Enter".




  4. Se ha agregado visualización automática de variables locales en la lista de observación del depurador. Para ello, active la opción "Locales" en el menú contextual. Durante la depuración, mientras navega por el código, las variables del ámbito actual aparecerán automáticamente en la lista.


  5. Se ha mejorado el funcionamiento de la lista de observación para vectores y matriz en el depurador.
  6. Se han corregido las rutas a archivos de proyecto. El error podía provocar la desaparición de archivos.

Tester

  1. Se ha mejorado la desconexión de los agentes de prueba al apagar la plataforma.
  2. Se agregó un quinto nodo a la MQL5 Cloud Network. Este se encuentra en Hong Kong. Esto acelerará la optimización de los robots que utilizan la red en las regiones más cercanas.

Correcciones de crash-logs.


29 abril 2022
MetaTrader 5 build 3280: Mejoras y correcciones según los comentarios de los tráders

Terminal

  1. Corregido el rellenado de los niveles estándar de Trailing Stop en el menú contextual de órdenes y posiciones abiertas.



  2. Actualizadas las traducciones de la interfaz de usuario.

Correcciones de crash logs.
21 abril 2022
MetaTrader 5 build 3270: Mejoras y correcciones

Terminal

  1. Mejorado el chat incorporado:
    • Diseño actualizado: ahora los mensajes se muestran sin burbujas circundantes, despejando las ventanas de diálogo de detalles innecesarios. Añadidos avatares y separadores de fechas.
    • Asimismo, hemos añadido al menú de mensajes los comandos de copiado y borrado.
    • Corrección de errores y mejora de la estabilidad.



  2. Corregido el funcionamiento del comando para el cierre masivo de posiciones. Un error surgía en las cuentas con sistema de cobertura de registro de posiciones.
  3. Corregido el registro de algunos tipos de transacciones al formarse la historia de posiciones.

Correcciones de crash logs.
15 abril 2022
MetaTrader 5 build 3260: Operaciones masivas, funciones de matrices y vectores y mejoras en el chat

Terminal

  1. Añadidos los comandos necesarios para el cierre de posiciones y la eliminación de órdenes pendientes de forma masiva.

    En el menú contextual de la sección de comercio ha aparecido un nuevo apartado: "Operaciones masivas". La lista de comandos disponibles se forma en él de forma inteligente, dependiendo de la operación seleccionada y el tipo de cuenta del usuario.




    En el menú siempre están disponibles los comandos:
    • Cierre de todas las posiciones. Para las cuentas de cobertura, el sistema primero intenta cerrar las posiciones con posiciones opuestas; las posiciones restantes se cierran según el procedimiento habitual.
    • Cierre de todas las posiciones rentables y perdedoras
    • Eliminación de todas las órdenes pendientes
    • Eliminación de todas las órdenes pendientes por tipos: Límite, Stop, Stop Limit

    Si seleccionamos una posición, aparecerán comandos adicionales en el menú:
    • Cierre de todas las posiciones del mismo símbolo
    • Cierre de todas las posiciones en la misma dirección (para cuentas de cobertura)
    • Cierre de posiciones opuestas del mismo símbolo (para cuentas de cobertura)
    • Viraje de posición (para cuentas de compensación)

    Si seleccionamos una orden pendiente, aparecerán comandos adicionales en el menú:
    • Eliminación de todas las órdenes pendientes para el mismo símbolo
    • Eliminación de todas las órdenes pendientes del mismo tipo para el mismo símbolo

    Para que estos comandos funcionen, el usuario deberá habilitar el comercio con un solo clic en la configuración de la plataforma: Servicio \ Ajustes \ Comercio.
  2. Ampliadas las funciones del chat incorporadas:
    • Añadida la capacidad de responder a un mensaje. El texto del mensaje original se incluirá como una cita en la respuesta.
    • Añadida la capacidad de crear mensajes con diferentes tipos de contenido: imágenes con texto, texto con archivos adjuntos, etc.
    • Corregida la representación del separador de mensajes leídos y no leídos.
    • Asimismo, se han corregido diferentes errores y se ha aumentado la estabilidad del funcionamiento.



  3. Optimizado y sustancialmente acelerado el funcionamiento del sistema gráfico del terminal. Ahora se gastarán menos recursos en mostrar la interfaz.
  4. Corregido el cálculo del cambio de precio diario para los futuros. Si el bróker transmite el precio de clearing, el cálculo se realizará a partir de él.
    ((Last - Precio de clearing)/Precio de clearing)*100
    Podrá encontrar una descripción completa del cálculo para todos los tipos de instrumentos en la documentación.

  5. Corregidos los errores sucedidos al comprar servicios MQL5:
    • En algunos casos, los sistemas de pago podían mostrar mensajes de error incorrectos para transacciones exitosas.
    • En etapas intermedias del alquiler de un producto en el Mercado, podía mostrarse un precio incorrecto en la página.

  6. Corregido el funcionamiento del botón "Iniciar" en la página del producto comprado/descargado en el Mercado. Ahora inicia correctamente la aplicación en el primero de los gráficos abiertos.
  7. Corregido el registro de algunos tipos de transacciones al formarse la historia de posiciones.

MQL5

  1. Añadidas nuevas funciones para trabajar con matrices y vectores:

    • Median — retorna la mediana de los elementos de una matriz o vector
    • Quantile — retorna el q-ésimo cuantil de los elementos de matriz/vector o los elementos a lo largo del eje de matriz indicado
    • Percentile — retorna el q-ésimo percentil de los elementos de matriz/vector o los elementos a lo largo del eje de matriz indicado
    • Std — calcula la desviación estándar de los elementos de una matriz o vector
    • Var — calcula la varianza de los elementos de una matriz o vector
    • CorrCoef — calcula el coeficiente de correlación de una matriz o vector
    • Correlate — calcula la correlación cruzada de dos vectores
    • Convolve — retorna la convolución lineal discreta de dos vectores
    • Cov — calcula la matriz de covarianza

  2. Hemos comenzado a añadir métodos incorporados para arrays numéricos. Esto hará que el código sea más fácil de escribir, más compacto y mejorará la compatibilidad con otros lenguajes.

    Actualmente, hay tres métodos disponibles:

    • ArgSort: ordena el array según la dimensión indicada, por defecto, según la última (axis=-1).
    • Rango — retorna el número de elementos en la dimensión de array especificada. Análogo de ArrayRange.
    • Size — retorna el número de elementos un array. Análogo de ArraySize.

    Ejemplo:
    void OnStart()
      {
       int arr[4][5]=
         {
            {22, 34, 11, 20,  1},
            {10, 36,  2, 12,  5},
            {33, 37, 25, 13,  4},
            {14,  9, 26, 21, 59}
         };
       ulong indexes[4][5];
    //--- Sort the array
       arr.ArgSort(indexes,-1,0);
       Print("indexes");  
       ArrayPrint(indexes);
      }
    
    // Result log:
    // indexes
    //     [,0][,1][,2][,3][,4]
    // [0,]   4   2   3   0   1
    // [1,]   2   4   0   3   1
    // [2,]   4   3   2   0   1
    // [3,]   1   0   3   2   4

  3. Hemos comenzado a añadir métodos incorporados para cadenas.
    En estos momentos, están disponibles los siguientes métodos:
    • BufferSize — retorna el tamaño de un búfer distribuido para una cadena.
    • Compare — compara entre sí dos cadenas y retorna el resultado de la comparación como número entero.
    • Length — retorna el número de caracteres en una cadena.
    • Find — busca una subcadena en la cadena.
    • Upper — pasa una cadena a mayúsculas.
    • Lower — pasa una cadena a minúsculas.
    • Replace — realiza la sustitución de una subcadena.
    • Reserve — reserva un búfer para una subcadena.

    Todos los métodos funcionan de forma similar a las funciones string.

      Ejemplo:
      void OnStart()
        {
         string test="some string";
         PrintFormat("String length is %d",test.Length());
        }
      
      // Result log:
      // String length is 11
    • Añadido el valor SYMBOL_SUBSCRIPTION_DELAY a la enumeración ENUM_SYMBOL_INFO_INTEGER: la magnitud del retardo en las cotizaciones transmitidas de un símbolo.

      Se usa solo para instrumentos que funcionan por suscripción, generalmente cuando se transmiten datos en el modo de prueba gratuito.

      La propiedad solo se puede solicitar para los símbolos seleccionados en la Observación de Mercado. De lo contrario, obtendremos el error ERR_MARKET_NOT_SELECTED (4302).

    • Añadida la propiedad ACCOUNT_HEDGE_ALLOWED a la enumeración ENUM_ACCOUNT_INFO_INTEGER: el permiso para abrir posiciones opuestas y órdenes pendientes. Se usa solo para las cuentas de cobertura, permitiendo así implementar los requisitos de algunos reguladores, cuando está prohibido tener posiciones opuestas en la cuenta, pero sí se permite tener varias posiciones de un símbolo en una dirección.

      Si esta opción está deshabilitada, estará prohibido tener posiciones y órdenes multidireccionales en las cuentas para el mismo instrumento al mismo tiempo. Por ejemplo, si en la cuenta tenemos una posición Buy, el usuario no podrá abrir una posición Sell o colocar una orden pendiente de venta. Si el usuario intenta hacer esto, ocurrirá el error TRADE_RETCODE_HEDGE_PROHIBITED.

    • Añadidas nuevas propiedades a la enumeración ENUM_SYMBOL_INFO_DOUBLE:
      • SYMBOL_SWAP_SUNDAY
      • SYMBOL_SWAP_MONDAY
      • SYMBOL_SWAP_TUESDAY
      • SYMBOL_SWAP_WEDNESDAY
      • SYMBOL_SWAP_THURSDAY
      • SYMBOL_SWAP_FRIDAY
      • SYMBOL_SWAP_SATURDAY

      Esta propiedades permitirán obtener la tasa de cálculo de swaps para cada día de la semana. 1 — swap único, 3 — triple, 0 — sin swap.

    • Corregido el funcionamiento de las funciones CopyTicks y CopyTicksRange. Un error podía provocar el retorno de datos obsoletos al pasar la medianoche. El error ocurría cuando no se proporcionaban ticks para el instrumento financiero.
    • Correcciones de crash logs.
    11 febrero 2022
    MetaTrader 5 build 3210: modificado el algoritmo de cálculo del Ratio de Sharpe e añadidos nuevos métodos de matriz

    MQL5

    1. Añadidas las funciones Min, Max, ArgMin, ArgMax y Sum para vectores y matrices, que permiten encontrar los valores mínimos y máximos, los índices adecuados y la suma.
    2. Añadido el soporte de métodos Flat para matrices. Esto permite dirigir un elemento de la matriz a través de un índice, en lugar de dos.
      double matrix::Flat(ulong index) const;      // getter
      void matrix::Flat(ulong index,double value); // setter

      Pseudocódigo para calcular la dirección de un elemento de la matriz:

      ulong row=index / mat.Cols();
      ulong col=index % mat.Cols();
      
      mat[row,col]

      Por ejemplo, para una matriz mat(3,3), el acceso a los elementos puede escribirse como sigue

        en lectura —  x=mat.Flat(4), lo que equivale a escribir x=mat[1][1]
        en escritura —  mat.Flat(5, 42), lo que equivale a escribir mat[1][2]=42

      Si se llama a una función con un índice de matriz incorrecto, se generará el error crítico de ejecución OutOfRange.

    3. Mejorado el formato de los números fraccionarios en los parámetros de entrada de programas MQL5. Al leer algunos números reales en los parámetros de entrada, se sustituían los números con más ceros, por ejemplo 0,4 se representaba como 0,400000000002.
    4. Corregidos los errores en la biblioteca matemática Math\Stat\Math.mqh. Además, la función MathSample de esta biblioteca ha sido modificada para cumplir con el comportamiento clásico de las mismas bibliotecas matemáticas al realizar el muestreo con retorno.
    5. Corregido el error en el funcionamiento de CopyTicks/CopyTicksRange que provocaba que se dieran datos obsoletos a medianoche para aquellos casos en los que no se recibían ticks para un símbolo.
    6. Añadidos los nuevos valores INDICATOR_FIXED_MINIMUM e INDICATOR_FIXED_MAXIMUM en ENUM_CUSTOMIND_PROPERTY_INTEGER.
      Estas propiedades se pueden usar para activar/desactivar la fijación de los valores mínimos y máximos del indicador mediante la función IndicatorSetInteger. Al llamar a IndicatorSetInteger(INDICATOR_FIXED_MINIMUM/INDICATOR_FIXED_MAXIMUM, true) se utiliza el valor mínimo/máximo actual, respectivamente.



    Tester

    1. Modificado el algoritmo de cálculo del Ratio de Sharpe, ahora se calcula de forma clásica y su valor se convierte al intervalo anual. El algoritmo anterior se basaba en la dispersión de pérdidas y ganancias (PnL), pero no tenía en cuenta las fluctuaciones de la equidad en las posiciones abiertas. Ahora se consideran las subidas y bajadas de la equidad, y el propio valor del Ratio de Sharpe se trata de forma clásica:
      • Sharpe Ratio < 0                 La estrategia no es rentable, no sirve.  Mal.
      • 0 < Sharpe Ratio  < 1.0       El riesgo no se amortiza. Estas estrategias pueden practicarse si no hay alternativas.  Incierto.
      • Ratio de Sharpe ≥ 1,0        Si el Ratio de Sharpe es superior a uno, significa que el riesgo compensa, el portafolio/estrategia funciona. Bien.
      • Ratio de Sharpe ≥ 3,0        Un indicador alto sugiere que la probabilidad de sufrir pérdidas en una operación determinada es muy baja. Muy bien.

    Terminal

    1. Optimizado el consumo de memoria del terminal.
    2. Mejorado el funcionamiento del subsistema de red para aumentar el rendimiento y reducir la latencia de red.
    3. Eliminada la visualización del nivel cero de la retícula en un indicador cuando el dibujado de esta se encuentra desactivado.


    28 enero 2022
    MetaTrader 5 build 3180: Vectores y matrices en MQL5 y mayor comodidad de trabajo

    Terminal

    1. Añadida la activación de la ventana del gráfico al transferir un símbolo desde la "Observación de mercado" o una transacción comercial desde la historia de la cuenta.

      Ambas acciones cambian el símbolo del gráfico al elegido. Antes, no activaban la ventana del gráfico. En consecuencia, algunas acciones adicionales, como llamar la ventana de diálogo comercial (F9) o cambiar la escala (+/-) usando las teclas de acceso rápido, podrían aplicarse inesperadamente a otro gráfico para el usuario. Ahora el gráfico cuyo símbolo ha cambiado el usuario arrastrándolo, se elige inmediatamente para seguir trabajando.

    2. Añadida la apertura de una nueva ventana de orden al clicar dos veces en una transacción comercial en la historia de la cuenta. Al mismo tiempo, el instrumento financiero de la transacción sobre la que se ha clicado es sustituido inmediatamente en la ventana de diálogo, lo cual permite operar más rápido. Se ha añadido un comando similar al menú contextual.




    3. Añadida la inclusión inteligente de volúmenes reales o de ticks al abrir nuevos gráficos. Estos datos son importantes a la hora de analizar el mercado, pero no todos los tráders conocen su disponibilidad en la plataforma.

      Se da prioridad a los volúmenes comerciales reales. Si son ofrecidos por un bróker, su visualización estará habilitada en el gráfico. De lo contrario, se activará la visualización de los volúmenes de ticks.

      El mecanismo se utiliza solo si el gráfico se abre con la plantilla por defecto default.tpl. Si el usuario activa manualmente la visualización de volúmenes en los ajustes del gráfico, no se volverán a habilitar cuando se vuelva a abrir. Las plantillas personalizadas no se verán afectadas.

    4. Optimizada y sustancialmente acelerada la visualización de la interfaz de usuario.
    5. Mejorada la función de impresión de gráficos llamada a través del menú "Archivo":
      • Corregido el guardado de los ajustes de impresión.
      • Mejorada la apariencia de la página impresa: líneas de cuadrícula aumentadas, nombre de programa oculto, fuente de título actualizada
      • Aumentada la ventana de diálogo de impresión para mostrar la interfaz correctamente

    6. Mejorado el funcionamiento del campo de volumen en el panel de comercio rápido en el gráfico. Antes, después de introducir un nuevo valor y presionar la tecla Tab, el valor se restablecía al anterior.
    7. Corregida la visualización fija de la historia comercial en el gráfico. Anteriormente, al cambiar de cuenta, las transacciones de la cuenta anterior no se eliminaban de los gráficos.
    8. Corregido el pago de los servicios de MQL5.com usando PayPal.
    9. Corregido el bloqueo de la plataforma al mostrar el gráfico de volatilidad de opciones.
    10. Corregida la comprobación del número de teléfono fijo en la ventana de registro de una cuenta real. En algunos casos, después de introducir el número correcto, la plataforma no permitía pasar a la siguiente etapa del registro.
    11. Corregida la verificación de los derechos al unirse a un chat grupal con miembros de la comunidad MQL5.com. Antes, un usuario recién conectado solo podía leer pero no escribir mensajes.
    12. Reemplazada la inscripción en el gráfico cuando faltan datos. Ahora, en lugar de "Waiting for update", se muestran el nombre del instrumento, el marco temporal y la descripción del instrumento.
    13. Mejorado el soporte de precios negativos añadido en el build 2450. Para los instrumentos correspondientes, en la "Observación de Mercado" ahora también pueden representarse valores cero.
    14. Corregida la visualización fija de los logotipos de los productos en el Mercado al trabajar en Wine.

    MQL5

    1. Continúa el trabajo para añadir el soporte de vectores y matrices. Las nuevas funciones amplían significativamente las posibilidades de los desarrolladores de soluciones basadas en redes neuronales.

      Por el momento, muchas funciones ya están listas:
      • Eye — crea una matriz con unos a lo largo de la diagonal indicada y ceros en cualquier otro lugar.
      • Identity — crea una matriz del tamaño indicado con unos en la diagonal principal y ceros en el resto.
      • Ones — crea una matriz del tamaño indicado, llena de unos.
      • Zeroes — crea una matriz del tamaño indicado, llena de ceros.
      • Full — crea una matriz del tamaño indicado, llena con los valores especificados.
      • Copy — crea una copia de una matriz o un vector.
      • Diag — extrae la diagonal de la matriz y también llena la diagonal indicada con los valores del vector.
      • Tri — crea una matriz con unos sobre la diagonal indicada y debajo de la misma, y ceros en cualquier otro lugar.
      • Row — retorna la fila de la matriz como un vector y también llena la fila indicada con los valores del vector.
      • Col — retorna una columna de matriz en forma de vector y también completa la columna indicada con los valores del vector.
      • Rows — retorna el número de filas en una matriz.
      • Cols — retorna el número de columnas en la matriz.
      • Transpose — transpone una matriz.
      • * — producto de matrices, vectores y escalares — producto escalar.
      • Power — eleva una matriz a una potencia.
      • Kron — producto de Kronecker.
      • Cholesky — descomposición de Cholesky.
      • QR — descomposición QR de la matriz.
      • SVD — descomposición en valores singulares.
      • LU — descomposición LU de la matriz.
      • LUP — descomposición LUP de una matriz.
      • Norm — calcula la norma matricial.
      • Cond — calcula el número de condición de la matriz.
      • Spectrum — calcula el espectro de la matriz.
      • Det — calcula el determinante de la matriz.
      • Rank — calcula el rango de la matriz.
      • SLogDet — obtiene el signo y el logaritmo natural del determinante de la matriz.
      • Trace — calcula la traza de una matriz.
      • Solve — resuelve un sistema de ecuaciones lineales.
      • LstSq — resuelve un sistema de ecuaciones lineales usando el método de mínimos cuadrados.
      • Inv — calcula una matriz inversa.
      • PInv — calcula una matriz pseudo-inversa por el método de Moore-Penrose.
      • Compare — compara dos matrices usando épsilon.

      Hay información más detallada disponible en la documentación de MQL5.

    2. Corregidos los errores al trabajar con archivos y bases de datos relacionados con la limitación en la longitud de la ruta. En particular, la función DatabaseOpen permitía establecer una ruta más grande de lo permitido, lo cual provocaba la creación de una base de datos incorrecta. Ahora la función retornará correctamente el código de error ERR_TOO_LONG_FILE_NAME.
    3. Corregido el control de la constancia de variables. En algunos casos, el compilador podía no mostrar el error "constant variable cannot be passed as reference".
    4. Corregidas las advertencias erróneas del compilador sobre el uso de una variable no inicializada.
    5. Corregida la función ChartWindowOnDropped para indicadores. Antes, siempre retornaba un valor cero.
    6. Añadido el soporte de Python 3.10 al módulo de integración con Python.

    VPS

    1. Corregida la representación del punto VPS en el Navegador. En algunos casos, podía desaparecer al cambiar de cuenta.

    MetaEditor

    1. Corregido el despliegue de expresiones complejas en la ventana de visualización durante la depuración.

    Tester

    1. Corregida la exportación de informes de simulación a un archivo. Algunos valores podían redondearse incorrectamente al usar como divisa del depósito una divisa con una precisión de 0 dígitos decimales. Por ejemplo, JPY.
    22 octubre 2021
    MetaTrader 5 build 3091: Mejoras en el funcionamiento

    Terminal

    1. Corregido el salto a una página vacía después de comprar servicios MQL5. Ahora, los usuarios pasarán directamente a los resultados de la operación.
    2. Corregida la compresión excesiva de las imágenes en los documentos cargados al solicitar cuentas reales. Esto ha incrementado la calidad de las comprobaciones automáticas de KYC y la velocidad en la toma decisiones.
    3. Corregido el funcionamiento de los gráficos abiertos al finalizar la prueba.

    MQL5

    1. Añadido el soporte de SQLite 3.36.0.

    MetaEditor

    1. Añadido el resaltado del fondo de los corchetes emparejados. Para activar la opción, entre los ajustes generales del MetaEditor.
    2. Mejorado el funcionamiento del depurador de programas MQL5.

    Correcciones de crash logs.
    21 octubre 2021
    MetaTrader 5 build 3090: Mejoras en el funcionamiento

    Terminal

    1. Corregido el error que provocaba que en algunos casos pudieran desaparecer instrumentos comerciales personalizados.
    2. Mejorados los iconos de los menús y paneles de instrumentos.
    3. Añadidos tres nuevos idiomas a MQL5.com: francés, italiano y turco.

      El número de idiomas disponibles en la mayor comunidad de tráders, MQL5.community, ha aumentado a 11. Hemos traducido completamente la interfaz del sitio web, la documentación y varias docenas de temas importantes del foro. La traducción de los artículos y el calendario económico estará disponible próximamente.

    4. Correcciones de crash logs.

    MQL5

    1. Corregidos los errores en el funcionamiento de la función StringConcatenate.
    2. Corregida la especificación del valor _LastError al trabajar con la función FileSave. En algunos casos, en lugar de describir el error ocurrido en la función, la variable podía contener un valor nulo.
    3. Corregida la importación de recursos a las matrices del tipo double.

    MetaTester

    1. Corregido el error que provocaba el bloqueo de la ventana del gráfico en la simulación visual.
    Documentación actualizada.
    14 octubre 2021
    MetaTrader 5 build 3081: Mejoras en los servicios MQL5 y diseño actualizado

    Terminal

    1. Mejorada la navegación por los servicios de MQL5.community.

      Los subapartados del Mercado, las Señales y el Hosting se han sacado del área de trabajo al navegador. Esto facilitará la búsqueda de productos, así como el trabajo con las compras y las suscripciones. Para cada servicio, se ha añadido el apartado "Cómo funciona", con información útil sobre su uso.


      Mejorada la navegación por los servicios de MQL5.community


    2. Actualizados por completo los botones de todos los menús, paneles, instrumentos y ventanas de diálogo. Gracias a ellos, la interfaz del terminal y el MetaEditor es ahora más fácil de entender:

      • Reducida la cantidad de pequeños detalles difíciles de distinguir.
      • Se usan menos colores para reducir el ruido de color
      • Se usan menos gradientes para mejorar la legibilidad
      • Se usan metáforas más comprensibles


      En la plataforma se han actualizado todos los menús, paneles y ventanas de diálogo


    3. Añadida la visualización de los costes al realizar transacciones en la historia comercial. Esta función la usan los brókeres regulados por la NFA.


      En la historia de la cuenta, ahora se muestran los costes por transacciones


      Si su bróker activa el cálculo del indicador correspondiente en su lado, entre las columnas disponibles en la historia de operaciones aparecerá la columna "Costes". Esta muestra el coste de una transacción en relación con el precio promedio del instrumento (mid-point spread cost).

    4. Añadido el soporte de la versión coreana de MQL5.com.

      Se trata ya del octavo idioma en el que está disponible la mayor comunidad de tráders, MQL5.community. Hemos traducido completamente la interfaz del sitio web, los artículos, el calendario económico y los temas importantes del foro. La traducción de la documentación de MQL5 aparecerá pronto.

    5. Corregida la carga de los instrumentos comerciales personalizados. En algunos casos, la configuración de los símbolos recién creados podría sobrescribir la configuración de los existentes.
    6. Corregida la visualización de la historia comercial de la señal en el gráfico. Al activarse la opción correspondiente, las operaciones se marcaban en el gráfico para todos los instrumentos a la vez, y no solo para el instrumento del gráfico.
    7. Añadida la exportación de la columna "Recopilar" al informe de la historia comercial. Anteriormente, este indicador se mostraba solo en la historia, pero no se guardaba en un archivo.
    8. Optimizado y significativamente acelerado el funcionamiento de los paneles para las operaciones con un solo clic en la Observación del Mercado y los gráficos.
    9. Corregido el funcionamiento del campo "Coeficientes de margen" para los instrumentos comerciales personalizados. En algunos casos, los valores indicados podían restablecerse a cero.
    10. Continúan los trabajos sobre el servicio de suscripciones para los servicios adicionales de los brókeres. Corregidos los errores en la ventana de suscripción a cotizaciones.
    11. Corregida la representación del objeto analítico "Línea de tendencia". Esta podría desaparecer al escalar y cambiar el tamaño de la ventana del gráfico.
    12. Corregida la visualización del objeto analítico "Rectángulo". Cuando uno de los puntos de anclaje se encuentra fuera del área de visibilidad del gráfico, el objeto podría desaparecer.
    13. Corregido y significativamente acelerado el funcionamiento de los chats integrados de MQL5.community.
    14. Corregido el redondeo del parámetro "Precio" en la lista de posiciones abiertas. Anteriormente, era posible que no se mostrase la parte fraccionaria del valor.
    15. Corregida la comprobación de los teléfonos móviles al abrir cuentas. Para algunos operadores de China, el teléfono podía detectarse como indicado incorrectamente.
    16. Añadido el soporte para contraseñas de más de 32 caracteres en cuentas MQL5.
    17. Corregida la exportación de certificados al trabajar con Wine. Esta función se utiliza para cuentas con autenticación extendida al trasladar estas del escritorio al dispositivo móvil.
    18. Corregido el funcionamiento de los botones para cambiar a los servicios MQL5 ubicados en el panel inferior de la ventana "Herramientas". Cuando se desacoplaba la ventana, los botones quedaban inactivos.
    19. Limitado el tamaño del menú "Archivo \ Nuevo gráfico": no más de 128 submenús con grupos de símbolos y no más de 32 símbolos en cada submenú. Esto permitirá acelerar el trabajo con el terminal y evitar bloqueos al añadir a la "Observación de Mercado" un gran número de instrumentos (2000 y más).

    MQL5

    1. Continúa el trabajo para añadir el soporte de vectores y matrices. Las nuevas funciones ampliarán significativamente las posibilidades para los desarrolladores de soluciones basadas en redes neuronales.
    2. Añadidos los valores DEAL_SL y DEAL_TP a la enumeración ENUM_DEAL_PROPERTY_DOUBLE: los niveles de Stop Loss y Take Profit de la transacción.

      Para las transacciones de entrada y reversión, estas propiedades se establecen según el valor de Stop Loss/Take Profit de las órdenes que han propiciado su ejecución. Para las transacciones de salida, se usan los valores de Stop Loss/Take Profit de las posiciones correspondientes en el momento de su cierre.

    3. Añadido el valor MQL_HANDLES_USED a la enumeración ENUM_MQL_INFO_INTEGER: el número de objetos de clase (manejadores) activos en un programa MQL. Se consideran tanto los objetos dinámicos (creados a través de nuevos) como los no dinámicos, las variables globales/locales o los miembros de la clase. Cuantos más manejadores use un programa, más recursos consumirá.

    4. Añadidos nuevos métodos para trabajar con la estructura MqlCalendarValue, que describe un evento del calendario económico:

      • HasActualValue(void): retorna true si se establece el valor actual del evento; de lo contrario, false
      • HasForecastValue(void): retorna true si se establece el valor del evento predicho; de lo contrario, false
      • HasPreviousValue(void): retorna true si se establece el valor del evento anterior; de lo contrario, false
      • HasRevisedValue(void): retorna true si se establece el valor del evento revisado; de lo contrario, false
      • GetActualValue(void): retorna el valor actual del evento (double), o nan, si no está establecido
      • GetForecastValue(void): retorna el valor del evento predicho (doble), o nan, si no se establece
      • GetPreviousValue(void): retorna el valor del evento anterior (doble), o nan, si no se establece
      • GetRevisedValue(void): retorna el valor de evento revisado (doble), o nan, si no se establece

    5. Corregida la depuración de programas MQL5 usando las bibliotecas en forma de archivos EX5.
    6. Acelerada la compilación de programas que contienen grandes matrices inicializadas por una secuencia.
    7. Corregido el error en la función CopyTicksRange que sucedía al trabajar con los datos de los instrumentos comerciales personalizados. En algunos casos, la función podía retornar datos que no se correspondían con el periodo solicitado.
    8. Corregida la comprobación de la presencia de todos los parámetros de la plantilla al realizar la especialización por parámetros. En algunos casos, la compilación del código con las plantillas a depurar podía provocar el error "code generation error".

    Signals

    1. Añadida la posibilidad de renovar automáticamente la suscripción a las Señales.

      Ahora no tendrá que preocuparse de que su suscripción finalice abruptamente. Cuando expire el plazo, el sistema la renovará automáticamente por un mes usando el mismo método de pago que utilizó para la compra.


      Active la renovación automática de la suscripción a las Señales


      Si al realizar un pago se selecciona una tarjeta, pero el pago de la renovación falla, el sistema intentará usar los fondos de su cuenta MQL5.

      No se preocupe sobre un eventual cambio en el precio de su suscripción. Si el precio aumenta, la renovación automática no tendrá lugar. Se le notificará sobre ello a través del correo indicado en su cuenta MQL5.

      La renovación automática se puede activar o desactivar en cualquier momento en el apartado "Mis suscripciones" de MQL5.com.


      Gestione la renovación automática en el apartado &quot;Mis suscripciones&quot; en MQL5.com


    2. Corregidos los errores en la representación del escaparate de señales. Ahora el sistema considerará de forma más correcta la compatibilidad de las señales con la cuenta actual.

    Market

    1. Añadida la búsqueda por nombre y nombre de usuario del autor de un producto en el escaparate del Mercado. Antes, la búsqueda solo funcionaba según el nombre y la descripción de los productos.

    VPS

    1. Mejorado el sistema de renovación automática de la suscripción al VPS.

      Anteriormente, el usuario podía pagar la renovación automática solo con los fondos de su cuenta MQL5. Por consiguiente, para que se realice la renovación, deberá disponer de una cantidad suficiente de fondos en general.

      Ahora no tendrá que pensar en recargar la cuenta a tiempo. Para la renovación automática, el sistema usará el mismo método de pago que utilizó al realizarse por primera vez la suscripción. Si usted ha pagado el hosting con una tarjeta y ha activado la renovación automática, cuando expire el periodo actual, el sistema renovará la suscripción a la misma tarifa, cobrando los fondos de la misma tarjeta. Si el pago con tarjeta falla, el sistema intentará usar los fondos de su cuenta MQL5 como antes.


      Para la renovación automática ahora se pueden usar una tarjeta u otros métodos de pago


      Con la nueva función, podrá estar seguro de que su suscripción no caducará, sus asesores seguirán trabajando y el copiado de señales no se detendrá. No será necesario comprobar y recargar su saldo manualmente.
      La función solo funcionará para suscripciones nuevas. Para las existentes se usará el antiguo esquema de renovación automática mediante el pago con fondos de la cuenta MQL5.

    Tester

    1. Corregido los errores en la simulación visual. En algunos casos, los indicadores utilizados en el asesor experto no se podían mostrar en el gráfico.

    MetaEditor

    1. Corregido el paso a la declaración de una función o variable usando las teclas Alt+G. Si la declaración se encontraba por debajo de la línea desde la que se originó la llamada, el paso no se realizaba.
    2. Añadida la muestra del tipo de objeto para las referencias a los objetos de clase en el depurador.
    3. Añadido el soporte de representación de "union" en la lista de expresiones observadas.

    MetaTrader 5 iPhone/iPad, MetaTrader 5 Android

    1. Añadida la visualización de la ventana de diálogo de exención de responsabilidad al iniciar la aplicación. Por favor, lea la información atentamente. Además, algunos brókeres pueden crear una cuenta de demostración para usted automáticamente al iniciar la aplicación por primera vez. En este caso, se le mostrará una ventana de diálogo de advertencia sobre las reglas.


      En MetaTrader 5 para iPhone/iPad se han añadido advertencias especiales

    2. Añadida la posibilidad de conectar una cuenta al monitoreo en el servicio "Señales" directamente desde la aplicación móvil. Para hacer esto, seleccione "Monitoreo de la cuenta" en el menú. Para mayor comodidad, el número de la cuenta y el nombre del bróker se sustituyen inmediatamente en la ventana de registro. Solo necesitará indicar el nombre de la señal y la contraseña del inversor.

      Conectando la cuenta al monitoreo, podrá recibir estadísticas avanzadas sobre sus transacciones, compartir los resultados con otros operadores y también vender señales.

    3. Añadido el soporte de Huawei AppGallery y HMS Services para los terminales móviles que funcionan con el sistema operativo Android. Los propietarios de teléfonos inteligentes Huawei podrán instalar la aplicación desde su tienda y trabajar con notificaciones automáticas.

    Documentación actualizada.



    18 junio 2021
    MetaTrader 5 build 2980: Notificaciones push sobre operaciones comerciales

    Terminal

    1. Añadida la posibilidad de recibir notificaciones Push sobre transacciones desde el terminal comercial, estas funcionan incluso cuando su terminal está desactivado.



      Antes, usted podía recibir notificaciones en los dispositivos móviles solo desde su propio terminal de escritorio. En cuanto se realizaba una operación comercial, el terminal enviaba el mensaje correspondiente al MetaQuotes ID especificado en los ajustes. En consecuencia, esto solo funcionaba mientras el terminal permaneciera encendido. Ahora no existen tales restricciones. Si un Take Profit se ha activado en el servidor y su computadora está apagada, recibirá una notificación sobre el cierre de la posición en su dispositivo móvil.

      Para recibir notificaciones del servidor, necesitará:
      • Tener una cuenta real: las notificaciones del servidor no funcionan para las cuentas demo
      • Instalar en su smartphone el terminal móvil MetaTrader 5 para iOS o Android
      • Abrir en este el apartado de mensajes, encontrar su MetaQuotes ID e indicarla en los ajustes del terminal de escritorio
      • Activar las notificaciones del servidor en los ajustes del terminal de escritorio

      La disponibilidad y los detalles de las notificaciones dependen de su bróker

      En total, tienen soporte tres tipos de notificaciones: sobre órdenes, sobre transacciones y sobre operaciones de balance. Cuando esta opción está habilitada, los tipos de notificaciones disponibles se mostrarán en el diario del terminal:
      '1222': subscribed to deals, orders, balance notifications from trade server

    2. Actualizado el escaparate de MetaTrader VPS. Ahora es más moderno y cómodo:
      • La interfaz se adapta a cualquier ancho de pantalla.
      • La altura del escaparate ocupa menos espacio para caber siempre en la ventana de trabajo.
      • La información necesaria aparece solo en el momento en que se necesita. La información adicional de pago no se le mostrará hasta que usted haya elegido una tarifa.




    3. Añadidos al panel del simulador de estrategias los comandos necesarios para pasar rápidamente a los servicios MQL5 y a la ventana "Herramientas". Estos se muestran solo en la sección "Vista general"; en otras pestañas, el panel se utiliza para administrar la simulación.



    4. Añadido el guardado del estado de las ventanas para los servicios MQL5. Si usted deja el Mercado abierto antes de apagar el terminal, lo encontrará en el mismo estado la próxima vez que lo encienda.
    5. Corregida la sincronización periódica del estado de la cuenta MQL5. En algunos casos, un error podía provocar la imposibilidad de copiar señales.
    6. Corregida la visualización de la selección de productos recomendados en el Mercado.
    7. Corregido el funcionamiento del menú contextual de señales en el Navegador. Con su ayuda, puede pasar a la visualización de la señal a la que está suscrito, y también darse de baja.

    MQL5

    1. Corregido en la biblioteca estándar el error en el funcionamiento del operador "-" en la implementación de números complejos (archivo MQL5\Include\Math\Alglib\complex.mqh).
    2. Ahora se puede usar cualquier expresión en las secuencias de inicialización, no solo expresiones constantes. Esto aumentará la comodidad de uso y mejorará la compatibilidad con el código С++.
      struct POINT
        {
         int x,y;
        };
      
      int GetYFunc(y)
        {
         return(y * y);
        }
      
      void SomeFunction(int x1,int x2,int y)
        {
         POINT pt={ x1+x2, GetYFunc(y) };
         ProcessPoint(pt);
        };
    3. Corregido el error que surgía al compilar union con grandes matrices de datos.
    4. Corregido el funcionamiento de la función StringToCharArray. Ahora convierte toda la línea transmitida en una matriz Char, en lugar de detenerse en el primer carácter nulo de terminación.
    5. Añadido el control sobre la presencia explícita de una llamada al constructor en el código para las clases/estructuras para las que la clase padre no tiene un constructor predeterminado.

    MetaEditor

    1. Añadida la representación del lugar de llamada para las funciones inline en el informe del perfilador.
      En el ejemplo mostrado más abajo, la llamada de func(); ahora es destacada:



      La propia función func no se destaca, dado que su código se ubica completamente en OnStart.

    2. Añadida la posibilidad de crear un proyecto vacío. Esto resultará útil a la hora de realizar desarrollos no estándar con una estructura de archivos propia, cuando las plantillas predeterminadas no sean adecuadas.



      Al crear un proyecto de esta forma, solo se creará un archivo de configuración "mqproj" vacío. Los archivos para el código fuente deberán ser creados por usted mismo.

    MetaEditor

    1. Inicio acelerado del MetaEditor.
    2. Corregido el error de representación de los datos en la lista de expresiones observadas durante la depuración. En algunos casos, podía mostrar valores incorrectos de las variables.
    3. Corregida la adición automática de la extensión .py" a los archivos de los scripts en Python creados con el MQL Wizard.

    Documentación actualizada.
    21 mayo 2021
    MetaTrader 5 build 2940: Transferencia de los escaparates de los Servicios MQL5 al espacio de trabajo y actualización del diseño

    Terminal

    1. Los Servicios "Mercado", "Señales" y "Hosting Virtual" han sido trasladados a la nueva zona de trabajo de la plataforma para operar con mayor comodidad.

      Antes, los apartados para la compra de los servicios MQL5 se encontraban en la ventana "Herramientas", donde no había mucho espacio disponible. La zona de trabajo principal permite mostrar a los usuarios escaparates completos en los que podrán estudiar con detalle y seleccionar los productos necesarios. En este caso, el menor número de pestañas en las herramientas facilitará el trabajo con las otras funciones de la plataforma.



      Intentamos asegurarnos de que el acceso a servicios adicionales no obstaculice las principales tareas de los tráders, a saber, comerciar y analizar gráficos:
      • Las pestañas de los servicios se encuentran al final, después de todos los gráficos.
      • Si no son necesarias las ventanas de servicio, simplemente pueden cerrarse. Podrá acceder a ellas fácilmente a través del "Navegador", la barra de herramientas o el menú "Servicios".

      Aparte de la transferencia, hemos actualizado totalmente el diseño de los servicios. Ahora resulta más ligero y moderno. Las señales ahora contienen datos adicionales que antes solo estaban disponibles en la ventana del sitio web de MQL5.community: un diagrama de telaraña con las principales características, un indicador de fiabilidad y actividad, etc.






    2. Añadido el soporte completo de direcciones IPv6.

      El protocolo IPv4, que ahora se usa en todas las redes, se inventó hace más de 30 años. Contiene direcciones IP de 32 bits y se representa como cuatro números de 8 bits, separados por puntos. Esto nos permite tener más de cuatro mil millones de direcciones IP únicas. No obstante, ahora el número de dispositivos y sitios web en todo el mundo ha aumentado tanto que las direcciones ya no resultan suficientes para todos los interesados.

      En este sentido, los productos están migrando paulatinamente para el soporte paralelo a un protocolo más moderno: IPv6. Contiene una dirección de 128 bits y se representa como x:x:x:x:x:x:x:x, donde cada letra x supone el valor hexadecimal de los seis elementos de 16 bits de la dirección. Este formato permite obtener 5 x 10 ^ 28 direcciones únicas. Además de un espacio de direcciones significativamente mayor, el protocolo tiene otras ventajas sobre la versión anterior. Podrá leerlas en artículos especializados.

      Lo más importante es que la plataforma MetaTrader 5 ahora está completamente preparada para IPv6. Si su bróker o proveedor lo transfiere a un nuevo esquema laboral, no sentirá ningún cambio y continuará comerciando sin obstáculos.

    3. Continúa el trabajo con el administrador de tareas mostrado en 2815. Ahora, para los gráficos en los que se ejecuta la depuración o el perfilado de programas MQL5, existe una indicación explícita de ello.




    4. Acelerado el inicio de la plataforma en Wine en las computadoras con macOS y Linux. Hemos realizado una optimización general del funcionamiento, y corregido los errores:
      • Mejorada la representación del menú, los paneles de herramientas y las ventanas de diálogo.
      • Corregidos los errores en la representación de los apartados "Mercado", "Señales" y "VPS". En concreto, se ha corregido la carga de los logotipos de los productos en el escaparate del "Mercado".
      • Actualizado el paquete para la instalación fácil de MetaTrader 5 en las computadoras con macOS. Con su ayuda, la plataforma se instala como una aplicación normal.
        En el paquete se incluyen componentes adicionales necesarios para un funcionamiento más rápido y estable. Recomendamos encarecidamente a sus usuarios reinstalar MetaTrader 5 a través del enlace https://download.mql5.com/cdn/web/metaquotes.ltd/mt5/MetaTrader5.pkg.zip


      Si usted usa CrossOver, reinstale por completo MetaTrader 5 en él para obtener la última versión de 64 bits de la plataforma.
    5. Corregido el funcionamiento de la combinación de teclas "Ctrl+F9". Ahora, dicha combinación alterna el foco sobre la pestaña de comercio en las "Herramientas".

    MQL5

    1. Seguimos renunciando a las tecnologías antiguas, incluidos los componentes de 32 bits.

      • Los terminales de 32 bits ya no podrán cargar los programas del "Mercado".
      • Los terminales de 32 bits no pueden utilizar el servicio de hosting.
      • En los editores de 32 bits del MetaEditor ya no está disponible la función de protección adicional de archivos a través de MQL5 Cloud Protector.
      • Los programas MQL5 compilados en las versiones demasiado antiguas del MetaEditor (lanzadas hace 5 años o más) no se iniciarán en la nueva versión del terminal.

      El soporte de la versión de 32 bits de la plataforma finalizó hace un año, en el build 2361. Le recomendamos encarecidamente cambiar a la versión de 64 bits de MetaTrader 5 para poder usar todas las funciones de la plataforma.
      Recomendamos encarecidamente a todos los vendedores que hayan subido versiones de productos de 32 bits al Mercado que recompilen estos en el último MetaEditor de 64 bits y carguen las versiones actualizadas. En las próximas versiones, desactivaremos por completo la posibilidad de ejecutar programas MQL5 de 32 bits en los terminales.

    2. Añadido el soporte de operaciones con números complejos.
      Añadido el nuevo tipo incorporado "complex".
      struct complex
        {
         double             real;   // parte real
         double             imag;   // parte imaginaria
        };
      El tipo "complex" puede transmitirse mediante un valor en calidad de parámetro para las funciones MQL5 (a diferencia de las estructuras normales, que se transmiten mediante un enlace). Para las funciones importadas desde una DLL, el tipo "complex" debe transmitirse solo mediante un enlace.

      Para describir las constantes complejas, se usa el sufijo 'i':
      complex square(complex c)
        {
         return(c*c);
        }
        
      void OnStart()
        {
         Print(square(1+2i));  // se transmite una constante como parámetro
        }
      
      // se mostrará "(-3,4)", la representación de línea del número complejo
      Para los números complejos, en estos momentos están disponibles solo las operaciones sencillas: =, +, -, *, /, +=, -=, *=, /=, ==, !=.

      En el futuro, se añadirán funciones matemáticas adicionales: obtención del valor absoluto, seno, coseno y muchas otras.

    3. Añadido el código de error TRADE_RETCODE_HEDGE_PROHIBITED: la apertura de posiciones o la colocación de órdenes no resulta posible, debido a que no se permiten las posiciones superpuestas. El error se retorna como respuesta al intento de realizar una transacción comercial si la cobertura está prohibida, mientras que en la cuenta hay una posición u orden en la dirección opuesta del mismo símbolo.

    MetaEditor

    1. Corregida la interrupción de la depuración y el perfilado en el modo visual.
    2. Corregido el perfilado de indicadores con datos reales. En algunos casos, podía no iniciarse.

    VPS

    1. Corregido el error de migración del entorno al VPS. Este surgía si el experto trasladado contenía un indicador en forma de recurso.

    Signals

    1. Corregida la comprobación del modo de comercio al copiar señales. El comercio con un instrumento puede verse restringido por parte del bróker: pueden estar permitidas solo las posiciones largas, solo las posiciones cortas o solo las posiciones cerradas. Antes, para realizar el copiado con éxito, el servicio requería permiso completo para comerciar; de lo contrario, la sincronización se interrumpía. Ahora, también se considerarán "negociables" los símbolos cuyo comercio está parcialmente limitado. Los clientes de los brókeres bursátiles podrán copiar señales sin obstáculos.

    Tester

    1. Corregida la comprobación de la sesión comercial al realizar simulaciones. En algunos casos, las operaciones comerciales durante las pruebas podían fallar con el error "market closed", a pesar de haber entrado en la sesión comercial.
    Documentación actualizada.
    12345678910111213