¿Qué novedades tiene MetaTrader 5?

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

18 enero 2018
MetaTrader 5 build 1755

Terminal

  1. Corregido el error que provocaba que el terminal y el MetaEditor bloquearan el apagado y el reinicio de Windows.
  2. Corregida la colocación del margen del gráfico al aplicar plantillas.

MQL5

  1. Corregido el error que provocaba la ralentización de la compilación en ciertas condiciones.

Correciones de crash logs.

12 enero 2018
MetaTrader 5 build 1745

MetaTrader 5 build 1745 es la última versión de la plataforma comercial que da soporte a Microsoft Windows XP/2003/Vista.

Hace unos meses, ya anunciamos que las antiguas versiones de los sistemas operativos dejarían de tener soporte. Windows 2003, Windows Vista y sobre todo Microsoft Windows XP son ya muy antiguos. Microsoft dejó de dar soporte a Windows XP hace 3 años, puesto que, debido a sus limitaciones técnicas, este sistema no permite implementar al cien por cien las posibilidades potenciales del equipo.

MetaTrader 5 build 1745, así como las versiones de la plataforma anteriormente publicadas, continuarán funcionando en los sistemas operativos indicados, pero ya no recibirán ninguna actualización. Asimismo, en los sistemas operativos mencionados tampoco se iniciarán los instaladores.

La versión mínima para trabajar con MetaTrader 5 será Windows 7, pero le recomendamos encarecidamente utilizar las versiones de 64 bits de Windows 10.

Terminal

  1. Se ha añadido al instalador la clave /auto, que permite instalar un programa de forma automática, sin acciones adicionales por parte del usuario. Al iniciar el instalador con esta clave, no se muestran los ajustes de instalación, el terminal se instala directamente conforme a una ruta estándar y con un nombre estándar de la carpeta para el programa en el menú "Inicio". Ejemplo de inicio:
    C:\mt5setup.exe /auto
  2. Corregido el funcionamiento del instalador cuando el usuario del sistema operativo carece de derechos suficientes.
  3. Corregido el consumo excesivo de los recursos del procesador cuando en el terminal no se ejecuta ninguna acción activa (no hay gráficos abiertos, el usuario no realiza ninguna acción).
  4. Activada la compresión automática de archivos *.log a nivel del sistema de archivos. Esto permitirá reducir en el disco el volumen de espacio ocupado por los registros.

Tester

  1. Aumentado el volumen de la caché al realizarse pasadas únicas en la simulación, lo cual acelera la simulación en los sistamas operativos de 64 bits.
  2. Corregida la optimización de los robots comerciales a través de la red computacional en la nube MQL5 Cloud Network. Podían surgir problemas con los productos comprados en la tienda MetaTrader Market.
  3. Corregida la formación de spreads de las barras generadas en el modo de simulación "Según todos los ticks".
  4. Corregida la selección del dispositivo OpenCL en el simulador de estrategias. El simulador visual ahora tiene permitido el acceso a todos los dispositivos OpenCL disponibles.
  5. Activada la compresión automática de archivos *.log a nivel del sistema de archivos. Esto permitirá reducir en el disco el volumen de espacio ocupado por los registros.

MQL5:

  1. Corregida la eliminación de barras del instrumento personalizado con el método CustomRatesDelete.
Correciones de crash logs.
Actualización de la documentación.
20 diciembre 2017
MetaTrader 5 build 1730: Proyectos en el MetaEditor e instrumentos sintéticos

Finaliza el soporte de las antiguas versiones de los terminales

La nueva versión de la plataforma no dará soporte a los terminales de escritorio y móviles de las versiones antiguas:

  • Terminal de cliente: versiones inferiores al build 730 del 23 de noviembre de 2012
  • Terminal móvil para iPhone: versiones inferiores al build 1171 del 11 de noviembre de 2015
  • Terminal móvil para Android: versiones inferiores al build 1334 del 5 de agosto de 2016
Dichos terminales no podrán conectarse a los servidores de las nuevas versiones. Le recomendamos encarecidamente que actualice sus terminales de antemano.

Modificado el protocolo de trabajo con MQL5 Storage

Para dar soporte a los nuevos proyectos compartidos se ha modificado el protocolo de trabajo con el repositorio online MQL5 Storage. Por desgracia, después de actualizar a la nueva versión de la plataforma, usted deberá extraer (check-out) de nuevo todos los datos del repositorio. Los propios datos que se guardan en él no se tocarán ni perderán.

Antes de actualizar a la nueva versión de la plataforma, le recomendamos enviar todos los cambios locales al repositorio (ejecutar Commit).

Terminal

  1. Añadida la posibilidad de crear instrumentos financieros sintéticos, es decir, instrumentos basados ​​en uno o más de los disponibles. Solo tiene que especificar la fórmula para el cálculo de las cotizaciones y la plataforma generará los ticks del instrumento sintético en tiempo real, y también creará su historia de minutos.

    Cómo sucede esto

    • Usted crea un instrumento sintético y establece una fórmula para él.
    • La palataforma calculará sus ticks con una frecuencia de 10 veces por segundo (y solo si cambia el precio aunque sea de un instrumento que entre en la fórmula).
    • La plataforma calcula la historia de las barras de minuto (en los dos últimos meses) basándose en las barras de minuto de los instrumentos que entren en su fórmula. Todas las barras nuevas (la actual y la siguiente) se construirán en tiempo real basándose en los ticks generados del instrumento sintético.

    Por ejemplo, usted puede crear un instrumento que muestre el índice del dólar (USDX). Su fórmula tendrá el aspecto siguiente:

    50.14348112 * pow(ask(EURUSD),-0.576) * pow(USDJPY,0.136) * pow(ask(GBPUSD),-0.119) * pow(USDCAD,0.091) * pow(USDSEK,0.042) * pow(USDCHF,0.036)

    Nota: en la fórmula original del índice del dólar se usan las parejas USDEUR y USDGBP. Puesto que en la plataforma solo hay parejas de divisas inversas, en la fórmula del instrumento sintético para ellas se usa la potencia negativa y el precio Ask en lugar de Bid.

    La plataforma calculará en tiempo real el precio del nuevo instrumento basándose en las cotizaciones de los otros seis instrumentos, proporcionados por su bróker. En la Observación del mercado y en el gráfico, podrá ver cómo cambiar su precio:


    Cree un nuevo instrumento personalizado, abra sus especificaciones e indique la fórmula:



    Para mayor comodidad, el editor de fórmulas muestra una lista con las posibles variantes a medida que se introduce el nombre de los instrumentos y funciones.

    El cálculo de los ticks y las barras de minuto del instrumento sintético comienza al añadirlo a la "Observación del mercado". En este caso, a la "Observación del mercado" se añaden todos los símbolos necesarios para su cálculo. Al diario de la plataforma se añadirá una entrada sobre el comienzo del cálculo: Synthetic Symbol USDX: processing started.
    • El cálculo del instrumento sintético terminará al ocultarse de la "Observación del mercado".
    • Los símbolos usados en el momento actual para calcular los instrumentos sintéticos no pueden ser ocultados de la "Observación del mercado".

    Cálculo de las cotizaciones en tiempo real
    Cada 100 ms (diez veces por segundo) se comprueba si ha cambiado el precio de aunque sea uno de los instrumentos que participa en la fórmula. De ser así, tendrá lugar el recálculo del precio del instrumento sintético y se generará un tick. El cálculo se realiza paralelamente en tres flujos para los precios Bid, Ask y Last. Por ejemplo, si en la fórmula se indica EURUSD*GBPUSD, el cálculo de los precios del intrumento sintético será el siguiente:

    • Bid — bid(EURUSD)*bid(GBPUSD)
    • Ask — ask(EURUSD)*ask(GBPUSD)
    • Last — last(EURUSD)*last(GBPUSD)

    La presencia de cambios se comprueba para cada precio por separado. Por ejemplo, si al darse el cálculo cambia solo el precio Bid del instrumento fuente, entonces para el tick del instrumento sintético se calculará solo el precio donde ha habido cambios.

    Construcción de la historia de barras de minuto
    Aparte de recopilar los ticks en tiempo real, la plataforma crea también la historia de minutos del instrumento sintético. De este modo, el tráder puede mirar sus gráficos de una forma análoga a los instrumentos convencionales, para llevar a cabo el análisis técnico con la ayuda de objetos e indicadores.

    En cuanto el tráder añade un instrumento sintético a la Observación del mercado, la plataforma comprueba si existe historia de minutos calculada para él. De no ser así, esta se creará para los últimos 60 días, es decir, unas 50 000 barras. Si, en los ajustes de la plataforma, en el parámetro barras máximas en la ventana se indica un valor menor, se usará precisamente esta limitación.

    Si una parte de las barras de este periodo ya ha sido construida, la plataforma creará las nuevas barras que falten. La historia más profunda se crea solo al intentar visualizar el periodo temporal correspondiente en el gráfico (al pasarlo hacia atrás o solicitar la historia de un programa MQL5).

    La historia de las barras de minuto de los instrumentos sintéticos se calcula usando como base las barras de minuto (no los ticks) de los instrumentos incluidos en la fórmula. Por ejemplo, para calcular el precio Open de la barra de minuto de un instrumento sintético, la plataforma toma el precio de los instrumentos Opеn incluidos en su fórmula. El cálculo de los precio High, Low y Close se realiza de forma análoga.

    Si para algún instrumento de la fórmula no está presente la barra de minuto correspondiente, la plataforma tomará para el cálculo el precio Close de la barra anterior. Por ejemplo, se usan tres instrumentos: EURUSD, USDJPY y GBPUSD. Si al calcular la barra correspondiente al minuto 12:00, para el instrumento USDJPY no está presente esta barra de minuto, al realizar el cálculo se usarán los precios siguientes:

    • Para Open — EURUSD Open 12:00, USDJPY Close 11:59, GBPUSD Open 12:00
    • Para High — EURUSD High 12:00, USDJPY Close 11:59, GBPUSD High 12:00
    • Para Low — EURUSD Low 12:00, USDJPY Close 11:59, GBPUSD Low 12:00
    • Para Close — EURUSD Close 12:00, USDJPY Close 11:59, GBPUSD Close 12:00

    Si la barra de minuto no está presente en ninguno de los instrumentos de la fórmula, no se calculará la barra de minuto correspondiente del instrumento sintético.

    Construcción de las nuevas barras de minuto
    Todas las nuevas barras (la presente y las siguientes) del instrumento sintético se crean usando como base los ticks generados. El precio al que se construyen las barras depende del parámetro "Construcción de gráficos" en las especificaciones:




    Qué operaciones se pueden utilizar en la fórmula del instrumento
    En la fórmula se pueden utilizar los datos de precio, así como ciertas propiedades de los símbolos disponibles (proporcionados por el bróker). Para ello, indique:

    • El nombre del símbolo: dependiendo de qué precio del instrumento sintético se calcule, en la fórmula se usará el precio Bid, Ask o Last del instrumento indicado. Por ejemplo, si indicamos EURUSD*GBPUSD, entonces Вid se calculará como bid(EURUSD)*bid(GBPUSD), y el precio Ask, como ask(EURUSD)*ask(GBPUSD).
    • bid(nombre del símbolo) — para calcular el precio Bid de un instrumento sintético se usará obligatoriamente el precio Bid del símbolo indicado. En la práctica, esta variante se corresponde con la anterior (sin indicar el tipo de precio).
    • ask(nombre del símbolo) — para calcular el precio Bid de un instrumento sintético se usará obligatoriamente el precio Ask del símbolo indicado. Para calcular el precio Ask, al contrario, se usará el precio Bid del instrumento indicado. Para calcular el precio Last se usará el precio Last del instrumento indicado. Por ejemplo, si indicamos ask(EURUSD)*GBPUSD, el cálculo será el siguiente:
      • Вid = ask(EURUSD)*bid(GBPUSD)
      • Ask = bid(EURUSD)*ask(GBPUSD)
      • Last = last(EURUSD)*last(GBPUSD)
    • last(nombre del símbolo) — el precio Last del símbolo indicado se usará al realizarse el cálculo de todos los precios del instrumento sintético (Bid, Ask y Last). Por ejemplo, si indicamos last(EURUSD)*GBPUSD, el cálculo será el siguiente:
      • Вid = last(EURUSD)*bid(GBPUSD)
      • Ask = last(EURUSD)*ask(GBPUSD)
      • Last = last(EURUSD)*last(GBPUSD)
    • volume(nombre del símbolo) — en la fórmula se utilizará el volumen de ticks del instrumento indicado. Asegúrese de que se transmite la información sobre los volúmenes para el instrumento indicado.
    • point(nombre del símbolo) — en la fórmula se colocará el tamaño del cambio mínimo de precio del instrumento indicado.
    • digits(nombre del símbolo) — en la fórmula se colocará el número de dígitos decimales en el precio del instrumento indicado.

    Si el símbolo tiene un nombre complicado (contiene guiones, puntos, etc), deberá estar entre comillas. Por ejemplo, "RTS-6.17".
    En la fórmula se pueden utilizar las operaciones aritméticas: suma (+), resta (-), multiplicación (*), división (/) y resto de la división (%). Por ejemplo, EURUSD+GBPUSD indica que el precio se calcula como la suma de los precios EURUSD y GBPUSD. Asimismo, en la fórmula se puede utilizar un signo menos unario para cambiar el signo: -10*EURUSD.

    Existe cierta prioridad de ejecución para las operaciones aritméticas:

    • Las operaciones de multiplicación, división y resto de la división se realizan en primer lugar; después se ejecutan las operaciones de suma y resta.
    • Las operaciones se realizan de izquierda a derecha. Si en la fórmula se realizan varias operaciones que tenga la misma prioridad (por ejemplo, multiplicación y división), se ejecutará en primer lugar la operación de la izquierda.
    • Para modificar la prioridad de las operaciones se pueden utilizar los paréntesis ( y ). Las expresiones entre paréntesis tienen la mayor prioridad en los cálculos. Para ellas también existe el principio de izquierda a derecha: primero se calculan las expresiones entre paréntesis que se encuentren más a la izquierda en la fórmula.

    Asimismo, en la fórmula se pueden utilizar constantes:

    • Numéricas (enteras y reales con punto). Por ejemplo, EURUSD*2+GBPUSD*0.7.
    • Propiedades de símbolo _Digits y _Point. Estas añaden a la fórmula las propiedades del símbolo personalizado a partir de las especificaciones. _Digits — número de dígitos después de la coma en el precio de un instrumento, _Point — tamaño del cambio mínimo de precio de un instrumento.

    Además, en la fórmula se pueden usar todas las funciones matemáticas utilizables en MQL5, excepto MathSrand, MathRand y MathIsValidNumber. Para todas las funciones se usan solo los nombres cortos: fabs(), acos(), asin(), etcétera.

  2. Añadida la posibilidad de agregar cotizaciones para los instrumentos financieros en tiempo real. Ahora en MQL5 se puede escribir un experto que agregará cualquier cotización del instrumento personalizado indicado. Para ello, se usa la nueva función CustomTicksAdd.
    int  CustomTicksAdd(
       const string           symbol,       // nombre del símbolo
       const MqlTick&         ticks[]       // matriz con los datos de ticks que se deben aplicar al instrumento personalizado
       );
    La función CustomTicksAdd permite retransmitir los ticks como si llegaran del servidor del bróker. Los datos se registran directamente en la base de ticks, y luego se envían a la ventana "Observación del mercado". Y ya desde ella, el terminal guarda los ticks en su base. Si se transmite un gran volumen de datos en una llamada, la función cambia su comportamiento para ahorrar recursos. Si se transmiten más de 256 ticks, los datos se dividen en dos partes. La primera parte (la más grande) se registra directamente en la base de ticks (como hace CustomTicksReplace). La segunda parte, compuesta de los últimos 128 ticks, se transmite a la ventana de "Observación de mercado" y, después de ello, se guarda en la base del terminal.

  3. Añadida la representación de los precios High y Low en la Observación del mercado. Por defecto, estas columnas están desactivadas. Se podrán activar a través del menú contextual:




    Para los instrumentos cuyos gráficos se construyen según los precios Bid (como se indica en las especificaciones), se muestran los precios Bid High y Bid Low. Para los instrumentos cuyos gráficos se construyen según los precios Last, se muestran Last High y Last Low.

    Junto con las columnas High/Low se activará automáticamente la columna Last, si en la Observación del mercado hay aunque sea un solo instrumento cuyos gráficos se construyan con los precios Last.

  4. Añadida la posibilidad de editar la historia de ticks de los instrumentos financieros personalizados. Pulse "Símbolos" en el menú contextual de la Observación del mercado, elija el instrumento personalizado y solicite el intervalo de datos necesario en la pestaña "Ticks".

    • Para cambiar el valor, clique dos veces sobre el mismo.
    • Para añadir o eliminar entradas, use el menú contextual.
    • Para eliminar varias barras/ticks a la vez, selecciónelos con el ratón, manteniendo la tecla Shift o Ctrl+Shift.


    Para mayor comodidad, los cambios de las entradas se iluminan:

    • fondo verde — entrada cambiada
    • fondo gris — entrada eliminada
    • fondo amarillo — entrada añadida

    Para guardar los cambios, pulse "Aplicar cambios" en la parte inferior de la ventana.

  5. Añadida la representación de las cuentas preliminares en el árbol del Navegador.

    Los tráders pueden enviar al bróker solicitudes para la apertura de cuentas reales directamente desde los terminales de escritorio. Para ello, basta con rellenar un sencillo formulario con su información de contacto, de la misma forma que se hace al abrir una cuenta demo. Después se crea para el tráder una cuenta preliminar especial. A continuación, el bróker se pone en contacto con el tráder para formalizar las relaciones, y crea una cuenta real a partir de la preliminar.




  6. Añadida la muestra de la hora en milisegundos en la Ventana de cotizaciones:



  7. Se ha acelerado el escaneo de los servidores disponibles en la ventana de diálogo de la cuenta nueva.
  8. Corregida la representación del objeto gráfico "Línea de tendencia" con las opciones "Rayo a la izquierda" y "Rayo a la derecha" activadas.
  9. Optimizado el trabajo con grandes cantidades de mensajes del correo interno (cientos de miles).
  10. Optimizado el trabajo del terminal con grandes cantidades de instrumentos comerciales (50 mil y más).
  11. Añadida la optimización de la historia de ticks de los instrumentos personalizados ejecutada después de editar la historia.

MetaEditor

  1. En el MetaEditor han aparecido los proyectos completos. Así, desarrollar programas es mucho más cómodo.

    Ahora como proyecto no actúa el principal archivo MQ5 del programa. El proyecto es un archivo "MQPROJ" aparte, en el que se guardan los ajustes del programa, los parámetros de compilación y la información sobre todos los archivos utilizados. El acceso a los ajustes principales del proyecto se organiza a través de una ventana de diálogo aparte, ya no hay necesidad de indicarlos en el código fuente con la ayuda de #property.

    Para trabajar más cómodamente con el proyecto, ahora existe una pestaña aparte en el Navegador. En esta se representan por categorías todos los archivos utilizados: de inclusión, de recursos, de encabezado, etc. Además, los archivos se añaden al navegador del proyecto de forma automática. Por ejemplo, si usted incluye un nuevo archivo MQH en el código, se mostrará automáticamente en el apartado "Dependencies" del navegador.

    Hemos previsto directamente la posibilidad de trabajar con nuevos proyectos en el repositorio online MQL5 Storage. Ahora resulta mucho más cómodo desarrollar grandes proyectos junto a otros miembros de MQL5.community.

    Para trabajar en dichos proyectos compartidos, se ha añadido el nuevo apartado Shared Projects. El proyecto creado en este apartado se envía directamente al repositorio: usted podrá conceder derechos a otros miembros y proceder al desarrollo conjunto rápidamente.




    Al compilar el proyecto en Shared Project, el archivo ejecutable EX5 se copia automáticamente en el catálogo local Experts, Indicators o Scripts, dependiendo del tipo de programa. Usted podrá iniciar directamente el programa en el gráfico, sin copiar los archivos manualmente cada vez.


    Cambios en el trabajo con el repositorio MQL5 Storage

    Para implementar la posibilidad de trabajar con proyectos compartidos, se ha rehecho por completo el protocolo de trabajo con el repositorio MQL5 Storage. Por desgracia, después de actualizar a la nueva versión de la plataforma, usted deberá extraer (check-out) de nuevo todos los datos del repositorio. Los propios datos que se guardan en él no se tocarán ni perderán.

    Antes de actualizar a la nueva versión de la plataforma, le recomendamos enviar todos los cambios locales al repositorio (ejecutar Commit).

    El comando "Extraer datos del repositorio" (Checkout from Storage) ahora no está disponible. Para extraer datos de utilizan los comandos "Activar MQL5 Storage" y "Obtener archivos del repositorio":

    • Si en la copia actual del MetaEditor usted no ha usado aún el repositorio, pulse "Activar MQL5 Storage" en el menú contextual de la ventana "Navegador". Todos los catálogos y archivos existentes en su repositorio se transferirán a la computadora local.
    • Si usted ya trabaja con el repositorio, entonces para extraer todos los datos del mismo, pulse "Obtener archivos del repositorio" en el menú contextual del elemento raíz de MQL5 en la ventana "Navegador".

    Nuevos proyectos: ejemplo de creación y detalles del funcionamiento

    En el MetaEditor ahora existe un nuevo elemento: el proyecto propiamente dicho. Se trata de un archivo con la expansión mqproj, en el que se guardan las propiedades generales del programa, así como información sobre todos los archivos utilizados. Ahora es posible gestionar cómodamente las propiedades del programa en una ventana de diálogo propia del MetaEditor, sin tener que modificarlas manualmente en el código fuente (directivas #property).

    Si usted ya dispone de desarrollos, el método más sencillo de probar los nuevos proyectos es usar el comando "Nuevo proyecto a partir de un Archivo fuente".



    En el mismo catálogo que se encuentra el archivo fuente, se creará un archivo de proyecto homónimo con la expansión mqproj. Al proyecto se añadirán de forma automática las propiedades principales del programa, indicadas como #property en el archivo fuente: el nombre, el copyright, la versión, el enlace al desarrollador y la descripción.

    Las propiedades del programa en el archivo del proyecto tienen prioridad sobre las propiedades indicadas en el código fuente. Si usted indica las propiedades tanto en el proyecto como en el código fuente, se usarán las propiedades del proyecto.




    En las propiedades de los proyectos han aparecido dos nuevas opciones para compilar programas MQL5:

    • Activar optimización adicional: las aplicaciones con la optimización desactivada se compilan más rápido, pero funcionan más despacio.
    • Comprobar los divisores reales: las aplicaciones con la comprobación desactivada funcionan un poco más rápido, puesto que los errores de división por cero no son comprobados al ejecutar el código.

    Para trabajar con un proyecto se ha diseñado la pestaña aparte "Proyecto", en la ventana "Navegador". En esta pestaña se muestran cómodamente todos los archivos usados en el proyecto. Al generar el proyecto a partir de un archivo fuente, se añaden automáticamente al apartado "Dependencies" todos los archivos de inclusión utilizados (indicados con la ayuda de la directiva #include en el archivo MQ5 principal y en todos los archivos incluidos en él).

    Al añadir nuevos archivos de inclusión al código fuente, dichos archivos también aparecerán en el Navegador del proyecto. En el apartado Headers se añadirán los archivos de encabezado utilizados, y en el apartado Resources, las imágenes, sonidos y otros programas MQL5 incluidos en el proyecto en forma de recursos. En el apartado Sources se muestran los archivos MQ5 con el código fuente. Al apartado Settings and files podemos añadir otros archivos, por ejemplo, los ajustes para la simulación y las plantillas para los gráficos.

    Para añadir los archivos existentes al proyecto y eliminar archivos del mismo, use los comandos del menú contextual. Preste mucha atención al eliminar archivos: usted puede quitar un archivo del proyecto (suprimir la vinculación) o eliminarlo completamente del disco duro:




    Crear un nuevo proyecto es igual de fácil que crear un programa MQL5 normal. Pulse "Nuevo proyecto" y, ya en el Wizard de MQL5 en el modo normal, elija el tipo de programa a crear, indicando también sus propiedades (nombre, manejador de eventos, etc).

    Para obtener un archivo ejecutable EX5, usted podrá abrir el proyecto y ejecutar el comando de compilación (F7) o, como antes, abrir el archivo MQ5 principal del programa y compilarlo.


    Proyectos compartidos en MQL5 Storage: detalles del funcionamiento

    Para trabajar con proyectos compartidos, se ha diseñado el apartado Shared Projects. Si usted aún no ha activado el repositorio, ejecute en el menú contextual de esta carpeta el comando Activate MQL5 Storage. El MetaEditor comprobará de inmediato si hay datos guardados en su repositorio, y también si hay disponible para usted algún proyecto compartido. Los datos disponibles se extraerán instantáneamente del repositorio y luego serán cargados en la computadora (Checkout). Los proyectos compartidos disponibles se mostrarán en el apartado Shared Project, para obtenerlos, pulse "Extraer archivos del repositorio" en el menú contextual.

    Para crear un nuevo proyecto compartido, elija la carpeta Shared Projects y pulse "Nuevo proyecto":




    A continuación, siga los pasos estándar del Wizard MQL5: indique el tipo, el nombre y las propiedades del futuro programa. Elija para los proyectos compartidos nombres claros y comprensibles, para que los demás miembros puedan distinguirlos fácilmente. En los nombres solo se permiten letras latinas, no están permitidos los espacios en blanco.

    Una vez creado, el proyecto se añadirá automáticamente al repositorio MQL5 Storage. Los archivos utilizados de la biblioteca estándar no son añadidos al repositorio, podrá añadirlos manualmente en caso necesario.

    Para permitir trabajar en el proyecto a los otros integrantes, abra las propiedades del mismo. Aquí podrá conceder derechos a usuarios concretos (indicando el login de MQL5.community), y también establecer los parámetros generales del trabajo cooperativo:

    • Proyecto privado
    • Cualquiera puede unirse al proyecto
    • Solicitar la participación en el proyecto




    Para trabajar con mayor comodidad, al compilar un proyecto compartido, el archivo ejecutable final (EX5) se copia de forma automática en la carpeta Experts, Indicators o Scripts, dependiendo del tipo de programa. De esta forma, usted podrá iniciar directamente el programa en el terminal, sin copiarlo manualmente al catálogo necesario.


    Proyectos públicos en MQL5 Storage: participación en los desarrollos

    Como ya hemos mencionado anteriormente, cada proyecto compartido en MQL5 Storage dispone de ajustes de privacidad: el proyecto puede ser privado o estár abierto para otros usuarios. Ahora todos los proyectos en los que se puede participar libremente se representan en la pestaña aparte "Proyectos públicos".

    Cualquier usuario puede encontrar un proyecto interesante y participar en su desarrollo. Basta con pulsar "Unirse", y después recibir el proyecto desde el repositorio.



    Al unirse, el usuario solo adquiere el derecho a ver el proyecto. Para tener derecho a enviar al repositorio sus propios cambios, contacte con el autor del proyecto. Para ver el login del autor, abra las propiedades del proyecto a través del menú contextual.

  2. Añadida la posibilidad de insertar fácilmente diferentes propiedades y recursos en el código del programa. Por ejemplo, usted podrá añadir rápidamente al código un archivo de inclusión. Elija el comando "Insertar — MQH en forma de #incude", y después elija el archivo de inclusión necesario en la ventana que se abrirá. A continuación, al código del programa se le añadirá la directiva #include con la ruta correcta indicada al archivo elegido.




    Con la ayuda de este mismo menú, es posible añadir con facilidad archivos en forma de matriz binaria o de texto al código del programa. Usted podrá, por ejemplo, trasladar las plantillas de los gráficos junto con los expertos/indicadores: incluya su plantilla en el código del programa en forma de matriz, a continuación, con la ayuda de la función FileSave, guárdela en el disco. Después de ello, la plantilla se podrá aplicar al gráfico directamente desde el experto con la ayuda de la función ChartApplyTemplate.
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
    //--- archivo de la plantilla en forma de matriz binaria
       unsigned char my_template[]=
         {
          0xFF,0xFE,0x3C, ... ,0x00 // la matriz de datos ha sido acortada en el ejemplo
         };
    //--- guardamos y aplicamos la plantilla
       if(FileSave("my_template.tpl",my_template))
         {
          Print("Custom template saved in \\MQL5\\Files");
          if(ChartApplyTemplate(0,"\\Files\\my_template.tpl"))
             Print("Custom template applied to the current chart");
          else
             Print("Failed to apply custom template");
         }
       else
          Print("Failed to save custom template");
      }

  3. Añadida la posibilidad de transformar las líneas entre los formatos ASCII, HEX y Base64. Elija una línea en el código fuente, y a continuación pulse el comando necesario en el menú "Editar — Transformar":




  4. Corregida la búsqueda por archivos sin tener en cuenta el registro.
  5. Corregido el error en el depurador al calcular el valor de una expresión del tipo x.y[0][1].z.
  6. Corregido el desplazamiento por el código con la ayuda de los botones "Adelante" y "Atrás".

MQL5:

  1. Añadido un nuevo servicio online para proteger adicionalmente los programas MQL5: MQL5 Cloud Protector. Se trata de una protección análoga a la usada en la mayor tienda de aplicaciones comerciales, MetaTrader Market, donde los archivos de los productos (EX5) enviados por los vendedores son compilados de manera adicional en código nativo.

    Ahora todos pueden disponer de un nivel de protección como el del Mercado. Basta con ejecutar el comando Servicio — MQL5 Cloud Protector en el MetaEditor. La única diferencia de esta protección con respecto a la del Mercado consiste en que no se vincula a la computadora del usuario. Los archivos protegidos con MQL5 Cloud Protector se pueden iniciar en cualquier computadora, como los archivos EX5 normales.
    El servicio MQL5 Cloud Protector funciona de forma segura. La protección adicional se aplica solo al archivo ya compilado. El código fuente no se transmite a ninguna parte. Primero el program se compila en un archivo EX5 en la compuatadora del usuario, después el archivo compilado se envía al servicio por un canal codificado, es protegido y retorna al usuario.



  2. Añadidas varias funciones para trabajar con instrumentos financieros personalizados.

    Función Acción
    CustomSymbolCreate Crea un símbolo personalizado con el nombre indicado en el grupo indicado
    CustomSymbolDelete Elimina el símbolo personalizado con el nombre indicado
    CustomSymbolSetInteger Establece para el símbolo personalizado el valor de propiedad de tipo de número entero
    CustomSymbolSetDouble Establece para el símbolo personalizado el valor de propiedad de tipo real
    CustomSymbolSetString Establece para el símbolo personalizado el valor de propiedad de tipo string
    CustomSymbolSetMarginRate Establece para el símbolo personalizado los coeficientes del margen de carga dependiendo del tipo y la dirección de la orden
    CustomSymbolSetSessionQuote Establece la hora de comienzo y finalización de la sesión de cotizaciones indicada para los símbolos y el día de la semana indicados
    CustomSymbolSetSessionTrade Establece la hora de comienzo y finalización de la sesión de comercial indicada para los símbolos y el día de la semana indicados
    CustomRatesDelete Elimina todas las barras en el intervalo temporal indicado de la historia de precios del instrumento personalizado
    CustomRatesReplace Sustituye totalmente la historia de precios del instrumento personalizado en el intervalo temporal indicado, con los datos de la matriz del tipo MqlRates
    CustomRatesUpdate Añade a la historia del instrumento personalizado las barras ausentes y sustituye las existentes con datos de la matriz del tipo MqlRates
    CustomTicksAdd Añade a la historia de precios del instrumento personalizado los datos de la matriz del tipo MqlTick. El símbolo personalizado debe ser elegido en la ventana de MarketWatch (Observación del mercado)
    CustomTicksDelete Elimina todos los ticks en el intervalo temporal indicado de la historia de precios del instrumento personalizado
    CustomTicksReplace Sustituye totalmente la historia de precios del instrumento personalizado en el intervalo temporal indicado, con los datos de la matriz del tipo MqlTick

  3. Se han añadido a la Biblioteca Estándar Colecciones de datos genéricas, que contienen clases e interfaces para definir las colecciones basadas en plantillas. Las nuevas colecciones estrictamente tipadas hacen más cómodo el desarrollo de programas y aumentan el rendimiento del trabajo con datos.

    La biblioteca se ubica en el catálogo de trabajo del terminal en la carpeta Include\Generic.

  4. Añadido el soporte de plantillas para los datos del tipo union.
  5. Añadida la propiedad del instrumento comercial SYMBOL_VISIBLE. La llamada de SymbolInfoInteger(symbol, SYMBOL_VISIBLE) retornará false si el símbolo indicado no se ve en la Observación del mercado.
  6. Añadido el evento CHARTEVENT_MOUSE_WHEEL. El evento se llama al girar o pulsar la ruleta del ratón en el gráfico (si se ha establecido para él CHART_EVENT_MOUSE_WHEEL=true).
  7. Añadidas nuevas propiedades del gráfico:

    • CHART_EVENT_MOUSE_WHEEL — activar/desactivar la generación del evento de giro y pulsación de la ruleta del ratón en el gráfico CHARTEVENT_MOUSE_WHEEL. . Valores posibles: 0 y 1.
    • CHART_CROSSHAIR_TOOL — activar/desactivar la posibilidad de pasar el cusor al modo "Cursor en cruz" al pulsar el botón central del ratón. Valores posibles: 0 y 1.
    • CHART_CONTEXT_MENU — activar/desactivar la representación del menú contextual al pulsar el botón derecho del ratón en el gráfico. Valores posibles: 0 y 1.

  8. Ahora, al calcular la escala de la ventana del indicador, no se tienen en cuenta los búferes de dibujado con el estilo DRAW_NONE.
  9. Añadida la generación del evento CHARTEVENT_CHART_CHANGE al indicar la propiedad CHART_SCALEFIX (escala fija) para el gráfico.
  10. Añadida la función ArraySwap, que permite intercambiar rápidamente el contenido de las matrices dinámicas.
    bool  ArraySwap(
       void&  array1[],      // primera matriz
       void&  array2[]       // segunda matriz
       );
    La función adopta matrices dinámicas de idéntico tipo e idénticas dimensiones. Para las matrices multidimensionales, deberá coincidir el número de elementos en todas las dimensiones, excepto la primera.

  11. Añadida la nueva propiedad TERMINAL_RETRANSMISSION — el porcentaje de paquetes de red nuevamente enviados (retransmisiones) en el protocolo TCP/IP para todos los servicios y aplicaciones iniciados en una computadora dada. Incluso en la red más rápida y mejor configurada tienen lugar pérdidas de paquetes y, como consecuencia, no se da la confirmación de la entrega de los paquetes entre el receptor y el emisor. En tales casos, el paquete "perdido" es enviado de nuevo.

    El terminal no calcula este índice, el valor del mismo se solicita una vez por minuto desde el sistema operativo. No es un índice de calidad de la conexión de un terminal concreto a un servidor comercial concreto, puesto que se calcula para toda la actividad de la red, incluyendo la actividad sistémica y la actividad de fondo.

    La propiedad TERMINAL_RETRANSMISSION ha sido añadida a la lista ENUM_TERMINAL_INFO_DOUBLE, para obtenerla, hay que utilizar la función TerminalInfoDouble.
  12. Optimizado el trabajo con la historia comercial.
  13. Signals: Corregida la sustitución del tipo de ejecución de la orden según el resto (filling) al darse el cierre forzoso de las posiciones abiertas según la señal. En los ajustes de copiado de señales se contempla la opción "Stop, si la cuenta está por debajo de XXX USD": si el nivel de equidad en la cuenta cae por debajo de lo especificado, entonces el copiado de señales comerciales se detiene automáticamente, y todas las posiciones se cierran de manera forzosa. Anteriormente, al darse el cierre forzoso de las posiciones, en ciertos casos para las órdenes de cierre no se indicaba correctamente el tipo de relleno. Ahora, el terminal comprueba los tipos de relleno permitidos en los ajustes del símbolo e indica en las órdenes la variante permitida.

Tester

  1. El comportamiento de la función HistoryOrderSelect en el simulador de estrategias se ha adaptado de acuerdo con el terminal de cliente.
  2. El comportamiento de las funciones CopyTicks y CopyTicksRange en el simulador de estrategias se ha adaptado de acuerdo con el terminal de cliente.
  3. Optimizada la representación de los objetos gráficos al realizar la simulación en el modo visual.
  4. Corregida la muestra de los resultados de la simulación de los instrumentos bursátiles (con el modelo bursátil de gestión de riesgos). Ahora en el gráfico se representan solo los recursos (equidad), no se representan el balance y la carga sobre el depósito. El estado comercial de estas cuentas se valora según el nivel de los recursos. En sí, el balance solo muestra el propio dinero en la cuenta y no tiene en cuenta los activos y las obligaciones del tráder. La carga sobre el depósito (margin/equity) no se muestra, ya que el margen en el cálculo bursátil constituye el precio actual del activo/obligación teniendo en cuenta el descuento, y suele cambiar junto con la equidad.

  • Añadida la traducción de la interfaz de usuario al holandés.
  • Actualización de la documentación.


23 agosto 2017
MetaTrader 5 iOS build 1649: estadísticas de mercado sobre instrumentos

Añadida la posibilidad de visualizar las estadísticas de mercado de los instrumentos financieros cuyo comercio se está realizando en el modo de ejecución bursátil. Para ello, es necesario llamar desde Market Watch el menú del símbolo que le interese y desplegar sus estadísticas.


Optimizado el trabajo con las posiciones en la pestaña "Comercio". Ahora, al dar un toque sobre la celda de una posición/orden, se mostrará una imagen detallada de la misma y las posibles variantes de acción: cerrar, modificar o incrementar la posición, y también abrir el gráfico del símbolo del cual está abierta la posición.

2 agosto 2017
MetaTrader 5 Android build 1642: Solicitud simplificada de apertura de cuentas reales

En MetaTrader 5 Android se ha añadido la posibilidad de abrir rápidamente cuentas preliminares (preliminary) con un bróker. Para ello, usted deberá elegir el punto del menú "Abrir una cuenta real" e indicar en la lista de brókeres el suyo. A continuación, solo le quedará adjuntar a la solicitud un documento que certifique se identidad y un extracto bancario. Su solicitud de apertura de una cuenta real se enviará de inmediato al bróker, que en caso necesario le pedirá a usted información adicional.


21 julio 2017
MetaTrader 5 build 1640: Creación y simulación de instrumentos financieros propios

Terminal

  1. Añadida la posibilidad de crear instrumentos financieros propios. Ahora usted podrá crear cualquier instrumento, establecer los ajustes necesarios para él, importar al mismo sus datos de precio y visualizar gráficos sobre dicho instrumento.

    Crando un símbolo personalizado
    Abra la ventana de gestión de símbolos a través del menú contextual "Observación del mercado" y pulse "Crear un símbolo":


    Hay multitud de parámetros disponibles para el ajuste. Podrá ver la lista de dichos parámetros en la documentación. Usted tendrá la posibilidad de ajustar su propio instrumento: copie los parámetros de cualquier instrumento semejante y después cambie lo que necesite. Para ello, elija el instrumento del que ya disponga en el campo "Copiar desde".
    El nombre del símbolo personalizado no deberá coincidir con los nombres de los símbolos retransmitidos por los brókeres. Si usted se conecta al servidor y en este resulta haber un símbolo que coincide con el símbolo personalizado, el símbolo personalizado será eliminado.
    Aquí mismo están los comandos de importación y exportación de los ajustes. Podrá compartir fácilmente símbolos personalizados o transferirlos entre sus terminales. Los ajustes se exportan a archivos de texto del formato JSON.

    Gestión de los símbolos personalizados
    Todos los símbolos se representan en el grupo aparte Custom. Para modificar o eliminar un símbolo, use el menú contextual en la lista:



    Importando la historia de precios
    Usted podrá importar los datos de precio a un símbolo propio desde cualquier archivo de texto. Elija el símbolo y pase a continuación a la pestaña "Barras".


    En el diálogo de importación, indique la ruta al archivo con los datos y establezca la configuración:

    • Separador — elemento separador en un archivo de texto.
    • Omitir columnas y líneas — número de columnas (de izquierda a derecha) y líneas (de arriba a abajo) que se pueden omitir al realizar la importación.
    • Desplazamiento — desplazamiento temporal por horas. Esta opción se usa al importar los datos guardados en otro huso horario.
    • Usar solo las seleccionadas — esta opción permite importar solo las líneas seleccionadas en la ventana de visualización. Las líneas se pueden destacar con la ayuda del ratón, manteniendo las teclas "Ctrl" o "Shift".

    El archivo con las barras debe tener el formato: Fecha Hora Open High Low Close VolumendeTicks Spread. Ejemplo:
    2016.06.27    00:01:00    1.10024    1.10136    1.10024    1.10070    18    54000000    44
    2016.06.27    00:02:00    1.10070    1.10165    1.10070    1.10165    32    55575000    46
    2016.06.27    00:03:00    1.10166    1.10166    1.10136    1.10163    13    13000000    46
    2016.06.27    00:04:00    1.10163    1.10204    1.10155    1.10160    23    51000000    41
    Para su propio símbolo usted podrá usar los datos de cualquier otro instrumento existente. Expórtelos (esta posibilidad se añadió en la anterior versión de la plataforma), y en caso necesario, modifíquelos e impórtelos de vuelta.
    En MetaTrader 5 la historia de precio se guarda en forma de barras de minuto. El resto de los marcos temporales se crea sobre su base. Al realizar la importación, usted podrá usar los datos de marcos temporales mayores, pero hay que tener en cuenta que los gráficos de los marcos temporales menores, en este caso, tendrán huecos. Por ejemplo, al importar los datos de horas, en el gráfico de minutos usted podrá ver una barra cada hora.
    Los datos de precio de los símbolos de usuario se guardan en el catálogo aparte Custom (fuera de los catálogos de servidores comerciales concretos):
    C:\Users\[windows account]\AppData\Roaming\MetaQuotes\Terminal\[instance id]\bases\Custom

    Usando símbolos propios
    El uso de símbolos propios prácticamente no se diferencia del uso de aquellos que ofrece el bróker. Estos también se muestran en la ventana de "Observación de mercado", es posible abrir gráficos de ellos, y después colocar indicadores y objetos analíticos sobre los mismos. Además, en este caso, no es posible comerciar con los símbolos personalizados.

    Simulación de estrategias usando símbolos propios
    Los símbolos propios creados se pueden utilizar para poner a prueba los robots comerciales y los indicadores en el simulador de estrategias. Esto permite optimizar las estrategias incluso para los instrumentos financieros que el bróker no tiene disponibles en este momento. Basta con importar correctamente la historia y configurar las propiedades del símbolo personalizado.


    Al calcular el margen y el beneficio, el simulador de estrategias usa automáticamente los cursos cruzados disponibles. Por ejemplo, hemos creado un símbolo AUDCAD.custom propio con un tipo de cálculo del margen Fórex, y la divisa de nuestro depósito es USD. Entonces, basándose en el nombre del instrumento fórex, el simulador busca los símbolos necesarios en el siguiente orden:
    1.     primero se buscan los símbolos AUDUSD.custom (para el cálculo del margen) y USDCAD.custom (para el cálculo del beneficio de las transacciones)
    2.     a continuación, si alguno de dichos instrumentos no está presente, se busca el primer símbolo cuyo nombre se corresponda con las parejas de divisas necesarias, es decir, AUDUSD y USDCAD, respectivamente. Por ejemplo, se han encontrado AUDUSD.b y NZDUSD.b, esto significa que los cursos de estos instrumentos se usarán al calcular el margen y el beneficio.

    Los instrumentos con los demás tipos de cálculo de margen (CFD, Futures, Stock Exchange) precisan de una pareja de divisas para convertir la divisa del instrumento en la divisa del depósito. Por ejemplo, hemos creado nuestro propio símbolo con una divisa de beneficio y una divisa de margen expresadas en libras esterlinas (GBP), mientras que la divisa del depósito es el franco suizo (CHF). Entonces, la búsqueda de instrumentos para la simulación se realizará en el siguiente orden:
    1. Se comprueba la presencia del instrumento financiero que corresponde a la pareja GBPCHF (GBP vs CHF).
    2. Si no existe tal instrumento, entonces se busca el primer instrumento financiero cuyo nombre se corresponda con la pareja de divisas, por ejemplo, GBPCHF.b o GBPCHF.def.

    Al realizar simulaciones con sus propios instrumentos, asegúrese de que en la cuenta están disponibles todas las parejas de divisas necesarias para los cálculos. De lo contrario, el cálculo de los resultados financieros y de las exigencias de depósito durante la simulación no serán posibles.

    Más posibilidades en las siguientes versiones de la plataforma
    El trabajo con los propios instrumentos aún no ha finalizado, en las próximas versiones de la plataforma aparecerán nuevas funciones. Usted podrá importar la historia a los símbolos personalizados directamente desde los expertos, así como retransmitir datos sobre ellos (añadir cotizaciones) en tiempo real.

  2. Añadido el filtrado de la banda de transacciones según el volumen.

    Es posible ocultar de la banda las transacciones con un volumen menor al indicado. De esta forma, en la banda permanecerán solo las transacciones importantes, que influyen en el mercado.

    Pulse dos veces sobre la primera línea de la banda de transacciones, indique el volumen mínimo en lotes, y a continuación pulse sobre cualquier otra zona de la pantalla. Las transacciones serán filtradas, y el valor actual del filtro aparecerá en el encabezamiento de la columna de volumen.


    También es posible indicar el volumen mínimo a través del menú contextual de la banda de transacciones.

  3. Añadida la posibilidad de vincular la profundidad de mercado al gráfico activo. Cada vez que usted pase a la visualización del gráfico de algún instrumento financiero, en la profundidad de mercado se activará de forma automática exactamente el mismo instrumento. No tendrá que abrir aparte la profundidad de mercado para cada símbolo.



  4. Corregida la actualización de los paneles de instrumentos después de ocultar y desplegar la ventana del terminal.
  5. Corregida la formación de la historia comercial de las posiciones al cruzarse los tickets de las transacciones y las posiciones.

MQL5

  1. Añadida la posibilidad de perfilado de programas MQL5 sobre la historia de precios. Esto permitirá comprobar rápidamente la productividad de los programas sin tener que esperar nuevos tickets.

    Al perfilar con datos reales, el programa se inicia en el gráfico habitual en el terminal. Muchos programas, en especial los indicadores, ejecutan ciertos cálculos solo con la llegada de un nuevo tick (OnTick, OnCalculate). De esta forma, para valorar la productividad debemos esperar la llegada de nuevos ticks en tiempo real. Al realizar la simulación con datos históricos, usted podrá indicar de inmediato la carga para el programa. El perfilado se inicia en el simulador de estrategias en el modo visual, después usted recibirá inmediatamente multitud de eventos de llegada de un nuevo tick.



  2. Añadido el soporte de Unión (union). Se trata de un tipo especial de datos que consta de varias variables que comparten una misma zona de la memoria. Por consiguiente, la unión proporciona la posibilidad de interpretar una misma secuencia de bits con dos (o más) métodos diferentes. La declaración de una unión comienza con la palabre clave union.
    union LongDouble
    {
      long   long_value;
      double double_value;
    };
    A diferencia de la estructura, los diferentes miembros de una unión se relacionan con una misma zona de la memoria. En este ejemplo se ha declarado la unión LongDouble, en la que el valor del tipo long y el valor del tipo double comparten la misma zona de la memoria. Es importante comprender que no es posible hacer que la unión guarde al mismo tiempo valores de tipo entero long y reales double (como sucedía en la estructura), puesto que las variables long_value y double_value se solapan (en la memoria) una sobre otra. Sin embargo, un programa MQL5 puede en cualquier momento procesar la información que se contiene en esta unión como un valor entero (long) o como uno real (double). Por consiguiente, la unión permite obtener dos (o más) variantes de representación de una misma secuencia de datos.

    Al declarar una unión, el compilador delimita automáticamente una parte de la memoria que sea suficiente para guardar en una unión las variables del tipo de volumen más grande. Para acceder a un elemento de la unión, se usa la misma sintaxis que para las estructuras: el operador "punto".
    union LongDouble
    {
      long   long_value;
      double double_value;
    };
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
    //---
       LongDouble lb;
    //--- obtenemos el número no válido -nan(ind) y lo mostramos
       lb.double_value=MathArcsin(2.0);
       printf("1.  double=%f                integer=%I64X",lb.double_value,lb.long_value);
    //--- valor mayor normalizado (DBL_MAX)
       lb.long_value=0x7FEFFFFFFFFFFFFF;
       printf("2.  double=%.16e  integer=%I64X",lb.double_value,lb.long_value);
    //--- menor positivo normalizado (DBL_MIN)
       lb.long_value=0x0010000000000000;    
       printf("3.  double=%.16e  integer=%.16I64X",lb.double_value,lb.long_value);
      }
    /*  Resultado de la ejecución
        1.  double=-nan(ind)                integer=FFF8000000000000
        2.  double=1.7976931348623157e+308  integer=7FEFFFFFFFFFFFFF
        3.  double=2.2250738585072014e-308  integer=0010000000000000
    */

  3. Añadida la generación automática del operador implícito de copiado para los objetos de estructuras y clases. Ahora el compilador crea de forma automática operadores de copadio, lo que permite escribir para los objetos las entradas sencillas del tipo b=a:
    class Foo
      {
       int               value;
    public:
       string Description(void){return IntegerToString(value);};
       //--- constructor por defecto
                         Foo(void){value=-1;};
       //--- constructor con parámetros   
                         Foo(int v){value=v;};
      };
    //+------------------------------------------------------------------+
    //|  estructura que contiene el objeto del tipo Foo                          |
    //+------------------------------------------------------------------+
    struct MyStruct
      {
       string            s;
       Foo               foo;
      };
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
    //---
       MyStruct a,b;
       Foo an_foo(5);
       a.s="test";
       a.foo=an_foo;
       Print("a.s=",a.s," a.foo.Description()=",a.foo.Description());
       Print("b.s=",b.s," b.foo.Description()=",b.foo.Description());
    //---
       Print("b=a");
       b=a;
    //---
       Print("a.s=",a.s," a.foo.Description()=",a.foo.Description());
       Print("b.s=",b.s," b.foo.Description()=",b.foo.Description());
    /*
       Resultado de la ejecución;
       a.s=test a.foo.Description()=5
       b.s= b.foo.Description()=-1
       b=a
       a.s=test a.foo.Description()=5
       b.s=test b.foo.Description()=5
    */
      }
    En el operador implícito se realiza el copiado por miembros de los objetos.

    • Si el miembro es un objeto, se llama al operador de copiado correspondiente para este objeto.
    • Si el miembro es una matriz de objetos, entonces, antes de llamar el operador de copiado correspondiente para cada elemento, la matriz receptora aumenta o disminuye hasta el tamaño necesario a través de ArrayResize.
    • Si el miembro es una matriz de tipos simples, para copiar se usa la función ArrayCopy.
    • Si el miembro es un puntero a un objeto, se copia el propio puntero, y no el objeto al que señala.

    En caso necesario, podemos redefinir el comportamiento, y en lugar de un operador implícito de copiado, crear nuestra propia variedad con la ayuda de la sobrecarga.

  4. Optimizada la utilización de la memoria al recurrir a la historia de precios desde los expertos con la ayuda de funciones Copy*. Al trabajar con grandes volúmenes de datos, el uso de la memoria se reducirá varias veces.

  5. Ahora la función TimeToStruct retorna un valor booleano, permitiendo comprobar el éxito de la conversión de datetime a MqlDateTime.
  6. Añadida la prohibición del uso de las funciones FileWriteStruct y FileReadStruct para las estructuras que contengan líneas, matrices dinámicas, objetos y punteros.
  7. Añadidos los códigos de respuesta:

    • TRADE_RETCODE_REJECT_CANCEL — la solicitud de activación de una orden pendiente ha sido rechezada, y la propia orden ha sido cancelada
    • TRADE_RETCODE_LONG_ONLY — la solicitud ha sido rechazada, puesto que en el símbolo se ha establecido la norma "Solo se permiten posiciones largas"
    • TRADE_RETCODE_SHORT_ONLY — la solicitud ha sido rechazada, puesto que en el símbolo se ha establecido la norma "Solo se permiten posiciones cortas"
    • TRADE_RETCODE_CLOSE_ONLY — la solicitud ha sido rechazada, puesto que en el símbolo se ha establecido la norma "Solo se permite cerrar las posiciones existentes"

  8. Añadido un nuevo valor, devuelto por la función SymbolInfoInteger con el parámetro SYMBOL_ORDER_MODE. SYMBOL_ORDER_CLOSEBY — bandera sobre la posibilidad de colocar órdenes de cierre de posición con una opuesta (Close By).
  9. A la enumeración ENUM_SYMBOL_INFO_INTEGER se ha añadido la propiedad boleana SYMBOL_CUSTOM. Permite saber si el símbolo es un símbolo personalizado. Para obtener la propiedad, use la función SymbolInfoInteger.
  10. Ahora es posible averiguar el motivo de la creación de una orden, transacción y posición.

    Nuevas propiedades


    Motivos de la creación de una orden, transacción y posición
    Para averiguar los motivos de la creación de las operaciones comerciales se han añadido tres enumeraciones:

    ENUM_POSITION_REASON ENUM_DEAL_REASON ENUM_ORDER_REASON Descripción de las causas
    POSITION_REASON_CLIENT DEAL_REASON_CLIENT ORDER_REASON_CLIENT La operación se ha ejecutado como resultado de la activación de una orden colocada desde el terminal de escritorio
    POSITION_REASON_MOBILE DEAL_REASON_MOBILE ORDER_REASON_MOBILE La operación se ha ejecutado como resultado de una orden colocada desde el terminal móvil
    POSITION_REASON_WEB DEAL_REASON_WEB ORDER_REASON_WEB La operación se ha ejecutado como resultado de la activación de una orden colocada desde la plataforma web
    POSITION_REASON_EXPERT DEAL_REASON_EXPERT ORDER_REASON_EXPERT La operación se ha ejecutado como resultado de la activación de una orden colocada desde un programa MQL5: un asesor o script
    - DEAL_REASON_SL ORDER_REASON_SL La operación se ha ejecutado como resultado de la activación de un Stop Loss
    - DEAL_REASON_TP ORDER_REASON_TP La operación se ha ejecutado como resultado de la activación de un Take Profit
    - DEAL_REASON_SO ORDER_REASON_SO La operación se ha ejecutado como resultado del evento Stop Out
    - DEAL_REASON_ROLLOVER - La transacción se ha ejecutado a causa del traslado de una posición
    - DEAL_REASON_VMARGIN - La transacción se ha ejecutado después de abonarse/retirarse el margen de variación
    - DEAL_REASON_SPLIT - La transacción se ha ejecutado a causa del fraccionamiento (reducción del precio) de una acción u otro activo que tenía una posición abierta en el momento del anuncio del fraccionamiento

  11. Optimizada la sincronización y el acceso a la historia de ticks.
  12. Corregido el retorno de ticks a la matriz estática en la función CopyTicksRange. En este caso, antes simepre se retornaban 0 ticks.
  13. Introducidas diferentes correcciones en la biblioteca de lógica difusa Fuzzy.

Signals

  1. Corregida la apertura de una señal desde la página web cuando no hay conexión con la cuenta comercial.

Tester

  1. Se ha optimizado y acelerado considerablemente el funcionamiento de la historia de órdenes y transacciones. Al trabajar con un gran volumen de datos (decenas de miles de entradas en la historia y más), la velocidad del funcionamiento aumenta varias veces.
  2. Corregido el cálculo del tiempo de mantenimiento de la posición en el informe de simulación.

MetaEditor

  1. En el depurador se ha corregido la representación del contenido de las matrices-miembros estáticas de la clase.
  2. Añadida la lista de puntos de interrupción en el programa depurado. Para pasar a ella, use el menú contextual de la pestaña "Depuración":


    Para pasar a cualquiera de los puntos, pulse dos veces sobre él.
Actualización de la documentación.


8 junio 2017
MetaTrader 5 iOS build 1605: apertura de una cuenta preliminar con un bróker

En MetaTrader 5 iOS se ha añadido la posibilidad de abrir rápidamente cuentas preliminares (preliminary) con un bróker. Ahora es suficiente con elegir el punto del menú "Abrir una cuenta real" e indicar su servidor en la lista de servidores. Después de rellenar los datos personales, solo queda adjuntar dos documentos que acrediten su identidad y su dirección, y enviar la solicitud de registro. De esta forma, el bróker podrá abrirle una cuenta real, pidiéndole información adicional en el caso necesario.


En el build 1605 de MetaTrader 5 iOS también se ha optimizado y rediseñado el correo:

  • ahora los correos relacionados están unidos en una misma cadena y se muestran en un solo punto
  • también está disponible la vista previa de los archivos adjuntos
  • al enviar un nuevo correo es posible añadir hasta 5 documentos adjuntos (el tamaño del archivo no debe superar los 8 Mb).
26 abril 2017
MetaTrader 5 build 1596: acceso a la historia de precios

Terminal

  1. Añadido el acceso a la historia de barras y a la historia de ticks. Ahora es posible solicitar la historia de minutos o de ticks desde el servidor no solo a través de MQL5, sino también a través de la plataforma comercial. El acceso a los datos de los precios se amplía dentro del proceso de preparación para el lanzamiento de las funciones fuente de datos personalizados. Próximamente en la plataforma existirá la posibilidad de construir gráficos usando datos de precio propios, crear símbolos sintéticos y usar gráficos offline.

    Para descargar los datos, abra el menú de gestión de símbolos de la "Observación del mercado":


    Ahora en él estarán disponibles las pestañas: "Barras" y "Ticks". Elija el símbolo, el rango temporal y pulse "Solicitar". La plataforma solicitará todos los datos del servidor o los representará al instante, si ya han sido descargados. Los datos de precio guardados se pueden exportar a un archivo CSV.

  2. Añadida la muestra del tiempo con una precisión de milisegundos para las posiciones, transacciones y órdenes.



  3. En la ventana de comercio se ha corregido la notificación sobre la negativa a ejecutar la solicitud de cierre de una posición mediante una posición opuesta.

MQL5

  1. Corregido el funcionamiento de la función PositionSelect. En algunos casos no se seleccionaba la posición con el ticket menor.
  2. Corregido el funcionamiento de las funciones CopyTicks y CopyTicksRange al solicitar la historia de ticks a una gran profundidad.

Signals

  1. Corregido el error de copiado de señales al aumentar el tamaño de una posición ya existente. El error surgía en algunos casos en las cuentas con compensación.

Tester

  1. Corregido el procesamiento de las órdenes límite para los instrumentos bursátiles. Las órdenes colocadas mejor que las del mercado (con el precio de compra por debajo del precio del mercado, o con el precio de venta por encima del precio de mercado) se ejecutan sin deslizamiento. Las órdenes colocadas peor que las del mercado o la mismo nivel, se ejecutan justo después de colocarlas, al precio del mercado en ese momento.

Actualización de la documentación.

8 abril 2017
MetaTrader 5 Android build 1576: añadidas las posiciones a la historia comercial

Se ha añadido a MetaTrader 5 Android la representación de la historia comercial en forma de posiciones. Anteriormente, en la pestaña "Historia" se representaban solo las transacciones y órdenes de la historia, ahora es posible utilizar las posiciones para el análisis comercial. Para ello, todas las transacciones relacionadas con una posición se agrupan en un solo registro, donde se podrá ver:

  • La hora de apertura y cierre de la posición (definidas por la primera y última operación)
  • El volumen de la posición (si la posición está parcialmente cerrada, se muestra el volumen cerrado y el volumen original)
  • Los precios medios ponderados de apertura y cierre de la posición
  • El resultado financiero total de todas las transacciones relacionadas con la posición

30 marzo 2017
MetaTrader 5 iOS build 1547: historia comercial en forma de posiciones

Añadida la presentación de la historia comercial en forma de posiciones. Anteriormente, en la pestaña "Historia" se exhibían operaciones y órdenes, ahora en esta también se muestran las posiciones. La plataforma comercial reúne los datos de las operaciones relacionadas con una posición, y luego agrupa dichos datos en una única entrada. En esta entrada podrá ver:

  • La hora de apertura y cierre de la posición, definidas por la primera y última operación.
  • El volumen de la posición; si la posición está parcialmente cerrada, se muestra el volumen cerrado y el volumen original
  • El precio de apertura medio ponderado y el precio de cierre de la posición
  • El resultado financiero total de las transacciones relacionadas con la posición

24 marzo 2017
MetaTrader 5 build 1570: escaparate del Mercado mejorado y funciones de plantilla ampliadas en MQL5

Terminal

  1. Actualizado el escaparate de la tienda de aplicaciones MetaTrader Market. Elegir robots comerciales e indicadores técnicos es ahora más fácil. Hemos actualizado el diseño, y también hemos aumentado la selección de productos:

    • En la página principal ahora se muestran los expertos e indicadores más buscados, las novedades del Mercado, así como las aplicaciones gratuitas más populares.
    • En los apartados de los expertos, indicadores y utilidades han aparecido nuevas subcategorías: robots de cuadrícula y robots de cobertura, indicadores de tendencia y multivisa y mucho más.




  2. Se ha corregido la actualización del terminal de cliente y el funcionamiento de las compras incorporadas en el Mercado, las Señales y el Hosting virtual al usar las cuentas de usuario de Windows con privilegios limitados.
  3. Corregido el error que causaba en ocasiones la clasificación defectuosa de la historia de posiciones.
  4. Optimizada la representación de la pestaña "Activos".

MQL5

  1. Añadido el soporte de la sobrecarga de funciones de plantilla según el parámetro. Por ejemplo, hay una función de plantilla que graba en el primer parámetro el valor del segundo parámetro con la ayuda de una conversión explícita de códigos. En el lenguaje MQL5 está prohibida la conversión del tipo string al tipo bool, pero podemos hacer esto por nosotros mismos. Creamos la sobrecarga de la función de plantilla:
    //+------------------------------------------------------------------+
    //| Función de plantilla                                             |
    //+------------------------------------------------------------------+
    template<typename T1,typename T2>
    string Assign(T1 &var1,T2 var2)
      {
       var1=(T1)var2;
       return(__FUNCSIG__);
      }
    //+------------------------------------------------------------------+
    //| Sobrecarga especial para el caso bool+string                     |
    //+------------------------------------------------------------------+
    string Assign(bool &var1,string var2)
      {
       var1=(StringCompare(var2,"true",false) || StringToInteger(var2)!=0);
       return(__FUNCSIG__);
      }
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       int i;
       bool b;
       Print(Assign(i,"test"));
       Print(Assign(b,"test"));
      }
    Como resultado de la ejecución de este código, veremos que para la pareja int+string se ha usado la función de plantilla Assign(), y en la segunda llamada bool+string ya se ha usado la función sobrecargada.
    string Assign<int,string>(int&,string)
    string Assign(bool&,string)

  2. Añadida la posibilidad de especialización explícita de las funciones de plantilla. Para ello, antes de la lista con los parámetros de llamada es necesario indicar los parámetros de tipado:
    template<typename T>
    T Func() { return (T)0; }
      
      
    void OnInit()
      {
       Func<double>();   // especialización explícita de la función de plantilla
      }
    De esta forma, la especialización tiene lugar no a través de los parámetros de llamada, sino mediante la indicación directa de los tipos.

  3. Optimizada la representación de los indicadores de usuario con el tipo de dibujado DRAW_ZIGZAG.
  4. A la enumeración de los tipos de operaciones ENUM_DEAL_TYPE se han añadido nuevos valores:

    • DEAL_DIVIDEND — operación con dividendos.
    • DEAL_DIVIDEND_FRANKED — operación con dividendos franqueados (no tributables, la compañía paga el impuesto por el cliente).
    • DEAL_TAX — operación de carga impositiva.

  5. Corregida la representación de los indicadores de usuario con el tipo de dibujado DRAW_FILLING. Ahora, cuando las coordenadas de la línea superior e inferior coinciden, se dibuja una línea delgada.
  6. Corregido el cálculo de las coordenadas del objeto "Etiqueta gráfica" (Bitmap Label) al establecer el parámetro CHART_SHOW en el estado false. Este parámetro se define con la ayuda de la función ChartSetInteger y permite ocultar todos los elementos del gráfico de precio para crear una interfaz de programa propia.
  7. Corregido el error de recodificación de las imágenes de 24 bits al colocarlas en los recursos de la aplicación MQL5.
  8. Corregido el error de impresión de estructuras con la función ArrayPrint.
  9. Actualizadas las bibliotecas estándar MQL5.

MetaEditor

  1. Añadida la traducción de la interfaz de usuario al malayo.

Signals

  1. Corregida la apertura de la página de la señal en el terminal al pasar desde la página MQL5.community, en caso de que no exista conexión en la cuenta comercial.

Tester

  1. Corregidos los errores al trabajar con la función CopyTicks en el simulador de estrategias.
  2. Corregida la clasificación de operaciones del tipo "Retirada" (Withdrawal) al formar el informe de simulación.
  3. Corregida la modificación de órdenes pendientes.

Hosting

  1. Corregida la representación del wizard del hosting virtual en las pantallas de resolución ultra alta (4K).

Actualización de la documentación.

17 febrero 2017
MetaTrader 5 build 1545: cambio rápido entre ventanas y modificación de los precios con el ratón

Terminal

  1. Añadido el cambio rápido entre las ventanas "Herramientas" y "Simulador de Estrategias".



  2. Añadida la posibilidad de modificar los precios y volúmenes con la ayuda de la ruleta del ratón:



  3. Ahora al pasar a la descarga de los terminales móviles, se almacenará la lista con sus servidores comerciales. Después de instalar MetaTrader 5 para iPhone o Android en un dispositivo móvil, se le mostrará de inmediato una lista ya preparada con los servidores comerciales. De esta forma, usted podrá conectar las cuentas comerciales existentes. El servidor de la cuenta conectada actualmente se mostrará en el terminal móvil en primer lugar.



  4. Se ha reducido la carga sobre el terminal creada por los gráficos y objetos invisibles (minimizados).
  5. Corregido el error que causaba en ocasiones la activación incorrecta de los trailing-stops.
  6. Corregido el error de filtrado de transacciones según el símbolo en la historia comercial de la cuenta.
  7. Corregido el error de representación del campo "Tipo" en la historia de las posiciones.
  8. Corregido el error en la formación y representación de la historia comercial en forma de posiciones.

MQL5

  1. Corregida la representación de los indicadores de usuario con el tipo de dibujo DRAW_COLOR_LINE, DRAW_COLOR_ZIGZAG y DRAW_COLOR_SECTION al usar el color CLR_NONE.
  2. Corregido el error en las plantillas al realizar el tipado con el puntero constante.
  3. Corregido el control del acceso a los miembros de clase private y protected.

Tester

  • Corregida la activación de órdenes límite en los instrumentos bursátiles cuando el valor de la orden a colocar es peor que el valor propuesto por el mercado (el precio compra es superior al propuesto por el mercado o el precio de venta es inferior al propuesto por el mercado).
  • Eliminada la limitación en la simulación de indicadores de usuario con más de 64 parámetros de entrada.
  • Añadida la traducción de la interfaz de usuario al hindi.
  • Actualización de la documentación.

    9 febrero 2017
    MetaTrader 5 iOS build 1509: autorización en mql5.com a través de Facebook
    • Añadida la posibilidad de acceder o registrase en MQL5.com a través de Facebook. Si usted tiene una cuenta en esta red social, ahora con un par de clicks podrá acceder a los chats y a la gama completa de servicios para MetaTrader 5.

    • Mejoras y correcciones.
    27 enero 2017
    MetaTrader 5 build 1525: presentación de la historia en forma de posiciones y mejoras en el simulador

    Terminal

    1. Añadida la presentación de la historia comercial en forma de posiciones. El terminal recopila los datos de las transacciones relacionadas con una posición (apertura, crecimiento, cierre parcial y total) y agrupa estos datos en una única entrada, donde se puede ver:

      • La hora de apertura y cierre de la posición, definidas por la primera y la última transacción, respectivamente
      • El volumen de la posición; si la posición está parcialmente cerrada, se muestra el volumen cerrado y el volumen original
      • El precio de apertura medio ponderado y el precio de cierre de la posición
      • El resultado financiero total de las transacciones relacionadas con la posición




      Para las cuentas con cobertura, este tipo de presentación de las posiciones es casi análogo a la historia de la cuenta en MetaTrader 4.




    2.   Se ha añadido un comando para visualizar la historia de las transacciones en el gráfico de un símbolo concreto.

      • Para mostrar todas las transacciones solo del símbolo de la posición/transacción elegida, pulse "Añadir transacciones de [Nombre del símbolo]". Las transacciones se añadirán a todos los gráficos abiertos en este momento de este símbolo. Si no hay gráficos semejantes, se abrirá uno nuevo.
      • Para mostrar las transacciones de todos los símbolos de la historia de la cuenta, pulse "Añadir todas las transacciones". A todos los gráficos abiertos se añadirán todas las transacciones de los símbolos correspondientes.




    3. Añadida la muestra del nombre internacional del instrumento financiero en las especificaciones del contrato, así como la posibilidad de buscar sobre el mismo en la ventana de gestión de instrumentos.




    4. Añadida la posibilidad de establecer rápidamente la resolución de la ventana del terminal. La función es cómoda para aquellos que realizan vídeos. En el menú están disponibles las resoluciones más populares para la publicación en servicios de vídeo como YouTube.



    5. las plantillas y perfiles de los gráficos se han trasladado desde [catálogo de datos del terminal\Profiles] a [catálogo de datos del terminal\MQL5\Profiles]. Ahora resulta muy sencillo añadir plantillas al repositorio MQL5 Storage y usarlas desde cualquier computadora que tenga.

    MQL5

    1. Añadido el soporte de variables de recurso. El uso de estas variables puede facilitar significativamente la escritura de algunos programas. Por ejemplo, podrá escribir el código OpenCL en un archivo CL aparte, y después incluir este archivo en forma de línea en los recursos de su programa MQL5. Antes, en lugar de esto, había que describir el código como una gran variable de línea.

      Declaración de la variable de recurso
      #resource ruta_al_archivo_del_recurso as tipo_de_variable_de_recurso nombre_de_la_variable_de_recurso

      Particularidades
      • Para los archivos de línea se define la codificación de forma automática mediante BOM (encabezamiento). Si no hay BOM, la codificación se determina por el contenido del archivo. Tienen soporte las codificaciones ANSI, UTF-8 y UTF-16. Todas las líneas se transforman en Unicode.
      • Solo podemos recurrir a los datos de este recurso a través de una variable. El direccionamiento automático a través de "::<resource name>" no funciona.
      • El tipo especial de variable de recurso bitmap indica al compilador que el recurso es una imagen gráfica. La variable de recurso en este caso recibe el tipo uint.
      • Al usar una imagen de 24 bits, para todos sus píxeles del componente del canal alfa se establece en el valor 255.
      • Al usar una imagen de 32 bits sin canal alfa, para todos sus píxeles del componente del canal alfa también se establece en el valor 255.
      • Al cargar una imagen de 32 bits con canal alfa, no tiene lugar ninguna manipulación con los píxeles.
      • La matriz-variable de recurso del tipo bitmap puede tener dos dimensiones. En este caso, el tamaño de la matriz se definirá como [altura_de_la_imagen][anchura_de_la_imagen].
      • En el caso de que la matriz sea unidimensional, el número de elementos se establecerá como altura_de_la_imagen*anchura_de_la_imagen.
      • Si el tamaño del archivo del recurso no es múltiplo del tamaño del elemento de la matriz, el resto de los datos se cortará. Por ejemplo, si el archivo tiene un tamaño de 14 bytes, para la matriz int el número de elementos será 3, y los 2 bytes restantes (14 - sizeof(int)*3) se descartarán.

      Ejemplos de uso
      #resource "data.bin" as int ExtData[]             // declaración de matriz de tipo numérico que contiene los datos del archivo data.bin
      #resource "data.bin" as MqlRates ExtData[]        // declaración de matriz de estructuras sencillas que contiene los datos del archivo data.bin
      
      #resource "data.txt" as string ExtCode            // declaración de línea que contiene los datos del archivo data.txt
      #resource "data.txt" as string ExtCode[]          // declaración de matriz de línea que contiene los datos del archivo data.txt
      
      #resource "image.bmp" as bitmap ExtBitmap[]       // declaración de matriz unidimensional que contiene el ráster del archivo BMP, tamaño de la matriz = height * width
      #resource "image.bmp" as bitmap ExtBitmap2[][]    // declaración de matriz bidimensional que contiene el ráster del archivo BMP, tamaño de la matriz [height][width]

    2. Añadida la propiedad CHART_SHOW para desactivar la representación del gráfico. Para obtener e instalar las propiedades se usan las funciones ChartGetInteger y ChartSetInteger.

      Si se establece false, se desactivará el dibujado de cualquier atributo del gráfico de precio y se eliminarán los márgenes en los bordes del gráfico: la escala de tiempo y precio, la barra de navegación rápida, los eventos del Calendario, los signos de las operaciones, las sugerencias de los indicadores y barras, las subventanas de los indicadores, los histogramas de volumen, etcétera.

      La desactivación del dibujado es una solución ideal para crear una interfaz de programa personalizada usando los recursos gráficos.

      Los objetos gráficos se dibujan siempre, independientemente del valor establecido en la propiedad CHART_SHOW.

    3. Añadida la propiedad CHART_KEYBOARD_CONTROL para activar/desactivar el control del gráfico con la ayuda de las teclas ("Home", "End", "PageUp", "+", "-", "Flecha arriba", etcétera). La definición  CHART_KEYBOARD_CONTROL=false permite desactivar el desplazamiento y el escalado del gráfico, pero manteniendo intacta la posibilidad de obtener los eventos de pulsación de estas teclas en OnChartEvent.

      Para obtener e instalar las propiedades se usan las funciones ChartGetInteger y ChartSetInteger.

    4. Añadidas nuevas funciones y propiedades para trabajar con OpenCL.

      Nuevas propiedades para trabajar con la memoria
      Con la ayuda de CLGetInfoIntegrer ahora es posible obtener cuatro nuevas propiedades:
      • CL_DEVICE_MAX_WORK_GROUP_SIZE — número total de grupos locales de trabajo disponibles para un dispositivo OpenCL.
      • CL_KERNEL_WORK_GROUP_SIZE — número total de grupos locales de trabajo disponibles para un programa OpenCL.
      • CL_KERNEL_LOCAL_MEM_SIZE — tamaño de la memoria local en bytes usada por un programa OpenCL para todas las tareas paralelas en el grupo. Use CL_DEVICE_LOCAL_MEM_SIZE para obtener el máximo disponible.
      • CL_KERNEL_PRIVATE_MEM_SIZE — tamaño mínimo de la memoria privada en bytes usada por cada tarea en el núcleo del programa OpenCL.

      bool CLExecutionStatus(int kernel)
      Retorna el estado de ejecución del programa OpenCL. Como parámetro se transmite el manejador del núcleo del programa OpenCL.

      bool CLSetKernelArgMemLocal(int kernel_handle,int arg_index,ulong local_mem_size)
      Define el búfer local como argumento de la función núcleo. Como parámetro se transmite el manejador del núcleo del programa OpenCL, el número del argumento openCL de la función y el tamaño del búfer.

    5. Añadido el código de respuesta TRADE_RETCODE_LIMIT_POSITIONS. El número de posiciones abiertas que podemos tener simultáneamente en la cuenta puede estar limitado por los ajustes del servidor. Al alcanzar el límite, como respuesta a la colocación de una orden, el servidor retornará el error TRADE_RETCODE_LIMIT_POSITIONS. La limitación funciona de forma diferente dependiendo del tipo de registro de posiciones en la cuenta:

      • Sistema de compensación - se registra el número de posiciones abiertas. Al alcanzar el límite, la plataforma no permite colar nuevas órdenes que den como resultado el aumento del número de posiciones abiertas. De hecho, la plataforma permite colocar órdenes solo de aquellos símbolos de los que ya existen órdenes abiertas. En el sistema de compensación, al comprobar el límite no se tienen en cuenta las órdenes pendientes actuales, puesto que su ejecución puede provocar el cambio de las posiciones actuales, pero no el aumento de su número.
      • Sistema de cobertura - aparte de las posiciones abiertas, se tienen en cuenta las órdenes pendientes colocadas, puesto que su activiación siempre causará la apertura de una nueva posición. Al alcanzar el límite, la plataforma no permitirá colocar órdenes de mercado de apertura de posiciones, así como órdenes pendientes.

    6. Corregido el error que en ocasiones provocaba la omisión de ticks en la historia de ticks.
    7. Corregido el error de tipado indirecto de plantillas.
    8. Actualizada la biblioteca de trabajo con las estadísticas matemáticas.
    9. Añadida la función TranslateKey, que retorna  un símbolo Unicode según el código virtual de una tecla, teniendo en cuenta el idioma de entrada actual y el estado de las teclas de control. La función utiliza ToUnicodeEx para transformar las teclas pulsadas por el usuario en símbolos Unicode.
      void OnChartEvent(const int id,const long& lparam,const double& dparam,const string& sparam)
        {
         if(id==CHARTEVENT_KEYDOWN)
           {
            short sym=TranslateKey((int)lparam);
            //--- si el símbolo introducido se ha transformado con éxito en Unicode
            if(sym>0)
               Print(sym,"'",ShortToString(sym),"'");
            else
               Print("Error in TranslateKey for key=",lparam);
           }
        }

    Market

    1. Market: Corregida la apertura de la página del producto al descargar la versión demo.

    Tester

    1. Después de finalizar la optimización, los resultados ahora se clasifican de forma automática en la columna "Resultado".
    2. En el menú contextual de la pestaña de resultados de optimización y el diario se ha añadido una opción para pasar a los resultados después de finalizar la optimización.
    3. El simulador de estrategias permanecerá en el modo de optimización después de iniciar una simulación única. Antes, si se iniciaba una simulación única desde la pestaña de resultados, el simulador de estrategias pasaba plenamente al modo de simulación única. Para realizar de nuevo la optimización era necesario incluirla de nuevo en los ajustes.
    4. Ahora los conjuntos de parámetros se pueden guardar no solo en forma de archivos set, sino también como ajustes del simulador de estrategias local, con fácil acceso a los mismos a través del menú contextual.




    5. Añadida la traducción de la interfaz al mongol, húngaro, rumano y urdu.

    MetaEditor

    1. Añadida la posibilidad de cambiar el orden de las expresiones observadas en la ventana de depuración. Solo tendrá que arrastrar la expresión con el ratón a la posición adecuada.




    2. Corregido el error de detección de la codificación de los archivos fuente.
    3. Corregida la búsqueda por archivos en la codificación UTF-8.
    4. Corregido el error de selección del texto con el ratón cuando hay en el mismo signos de tabulación.
    5. Añadida la traducción de la interfaz al húngaro y el rumano.

    Actualización de la documentación.



    18 enero 2017
    MetaTrader 5 Android build 1506: filtrado y clasificación de transacciones
    • En las pestañas "Comercio" e "Historia" ahora está disponible la posibilidad de clasificar por símbolos (instrumentos financieros), órdenes y hora de las operaciones comerciales. Aparte de la clasificación, en la "Historia" usted podrá también filtrar las transacciones por símbolos.

    • Se ha optimizado el trabajo con gráficos en el modo multiventana. El menú mejorado permite crear nuevas ventanas o eliminar las antiguas, cambiarlas de sitio y elegir la disposición que desee para las ventanas (vertical, horizontal o mosaico).

    9 diciembre 2016
    MetaTrader 5 build 1495: Mejoras en MQL5 para operar a nivel gráfico de forma personalizada

    MQL5

    1. Añadida la función CopyTicksRange.
    2. Se han añadido a la clase CCanvas funciones mejoradas de suavizado:
    3. Se ha añadido a la documentación la descripción de la biblioteca gráfica, con cuya ayuda se pueden construir rápidamente histogramas, distribuciones y gráficos lineales directamente en los gráficos de precio.
    4. Se han añadido a las constantes de estado del terminal de cliente identificadores de estado de las teclas de sistema. La llamada de TerminalInfoInteger(TERMINAL_KEYSTATE_XXX) retorna el mismo código de estado de una tecla que la función GetKeyState() de MSDN.
    5. Ya no se da soporte a la conversión del tipo string al tipo bool. Para comprobar las líneas de caracteres, hay que escribir la condición de forma explícita. Por ejemplo, para el siguiente código, en la nueva versión se mostrará un error de compilación:
      string str;
      ...
      if(str)                        // surgirá el error de compilación "Cannot convert type 'string' to 'bool'" (en los anteriores builds no sucedía así)
         Print("str is true");
      Debemos escribir una condición explícita:
      string str;
      ...
      
      //--- comprueba si la línea de caracteres ha sido inicializada
      if(str!=NULL)
         Print("str is true");
      
      o
      
      //--- comprueba si el valor de la línea de caracteres es "true"
      if(StringCompare(str,"true",false))
         Print("str is true");
      
      o
      
      //--- comprueba si la línea de caracteres es un número y es distinto de cero
      if((int)str!=0)
         Print("str is true");

    Correciones de crash logs.

    2 diciembre 2016
    Plataforma web MetaTrader 5: verificación en dos pasos y cambio de contraseña
    • Para aumentar la protección de las cuentas comerciales, se ha añadido la verificación en dos pasos con la ayuda de contraseñas de un solo uso. Para activar la verificación en dos pasos, utilice la aplicación móvil MetaTrader 5. Autorícese también en la ventana "Ajustes" y abra el generador One-time password (OTP). Conecte a este todas las cuentas comerciales, así conseguirá que para cada una de ellas se cree una contraseña seis cifras y de un solo uso. Introdúzcala al acceder a la plataforma web.





    • Añadida la posibilidad de cambiar la contraseña habitual y la de inversor. Use esta posibilidad para crear un identificador personal fácil de recordar.
    • En la plataforma web ahora también se pueden generar cuentas demo de forma automática. Ahora podrá entrar en MetaTrader 5 Web desde cualquier navegador y comenzar a comerciar de inmediato en Fórex, la bolsa de valores, con futuros o CFD.
    24 noviembre 2016
    MetaTrader 5 build 1485: modos adicionales de simulación y gráficos en la biblioteca estándar

    Terminal

    1. Modificado el orden de representación de las entradas en los diarios de registro del terminal y del MetaEditor. Antes, al inicio del diario se mostraban las entradas más recientes, ahora, las más antiguas. El orden inverso de clasificación hará la lectura del diario más cómoda y sencilla.



      Además, a través del menú contextual del diario ahora se pueden ocultar las columnas "Hora" y "Fuente".

    2. En la historia comercial ahora se muestra el ticket de la posición cerrada de las órdenes y operaciones de cierre de posiciones en el modo de cobertura. Esto facilitará la búsqueda de las operaciones de apertura y cierre.



    3. Corregido el error que provocaba el copiado de los nivles de SL/TP desde la posición disponible a la posición nueva del mismo instrumento. El error aparecía al usar funciones en el comercio con un click (por ejemplo, el panel en el gráfico, la ventana de Observación del mercado) en el modo de cobertura.
    4. Corregida la representación de los objetos-flechas en las pantallas de alta resolución (4К).

    MQL5

    1. Añadida la función ArrayPrint para mostrar en el diario las matrices de los tipos simples y las estructuras.
      void  ArrayPrint(
         const void&   array[],             // matriz mostrada
         uint          digits=_Digits,      // número de decimales tras la coma
         const string  separator=NULL,      // separador entre los valores de los campos de la estructura
         ulong         start=0,             // índice del primer elemento mostrado
         ulong         count=WHOLE_ARRAY,   // número de elementos mostrados
         ulong         flags=ARRAYPRINT_HEADER|ARRAYPRINT_INDEX|ARRAYPRINT_LIMIT|ARRAYPRINT_ALIGN    
         );
      ArrayPrint no muestra en el diario todos los campos de la matriz de estructuras, los campos-matrices y los campos-punteros de los objetos se omiten. Para mostrar todos los campos de esta estructura será necesaria una función propia de muestra masiva con el fotmato deseado.
      //--- muestra los valores de las 10 últimas barras
         MqlRates rates[];
         if(CopyRates(_Symbol,_Period,1,10,rates))
           {
            ArrayPrint(rates);
            Print("Comprobando\n[time]\t[open]\t[high]\t[low]\t[close]\t[tick_volume]\t[spread]\t[real_volume]");
            for(int i=0;i<10;i++)
              {
               PrintFormat("[%d]\t%s\t%G\t%G\t%G\t%G\t%G\t%G\t%I64d\t",i,
               TimeToString(rates[i].time,TIME_DATE|TIME_MINUTES|TIME_SECONDS),
               rates[i].open,rates[i].high,rates[i].low,rates[i].close,
               rates[i].tick_volume,rates[i].spread,rates[i].real_volume);
              }
           }
         else
            PrintFormat("CopyRates failed, error code=%d",GetLastError());
      //--- ejemplo de muestra
      /*
                          [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
         [0] 2016.11.09 04:00:00 1.11242 1.12314 1.11187 1.12295         18110       10   17300175000
         [1] 2016.11.09 05:00:00 1.12296 1.12825 1.11930 1.12747         17829        9   15632176000
         [2] 2016.11.09 06:00:00 1.12747 1.12991 1.12586 1.12744         13458       10    9593492000
         [3] 2016.11.09 07:00:00 1.12743 1.12763 1.11988 1.12194         15362        9   12352245000
         [4] 2016.11.09 08:00:00 1.12194 1.12262 1.11058 1.11172         16833        9   12961333000
         [5] 2016.11.09 09:00:00 1.11173 1.11348 1.10803 1.11052         15933        8   10720384000
         [6] 2016.11.09 10:00:00 1.11052 1.11065 1.10289 1.10528         11888        9    8084811000
         [7] 2016.11.09 11:00:00 1.10512 1.11041 1.10472 1.10915          7284       10    5087113000
         [8] 2016.11.09 12:00:00 1.10915 1.11079 1.10892 1.10904          8710        9    6769629000
         [9] 2016.11.09 13:00:00 1.10904 1.10913 1.10223 1.10263          8956        7    7192138000
         Comprobando
         [time] [open] [high] [low] [close] [tick_volume] [spread] [real_volume]
         [0] 2016.11.09 04:00:00 1.11242 1.12314 1.11187 1.12295 18110 10 17300175000 
         [1] 2016.11.09 05:00:00 1.12296 1.12825 1.1193 1.12747 17829 9 15632176000 
         [2] 2016.11.09 06:00:00 1.12747 1.12991 1.12586 1.12744 13458 10 9593492000 
         [3] 2016.11.09 07:00:00 1.12743 1.12763 1.11988 1.12194 15362 9 12352245000 
         [4] 2016.11.09 08:00:00 1.12194 1.12262 1.11058 1.11172 16833 9 12961333000 
         [5] 2016.11.09 09:00:00 1.11173 1.11348 1.10803 1.11052 15933 8 10720384000 
         [6] 2016.11.09 10:00:00 1.11052 1.11065 1.10289 1.10528 11888 9 8084811000 
         [7] 2016.11.09 11:00:00 1.10512 1.11041 1.10472 1.10915 7284 10 5087113000 
         [8] 2016.11.09 12:00:00 1.10915 1.11079 1.10892 1.10904 8710 9 6769629000 
         [9] 2016.11.09 13:00:00 1.10904 1.10913 1.10223 1.10263 8956 7 7192138000 
      */

    2. Corregido el error de concatenación de líneas S1=S2+S1
    3. Modificado el comportamiento de la función ArrayResize. Al transmitir el valor -1 como parámetro reserve_size, la función libera la memoria no utilizada (memoria reservada), si con ello no tiene lugar un aumento del tamaño de la matriz. El cambio de tamaño de la matriz a 0 con un valor reserve_size=-1 equivale a la llamada de ArrayFree. El nuevo comportamiento permite optimizar el uso de la memoria en los programas MQL5.
      void OnStart()
        {
         int arr[];
      //--- cuánta memoria se ha usado al inicio 
         Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB");
      //--- cuánta memoria se ha usado para la matriz con el tamaño 1, pero con reserva
         ArrayResize(arr,1,1024*1024);
         Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB");
      //--- tras aumentar la matriz, el tamaño utilizado de la memoria no ha aumentado a cuenta de la reserva
         ArrayResize(arr,1024*512,1024*1024);
         Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB");
      //--- tras disminuir la matriz, el tamaño de la memoria tampoco cambiará
         ArrayResize(arr,1);
         Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB");
      //--- la memoria no utilizada por la matriz queda libre gracias a la eliminación de la reserva
         ArrayResize(arr,1,-1);
         Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB");
        }

    4. Se han añadido a la biblioteca estándar funciones para la construcción de gráficos. Para usarlas, incluya el archivo MQL5\Include\Graphics\Graphic.mqh en su proyecto.

      Construcción de un gráfico de 3 series de datos con la ayuda de GraphPlot:
      #include <Graphics/Graphic.mqh>
      
      double Func1(double x) { return MathPow(x,2); }
      double Func2(double x) { return MathPow(x,3); }
      double Func3(double x) { return MathPow(x,4); }
      
      void OnStart()
        {
         GraphPlot(Func1,Func2,Func3,-2,2,0.05,CURVE_LINES);
        }
      
      Resultado:


      Construcción de un gráfico usando una matriz de datos con la ayuda de GraphPlot:
      #include <Math/Stat/Binomial.mqh>
      #include <Graphics/Graphic.mqh>
      
      void OnStart(void)
        {
         double    vars[101];
         double    results[101];
         const int N=2000;
      //---  
         MathSequence(0,N,20,vars);
         MathProbabilityDensityBinomial(vars,N,M_PI/10,true,results);
         ArrayPrint(results,4);
         GraphPlot(results);
      //---
        }
      Resultado:



    5. Actualizadas las funciones para trabajar con estadística matemática en la biblioteca estándar. Se ha puesto a prueba a gran escala la calidad y la precisión de todas las funciones tanto en la versión de MQL5, como en el lenguaje R fuente. Para controlar la precisión y la velocidad del funcionamiento, se distribuyen pruebas unitarias con la biblioteca estadística. Se encuentran en el catálogo \MQL5\Scripts\UnitTests\Stat.

      • TestStat.mq5 es el script principal de prueba para comprobar los resultados de los cálculos
      • TestPrecision.mq5 es el test de precisión de los cálculos
      • TestBenchmark.mq5 es el test con medición de la productividad de los cálculos

    Tester

    1. Ampliados los ajustes del retraso de ejecución de las solicitudes comerciales al realizar la simulación. Ahora es posible realizar una simulación con un robot teniendo en cuenta una variedad aún mayor de condiciones comerciales: desde un caso ideal sin retrasos, hasta considerando un retraso indicado por el usuario.


      Antes solo estaba disponible el modo de retraso aleatorio.

    2. Corregido el error de formación del volumen de ticks de las barras al simular en el modo OHLC en М1.
    3. Corregida la inscripción de la hora de apertura de las órdenes y posiciones con una precisión de hasta un milisegundo al comerciar en el modo con cobertura.
    4. Corregido el error "old tick" (el tick ha expirado), que aparecía en la simulación multidivisa o de marco temporal múltiple en el modo de ticks reales.
    5. Acelerado el funcionamiento de la función CopyTicks en el caso de que los ticks hayan sido leídos de una base localizada en el disco.

    MetaEditor

    1. Los comandos para trabajar con el repositorio de versión de los códigos fuente MQL5 Storage han sido añadidos al menú contextual del archivo en el Navegador y al panel de instrumentos.



    2. Corregido el error que rompía ocasionalmente la integridad de la base local MQL5 Storage al trabajar con más de 1024 archivos en el repositorio.
    3. Corregidos los errores de representación del árbol de archivos de MQL5 Storage.
    4. Corregida la representación un archivo tras la sustitución masiva de texto.

    Documentación actualizada.

    24 noviembre 2016
    MetaTrader 5 iOS build 1425
    • Mejorado el panel de comercio con un click en el gráfico: ahora también está disponible con orientación vertical en el smartphone, asimismo, el volumen de las operaciones se puede modificar rápidamente, elegiendo el necesario de una lista.

    • Ahora es posible cambiar el símbolo del gráfico pulsando sobre su nombre al inicio de la ventana.
    • Mejorado el apartado de ajustes de la aplicación: se ha añadido información sobre la cuenta actual, se han ordenado los apartados y se ha mejorado el diseño.
    • Multitud de mejoras y correcciones.
    14 octubre 2016
    MetaTrader 5 build 1455: Biblioteca de funciones matemáticas en MQL5

    Terminal

    1. Añadidas descripciones emergentes para los botones Buy, Sell y Close en los cuadros de diálogo comerciales. Las descripciones aclararán qué activos precisamente se comprarán o venderán al realizar esta o aquella operación, ayudando así a los tráders principiantes a comprender la esencia del proceso comercial.




    2. Añadidos pictogramas de órdenes, operaciones y posiciones en las pestañas "Comercio" e "Historia".




    3. Se ha optimizado y acelerado considerablemente (hasta 4-5 veces) la representación de la profundidad de mercado, del gráfico de ticks de la profundidad de mercado y de la banda de operaciones.
    4. Corregido el error de sincronización de la historia de ticks en el tiempo no comercial. En ciertos casos, el error provocaba un consumo excesivo de tráfico de red.

    MQL5

    1. Asimismo, se ha incluido en la biblioteca una versión MQL5 de la biblioteca de análisis numérico ALGLIB.

      Posibilidades de la biblioteca

      • Álgebra lineal
      • Resolución de sistemas de ecuaciones: lineales y no lineales
      • Interpolación
      • Optimización
      • Transformada rápida de Fourier
      • Integración numérica
      • Aproximación lineal y no lineal con el método de los mínimos cuadrados
      • Resolución de ecuaciones diferenciales ordinarias
      • Cálculo de funciones especiales
      • Estadística descriptiva y prueba de hipótesis
      • Análisis de datos: clasificación, regresión
      • Implementación de algoritmos de álgebra lineal, interpolación, etc. en aritmética de alta precisión (con uso de MPFR)

      Cómo usarlo

      los archivos de la biblioteca ALGLIB se ubican en el catálogo \MQL5\Include\Math\Alglib. Para usar las funciones, incluya el archivo principal de la biblioteca en su programa:

      #include <Math\Alglib\alglib.mqh>

    2. En la biblioteca estándar se han incluido funciones para trabajar con estadística matemática. Ahora en MQL5 están disponibles las posibilidades del lenguaje R, uno de las mejores herramientas de procesamiento y análisis estadístico de datos.

      Posibilidades de la biblioteca

      La biblioteca estadística contiene funciones para el cálculo de las características estadísticas de los datos, así como funciones para trabajar con distribuciones estadísticas:

      • Funciones para el cálculo de las características estadísticas de los elementos de la matriz
      • Funciones para trabajar con distribuciones estadísticas: distribución normal, distribución log-normal, distribución beta, etc.

      Cómo usarlo

      los archivos de la biblioteca estadística se ubican en el catálogo \MQL5\Include\Math\Stat. Para usarla, incluya el archivo con las funciones necesarias en su programa, por ejemplo:

      #include <Math\Stat\Binomal.mqh>
      #include <Math\Stat\Cauchy.mqh>
      

      Puede leer una descripción detallada de las funciones de la biblioteca en el artículo Distribuciones Estadísticas en MQL5: tomando lo mejor de R.


    3. Se ha incluido en la biblioteca estándar una versión MQL5 de la biblioteca Fuzzy, en la que se han implementado los sistemas de inferencia de lógica difusa Mamdani y Sugeno.

      Posibilidades de la biblioteca

      • 13 funciones de pertenencia.
      • Forma flexible de escritura de normas para los sistemas difusos.
      • Sistema de inferencia de lógica difusa Mamdani
      • Sistema de inferencia de lógica difusa Sugeno
      • 5 métodos de defusificación para los sistemas del tipo Mamdani
      • Cantidad ilimitada de variables de entrada y salida

      Cómo usarlo

      Los archivos de la biblioteca Fuzzy se encuentran en el catálogo \MQL5\Include\Math\Fuzzy. Para usarla, incluya el archivo con las funciones necesarias en su programa, por ejemplo:

      #include <Math\Fuzzy\mamdanifuzzysystem.mqh>
      #include <Math\Fuzzy\sugenofuzzysystem.mqh>
      

      Podrá encontrar una descripción detallada de la biblioteca en Code Base: Fuzzy - biblioteca para trabajar con lógica difusa


    4. Añadida la propiedad CHART_QUICK_NAVIGATION para activar/desactivar las barras de navegación rápida en el gráfico. Para cambiar y obtener el estado de una propiedad, use las funciones ChartSetInteger y ChartGetInteger.




      La barra se llama pulsando las teclas Enter o Space. Con la ayuda de estas, es posible desplazarse rápidamente hasta la fecha establecida en el gráfico, alternar el símbolo y el marco temporal. Si su programa MQL5 procesa la pulsación de las teclas Enter o Space, desactive la propiedad CHART_QUICK_NAVIGATION, para que el terminal no intercepte estos eventos. En este sentido, seguirá existiendo la posibilidad de llamar la barra de navegación con un doble click del ratón.

    5. Añadidas las funciones FileLoad y FileSave para facilitar la lectura y guardado de matrices en los archivos. A diferencia de FileRead* y FileWrite*, estas funciones no necesitan manejador de archivo. FileLoad y FileSave trabajan con matrices de tipos numéricos, así como con estructuras sencillas que no tengan líneas de caracteres, matrices dinámicas u objetos de clase.
      long  FileLoad(
         const string filename,      // [in] nombre del archivo
         void         &buffer[],     // [out] matriz para la lectura
         uint         common_flag=0  // [in] 0 - búsqueda de un archivo en la carpeta Files del terminal, FILE_COMMON - en la carpeta común de los terminales
         );
      
      bool  FileSave(
         const string filename,      // [in] nombre del archivo
         const void   &buffer[],     // [in] matriz para el almacenamiento
         uint         common_flag=0  // [in] 0 - creación de un archivo en la carpeta Files del terminal, FILE_COMMON - en la carpeta común de los terminales
         );
      Ejemplo de cómo grabar una matriz de ticks y leerla enseguida:
      //--- parámetros de entrada
      input int      ticks_to_save=1000; // número de ticks
      //+------------------------------------------------------------------+
      //| Script program start function                                    |
      //+------------------------------------------------------------------+
      void OnStart()
        {
         string  filename=_Symbol+"_ticks.bin";
         MqlTick ticks[];
      //---
         int copied=CopyTicks(_Symbol,ticks,COPY_TICKS_ALL,0,ticks_to_save);
         if(copied!=-1)
           {
            PrintFormat(" CopyTicks(%s) copied %d ticks",_Symbol,copied);
            //--- si la historia de ticks está sicronizada, el código de error será igual a cero
            if(!GetLastError()==0)
               PrintFormat("%s: Ticks are not synchronized. Error=",_Symbol,copied,_LastError);
            //---  escribimos los ticks en el archivo
            if(!FileSave(filename,ticks,FILE_COMMON))
               PrintFormat("FileSave() failed, error=%d",GetLastError());
           }
         else
            PrintFormat("Failed CopyTicks(%s), Error=",_Symbol,GetLastError());
      //--- ahora leemos estos ticks de vuelta desde el archivo
         ArrayFree(ticks);
         long count=FileLoad(filename,ticks,FILE_COMMON);
         if(count!=-1)
           {
            Print("Time\tBid\tAsk\tLast\tVolume\tms\tflags");
            for(int i=0;i<count;i++)
              {
               PrintFormat("%s.%03I64u:\t%G\t%G\t%G\t%I64u\t0x%04x",
               TimeToString(ticks[i].time,TIME_DATE|TIME_SECONDS),ticks[i].time_msc%1000,
               ticks[i].bid,ticks[i].ask,ticks[i].last,ticks[i].volume,ticks[i].flags);
              }
           }
        }

    6. Modificada la representación del indicador de usuario con el modo de dibujado DRAW_CANDLES. Ahora para este estilo es posible indicar de uno a tres colores, dependiendo de ello, cambiará el aspecto exterior de las velas.

      Si se indica solo un color, todas las velas del gráfico se colorearán por entero de ese color.
      //--- velas iguales, pintadas de un mismo color 
      #property indicator_label1  "One color candles"
      #property indicator_type1   DRAW_CANDLES
      //--- solo se indica un color, por eso todas las velas serán solo de un color
      #property indicator_color1  clrGreen  
      Si indicamos dos colores, los contornos se dibujarán con el primer color, y el cuerpo con el segundo.
      //--- el color de las velas se diferencia del color de las sombras
      #property indicator_label1  "Two color candles"
      #property indicator_type1   DRAW_CANDLES
      //--- las sombras y el contorno de las velas en color verde, el cuerpo, en color blanco
      #property indicator_color1  clrGreen,clrWhite 
      Si se indican tres colores, el contorno de la vela se dibujará con el primer color, y el color de la vela alcista y bajista se establecerá con el segundo y el tercer color.
      //--- el color de las velas se diferencia del color de las sombras
      #property indicator_label1  "One color candles"
      #property indicator_type1   DRAW_CANDLES
      //--- las sombras y el contorno de las velas en color verde, el cuerpo de la vela alcista, en color blanco, el cuerpo de la vela bajista, de color rojo
      #property indicator_color1  clrGreen,clrWhite,clrRed
      De esta forma, con la ayuda del estilo DRAW_CANDLES se pueden crear variantes personalizadas propias del color de las velas. Asimismo, todos los colores pueden cambiarse de forma dinámica durante el proceso del trabajo con la ayuda de la función PlotIndexSetInteger(índice_de_la_construcción_DRAW_CANDLES, PLOT_LINE_COLOR, número_del_modificador, color) , donde el número_del_modificador puede tener los valores siguientes:
      • 0 – color del contorno y las sombras
      • 1– color del cuerpo de la vela alcista
      • 2 - color del cuerpo de vela bajista
      //--- establecemos el color del contorno y las sombras
      PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,clrBlue);
      //--- establecemos el color del cuerpo para la vela alcista
      PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrGreen);
      //--- establecemos el color del cuerpo para la vela bajista
      PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,clrRed);
    7. Se ha corregido una serie de errores y se ha acelerado el trabajo con la historia de ticks con la ayuda de las funciones CopyTicks.
    8. Permitido el uso de operadores en las interfaces.

    Market

    1. Corregido el error que provocaba en ciertos casos la petición reiterada de autorización en MQL5.community al realizar compras en el Mercado.

    Tester

    1. Añadida la traducción de la interfaz de usuario al griego, el malayo y el hebreo.

    Se ha actualizado la documentación.

    previa123456789101112