¿Qué novedades tiene MetaTrader 5?

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

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.

    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.



    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.
    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.

    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.

    29 septiembre 2016
    Plataforma web MetaTrader 5: optimización del código y nuevas posibilidades de la interfaz
    • Añadida la posibilidad de modificar el tamaño de los bloques de la aplicación web, desde la "Observación del mercado" hasta las ventanas con los gráficos de las cotizaciones.
    • Ahora está disponible la clasificación por columnas en las pestañas "Comercio" e "Historia", en la ventana "Instrumentos". Además, la anchura de las columnas se puede cambiar.
    • En Market Watch se han añadido un instrumento de selección rápida del símbolo y la pestaña "Detalles".
    • Se ha optimizado el código para acelerar el funcionamiento general del terminal web: la inicialización de la cuenta, la selección de símbolos y el propio comercio ahora funcionan a una velocidad mayor.

    16 septiembre 2016
    MetaTrader 5 build 1430: Pestaña Exposure actualizada

    Terminal


    1. Implementado un nuevo algoritmo de formación de la pestaña "Activos" para el mercado de valores. Ahora el terminal adapta la presentación de activos dependiendo del sistema de gestión de riesgos que se use para la cuenta comercial: Retail Forex, Futures o el Modelo bursátil.

      A aquellos que comercian en Forex o con futuros en la bolsa, el apartado "Activos" les servirá para entender su posición actual en el mercado. Las mismas divisas se encuentran en multitud de instrumentos distintos: como una de las divisas integrantes de una pareja, como divisa básica, etcétera. Por ejemplo, usted puede tener posiciones opuestas de GBPUSD, USDJPY y GBPJY. En esta situación es muy problemático comprender la cantidad que tenemos de esta o aquella divisa o cuánto debemos. Todavía es más complicado cuando tenemos, no tres posiciones de ese tipo, sino más. En esta situación, el estado total de la cuenta se puede mirar fácilmente en la pestaña "Activos". Veamos un ejemplo con las tres mismas posiciones:

      Buy GBPJPY 1 lot at 134.027 — ha obtenido 100 000 GBP, ha dado 134 027 000 JPY
      Sell USDJPY 1 lot at 102.320 — ha dado 100 000 USD, ha obtenido 102 320 000 JPY
      Sell GBPUSD 1 lot at 1.30923 — ha dado 100 000 GBP, ha obtenido 103 920 USD

      Hemos comprado y vendido simultáneamente 100 000 GPB. En suma, de GBP tenemos 0, y la pestaña "Activos" no muestra esta divisa. De USD en un caso hemos dado divisa, y en otro, la hemos obtenido. La pestaña "Activos" calcula el total y lo suma con el balance actual, puesto que la divisa del depósito también la tenemos en USD. JPY ha participado en dos operaciones, así que la pestaña también mostrará el valor total.




      A aquellos que comercian conforme al modelo bursátil, el apartado puede ayudarles a entender cómo se usa el dinero. A diferencia del modelo anterior, al realizar operaciones, el dinero se resta/añade directamente al balance. Por ejemplo, al comprar EURRUB, usted recibirá directamente euros, y del balance se restará la suma correspondiente en rublos. Durante el comercio, el balance de la cuenta puede incluso tornarse negativo: cuando usted comercia con recursos prestados y en calidad de recursos intervienen activos adquiridos. En esta situación, la pestaña "Activos" le permitirá entender con facilidad el estado comercial de la cuenta.

      De forma adicional, aquí se muestra el valor de liquidación, es decir, la suma de los recursos en la cuenta y el valor (resultado) del cierre de las posiciones actuales al precio del mercado.





    2. Corregido el error de representación del tipo de transacción en la historia de operaciones comerciales.
    3. Corregida la muestra repetida de la ventana de notificaciones sobre riesgos al pasar a la cuenta comercial.
    4. Corregido y optimizado el funcionamiento del diálogo de elección de instrumentos comerciales al trabajar con gran cantidad de símbolos (varios miles y más).
    5. Corregida la representación de los niveles de los indicadores incorporados calculados en base a Moving Average (Bollinger Bands, Adaptive Moving Average, etc). El problema surgía al construir los indicadores en una ventana aparte.
    6. Corregido el error que en ciertos casos impedía colocar una orden en un contrato de futuros. El problema aparecía si el precio de la orden coincidía con el límite superior o inferior de precio del contrato.

    MQL5

    1. Optimizada y acelerada la compilación de programas MQL5.
    2. Añadido el soporte de los modificadores final y override para clases, estructuras y funciones.

      Modificador final para clases y estructuras
      La presencia del modificador final al declarar una estructura o clase, prohíbe la posterior herencia a partir de ella. Si la clase (estructura) es tal que no haya necesidad de introducir cambios posteriormente, o los cambios no están permitidos por motivos de seguridad, declárela con el modificador final. Además, todos los métodos de la clase se también considerarán implícitamente como "final".
      class CFoo final
        {
        //--- cuerpo de la clase
        };
       
      class CBar : public CFoo
        {
        //--- cuerpo de la clase
        };
      Al intentar heredar de una clase con el modificador final, como se muestra en el ejemplo de más arriba, el compilador dará error:
      cannot inherit from 'CFoo' as it has been declared as 'final'
      see declaration of 'CFoo'

      Modificador override para funciones
      El modificador override indica que la función declarada deberá redefinir obligatoriamente el método de la clase padre. El uso de este modificador permite evitar errores en la redifinición, tales como el cambio casual de la signatura del método. Por ejemplo, en la clase básica se define el método func, que toma como argumento una variable del tipo int:
      class CFoo
        {
         void virtual func(int x) const { }
        };
      A continuación, el método se redefine en la clase heredada:
      class CBar : public CFoo
        {
         void func(short x) { }
        };
      Pero por error, el tipo de argumento cambia de int a short. De hecho, en este caso ya tiene lugar no la redefinición, sino la sobrecarga del método. Actuando de acuerdo con el algoritmo de definición de la función sobrecargada, en ciertas situaciones el compilador puede elegir el método definido en la clase básica, en lugar del método redefinido.

      Para evitar errores semejantes, al método redefinido se le debe añadir claramente el modificador override.
      class CBar : public CFoo
        {
         void func(short x) override { }
        };
      Si durante la redefinición se cambia la signatura del método, el compilador no podrá encontrar en la clase padre un método con la misma signatura y dará un error de compilación:
      'CBar::func' method is declared with 'override' specifier but does not override any base class method

      Modificador final para las funciones

      El modificador final actúa al revés, prohibiendo la redefinición del método en las clases heredadas. Si la implementación de un método es autosuficiente y ha finalizado por completo, declárela con el modificador final, para que haya garantías de que no será modificada en lo sucesivo.
      class CFoo
        {
         void virtual func(int x) final { }
        };
       
      class CBar : public CFoo
        {
         void func(int) { }
        };
       
      Al intentar redefinir un método con el modificador final, como se muestra en el ejemplo de más arriba, el compilador dará error:
      'CFoo::func' method declared as 'final' cannot be overridden by 'CBar::func'
      see declaration of 'CFoo::func'
    3. Corregido el error de compilación de las funciones-plantilla con los parámetros por defecto.

    Market

    1. Corregida una serie de errores en la clasificación de los productos del Mercado.

    Tester

    1. Corregida la actualización de los precios de mercado actuales de las órdenes y posiciones abiertas en el modo de simulación visual.
    2. Eliminado el deslizamiento en la ejecución de la órdenes Buy Limit y Sell Limit al realizar la simulación con instrumentos bursátiles.
    3. Corregido el error que provocaba en ocasiones la generación de precios incorrectos en el modo de simulación "Según precios de apertura".
    4. Corregida la formación de eventos OnTradeTransaction durante la simulación.
    5. Durante la simulación basada en ticks reales en el registro del simulador se muestra información sobre la discrepancia de los precios de los ticks (bid o last, dependiendo del precio conforme al que se construye la barra) para los valores low o high disponibles en la barra de minutos.

    MetaEditor

    1. Corregidos los errores de representación de los datos de perfilado en los archivos del código fuente.

    Se ha actualizado la documentación.


    19 agosto 2016
    MetaTrader 5 build 1395: Velocidad de operaciones comerciales aumentada y mejoras en la simulación visual

    Terminal

    1. Se ha optimizado y acelerado considerablemente el envío de comandos comerciales con el terminal de cliente.
    2. Corregido el error que provocaba que los programas MQL5 no se pudieran ejecutar en los terminales al trabajar con la versión de 32 bits de Windows 10, build 1607.
    3. Añadida al navegador la muestra del modo de funcionamiento de la cuenta comercial Hedging o Netting.
    4. Añadido al navegador un comando del menú de contexto para conectar la cuenta elegida al terminal web.
    5. Se ha reelaborado el apartado del menú "Manual", y añadido enlaces a vídeos tutoriales.
    6. Corregida una serie de errores de la interfaz al trabajar con pantallas de alta definición (4K).
    7. Corregidos errores en la traducción de la interfaz de usuario a la lengua persa.

    MQL5

    1. Añadidos los punteros 'void *', lo que permitirá crear colecciones abstractas de objetos. En una variable de este tipo se puede guardar un puntero a un objeto de cualquier clase.
      Para esta transformación se recomienda usar el operador dynamic_cast<nombre de la clase *>(puntero void *). Si la transformación no es posible, el resultado será NULL.
      class CFoo { };
      class CBar { };
      //+------------------------------------------------------------------+
      //| Script program start function                                    |
      //+------------------------------------------------------------------+
      void OnStart()
        {
         void *vptr[2];
         vptr[0]=new CFoo();
         vptr[1]=new CBar();
      //---
         for(int i=0;i<ArraySize(vptr);i++)
           {
            if(dynamic_cast<CFoo *>(vptr[i])!=NULL)
               Print("CFoo * object at index ",i);
            if(dynamic_cast<CBar *>(vptr[i])!=NULL)
               Print("CBar * object at index ",i);
           }
         CFoo *fptr=vptr[1];  // dará error de transformación de los punteros, vptr[1] no es un objeto de CFoo
        }
      //+------------------------------------------------------------------+
    2. Añadido el soporte del operador [ ] para la línea, lo que permitirá obtener un símbolo de la línea según el índice. Si el índice establecido sale de los límites de la línea, el resultado será 0.
      string text="Hello";
      ushort symb=text[0];  // retornará el código del símbolo 'H'
      
    3. Añadida una segunda variante del manejador de eventos TesterInit con la signatura int OnTesterInit(void), que puede retornar los códigos INIT_SUCCEEDED (0) o INIT_FAILED (o bien un valor cualquiera distinto a cero). Si OnTesterInit retorna un valor distinto a cero, entonces la optimización no comenzará.
    4. Corregido el error que provocaba que diferentes sobrecargas de la función  ChartGetString diesen un resultado distinto.

    Tester

    1. Añadidos comandos adicionales y atajos de teclado para la simulación visual. Ahora los gráficos en el simulador visual se pueden ajustar de la misma forma que en el terminal: cambiar los colores, controlar la muestra de diferentes elementos, aplicar plantillas, etc.




    2. Corregido el funcionamiento de la función Sleep en el modo de simulación "Según precios de apertura".
    3. Corregido el error que provocaba la formación de un estado incorrecto de las barras al trabajar con los marcos temporales W1 y MN1.

    MetaEditor

    1. MetaEditor: Añadida traducción de la interfaz de usuario al chino tradicional.

    Se ha actualizado la documentación.

    15 julio 2016
    MetaTrader 5 build 1375: Fuente de operaciones y acceso a los ticks durante las pruebas

    Terminal

    1. Ha sido añadida la fuente de operaciones a la DOM (Profundidad del Mercado).




      ¿Qué significa la fuente de operaciones?
      En la fuente de operaciones se muestra la lista de todas las transacciones realizadas en la bolsa en tiempo real. Para cada transacción se muestra la hora de su formalización, la dirección (compra o venta), el precio y el volumen. Para que el análisis visual sea más cómodo, cada dirección se muestra con un color diferente: el azul se utiliza para compra, el rosado, para venta, el verde, para la dirección no determinada. Los volúmenes de las operaciones se muestran en forma de histogramas.

      ¿Cómo la fuente de operaciones ayuda a entender el mercado?
      La fuente de operaciones permite analizar los mercados más detalladamente. La dirección de la operación avisa al trader quién ha sido el iniciador de su formalización: el comprador o el vendedor. El volumen de las operaciones formalizadas permite comprender el comportamiento de los participantes del mercado: ¿son jugadores grandes o pequeños, qué actividad tienen? La velocidad de realización de las operaciones y su volumen en determinados niveles de precios permite concluir sobre la importancia de estos niveles.

      ¿Cómo usar los datos?
      Aparte del análisis visual de la tabla, Ud. puede descargar los datos sobre las operaciones en un archivo CSV. Luego se les puede estudiar en cualquier otra aplicación, por ejemplo en MS Excel. En este archivo, todos los datos van separados con coma:
      Time,Bid,Ask,Last,Volume,Type
      2016.07.06 16:05:04.305,89360,89370,89370,4,Buy
      2016.07.06 16:05:04.422,89360,89370,89370,2,Buy
      2016.07.06 16:05:04.422,89360,89370,89370,10,Buy
      2016.07.06 16:05:04.669,89360,89370,89370,1,Buy
      2016.07.06 16:05:05.968,89360,89370,89360,7,Sell
      Para guardar los datos en el archivo, abra el menú contextual:



      Para identificar correctamente la dirección de las operaciones, la plataforma comercial del bróker tiene que estar actualizada a la versión 1375.
    2. Se ha reducido considerablemente el tiempo entre la llegada del tick/cambio de la Profundidad del Mercado y la llamada de los puntos de entrada OnTick y OnCalculate. Además, se ha reducido el tiempo entre la llegada del evento del cambio del estado comercial y la llamada de los puntos de entrada OnTrade y OnTradeTransaction. De esta manera, los programas MQL5 van a reaccionar más rápido a los eventos comerciales.
    3. Ha sido acelerado el envío de las solicitudes comerciales durante el uso de la autenticación ampliada mediante los certificados SSL.
    4. Ha sido actualizada la traducción de la interfaz al iraní.
    5. Ha sido corregida la visualización de los comandos de colocación de SL/TP en el menú contextual del gráfico durante el trabajo en el modo de la cobertura (hedging) .

    Tester

    1. Ha sido agregada la posibilidad de solicitar el historial de ticks usando la función CopyTicks durante la prueba. Antes esta función no funcionaba en el Probador de estrategias.

      • En el modo “Todos los ticks”, la función devolverá el historial de los ticks generados. Se puede solicitar no más de 128 000 últimos ticks.
      • En el modo “Cada tick a base de ticks reales”, la función devolverá el historial de los ticks reales. La profundidad de los datos solicitados se limita solo con la disponibilidad de estos datos. No obstante, tenga en cuestión que los últimos 128 000 ticks se ponen en la cache por el Probador de estrategias, por eso la solicitud de estos datos va a realizarse bastante rápido. El historial más profundo se solicita directamente desde el disco duro, con lo cual la ejecución de la solicitud va a durar más tiempo.
      • Esta función no va a funcionar en los modos Solo precios de apertura y M1 en OHLC porque el historial de los ticks prácticamente no se crea.

    2. Ha sido agregado el soporte de tiempo con la precisión de hasta milisegundos. Antes, el cuanto de tiempo era un segundo en el Probador de estrategias.

      • Ahora las funciones EventSetMillisecondTimer y Sleep trabajan con más precisión en el Probador de estrategias.
      • Se ha aumentado la precisión de la entrega de los ticks durante el testeo de los EAs multidivisas. Antes, si en un segundo se colocaba varios ticks (el volumen de ticks de la barra de un minuto más de 60), cada uno recibía la misma hora. Durante la prueba de los EAs monodivisas esto no tiene mucha importancia porque los ticks simplemente se entregan al EA en serie. Sin embargo, durante la prueba en varios pares es importante saber cuál de los ticks y de qué par ha llegado el primero. Antes, los ticks se pasaban en serie para cada símbolo: primero todos los ticks en un segundo para un símbolo, luego todos los ticks para el otro. Ahora se pasan tomando en cuenta los milisegundos.

        Durante la prueba con los ticks reales, los milisegundos se toman desde los datos iniciales de los ticks. Durante la generación de los ticks, los milisegundos se ponen de acuerdo con el volumen de ticks. Por ejemplo, sin en un segundo caben tres ticks, obtienen el tiempo de 000, 333 y 666 milisegundos.

    3. En los modos “Por los precios de apertura” y “M1 en OHLC”, la ejecución de las órdenes pendientes y SL/TP ahora se realiza por el precio solicitado en vez del precio actual en el momento de la ejecución. El algoritmo de ejecución por los precios del mercado que se utiliza en los modos precisos (todos los ticks y los ticks reales) no conviene para los modos aproximados. En los últimos, los ticks intermedios no se generan, y la diferencia entre el precio solicitado en la orden y el precio del mercado en el momento de ejecución (Open u OHLC) puede ser considerable. En los modos “Por los precios de apertura” y “M1 en OHLC”, la ejecución de las órdenes por el precio solicitado da los resultados más precisos de la prueba.

    4. Ha sido agregado el soporte de la prueba forward en el modo visual. Ahora para la prueba back y forward van a abrirse dos ventanas separadas de la prueba visual, lo que permitirá comparar cómodamente los resultados del trabajo de los EAs en diferentes períodos.




      La ventana de la prueba forward aparece solo después de la finalización de la prueba en el intervalo de tiempo principal.

    5. Ahora en el gráfico de la prueba, en vez del nivel del margen, aparece la carga sobre el depósito que se calcula como la relación entre el margen y la equidad (margin/equity).


    6. Ha sido corregido el cálculo de la comisión en porcentajes anuales durante la prueba.
    7. Ha sido corregido el recálculo y la visualización del balance en el gráfico formado en el proceso de la prueba.

    MQL5

    1. Se ha cambiado el comportamiento de la función OrderSend durante la colocación, modificación y cancelación de las órdenes. Los cambios influyen solo durante el envío de las órdenes a los sistemas externos de trading. Antes, el control se devolvía a la función OrderSend tras la colocación (procesamiento) con éxito de la orden en el servidor del bróker. Ahora, el control se devuelve solo después de que el servidor del bróker reciba la notificación del sistema externo sobre que la orden haya sido colocada con éxito.
      Abajo se muestra el comportamiento anterior (flecha roja) y el actual de esta función:




    2. En la estructura del resultado comercial MqlTradeResult ha sido agregado el campo retcode_external: código del error en el sistema comercial externo. La colocación y la apariencia de estos errores depende del bróker y del sistema comercial externo al que se pasan las operaciones de trading. Por ejemplo, los valores retcode_external llenados por la Bolsa de Moscú van a diferenciarse de DGCX.

    3. Han sido añadidas las propiedades CHART_EXPERT_NAME y CHART_SCRIPT_NAME a la enumeración ENUM_CHART_PROPERTY_STRING. Ahora, a través de la función ChartGetString se puede conocer el nombre del EA y/o script adjuntado al gráfico definido por el parámetro chart_id.

    Signals

    1. Ha sido corregido el error debido al cual las operaciones del cierre de la posición por la contraria (close by) no eran copiadas.
    2. Mejorada la comparación de los pares de divisas que contienen RUB y RUR.

    Market

    1. Ha sido corregida la ordenación por la categoría del producto.

    MetaEditor

    1. Ha sido corregida la colocación del foco en el campo del texto de la sustitución durante la apertura del dialogo de sustitución.
    2. Ha sido corregida la sustitución masiva del texto durante la búsqueda hacia arriba desde la posición actual.


    La documentación ha sido actualizada.

    5 julio 2016
    Plataforma web MetaTrader 5: lanzamiento oficial

    Después de 2 meses de pruebas públicas, anunciamos el lanzamiento oficial de la versión web de la plataforma multimercado MetaTrader 5. Ella le permite negociar en los mercados financieros a través de cualquier navegador en cualquier sistema operativo. Y para ello, no es necesario instalar ningún software adicional, de hecho, basta con tener acceso a internet o cualquier navegador web.

    La aplicación combina las ventajas clave de la plataforma de escritorio (velocidad, faceta multimercado y características comerciales mejoradas) con la comodidad y el carácter multiplataforma. La principal novedad de la versión actualizada es la profundidad de mercado, así como la colocación con un clic de ordenes de mercado y pendientes.

    La plataforma web le permite realizar análisis técnico y realizar negociaciones de la misma forma como en la versión de escritorio. En la aplicación, usted tiene a su disposición:

    • sistemas de compensación y cobertura de registro de posiciones,
    • 31 indicadores técnicos,
    • 24 objetos de análisis,
    • negociación en un solo clic y un conjunto completo de órdenes comerciales,
    • una interfaz en 41 idiomas
    13 mayo 2016
    MetaTrader 5 build 1340: Transferencia cómoda de certificados a los terminales móviles y mejoras en el simulador

    Terminal

    1. Ahora los certificados para conectarse en el modo de alta seguridad pueden ser cómodamente transferidos del terminal de escritorio a los móviles.

      En la plataforma comercial se da soporte a la autorización extendida, es decir, además de con una contraseña, la cuenta estará protegida con un certificado SSL especial. El certificado es un archivo generado para la cuenta en el servidor comercial. El archivo es único, y sin él no será posible la conexión a la cuenta.

      Antes, si el certificado era solicitado y generado a través del terminal de escritorio, para usar la cuenta en MetaTrader 5 de iPhone/iPad o Android había que trasladar el archivo manualmente al dispositivo y luego instalarlo. Ahora el certificado se traslada con toda comodidad.

      Como se realiza la transferencia
      La transferencia del certificado se lleva a cabo a través del servidor comercial:

      • Primero el certificado es cifrado en el terminal de PC: el propietario de la cuenta indica la contraseña con la que será cifrado el certificado mediante el fiable algoritmo AES-256. Esta contraseña la conocerá solo el usuario, no será enviada al servidor.
      • A continuación, el certificado cifrado se envía al servidor comercial, donde se almacena hasta que sea recibido en el terminal móvil, no más tarde de una hora.
      • Para obtener el certificado, el usuario debe conectarse a la cuenta a través del terminal móvil. Después de conectarse, se le propondrá importar el certificado. Para ello, se debe especificar la contraseña con la que se cifró en el terminal de escritorio.

      La transferencia del certificado se produce de forma segura: el servidor comercial se utiliza sólo como un almacenamiento intermedio. El cifrado se realiza en el lado del cliente, y la contraseña del certificado no se transmite o almacena en el servidor comercial.

      Cómo trasladar el certificado
      Conéctese a su cuenta en el terminal de escritorio y seleccione "Transferir el certificado" en el menú de contexto:



      Indique la contraseña maestra de la cuenta para confirmar que le pertenece a usted. A continuación, establezca la contraseña con la que se protegerá el certificado antes de ser enviado al servidor. La contraseña debe tener como mínimo 8 dígitos.

      Después de enviar con éxito el certificado al servidor, abra el terminal móvil y conéctese a la cuenta. Se le solicitará que importe el certificado. Acepte e introduzca la contraseña que indicó en el terminal de escritorio.



      Podrá ver el certificado importado en el apartado "Sobre el programa - Certificados".
      Los terminales móviles actualizados para MetaTrader 5 iPhone/iPad y Android con soporte para transferencia de certificados serán lanzados en breve.

    Tester

    1. Se ha cambiado el algoritmo de activación y ejecución de las órdenes pendientes y SL/TP, para una simulación más correcta. Ampliadas las posibilidades de la simulación visual.

      Qué ha cambiado para los instrumentos bursátiles
      En el mercado real, para los instrumentos bursátiles, la construcción de gráficos y la activación de órdenes se realiza según el precio de la última operación (Last). La activación de las órdenes límite se realiza según los precios Bid/Ask. En este caso, la ejecución de todos los tipos de órdenes siempre se realiza según los precios de mercado actuales Bid/Ask. En el simulador de estrategias se han introducido cambios para que haya una mayor correspondencia con las condiciones reales:
        Era
      Ahora es
      Activación Todos los tipos de órdenes y SL/TP según Bid/Ask
      Órdenes límite según Bid/Ask
      Órdenes stop, stop-limit y SL/TP según Last
      Ejecución Todos los tipos de órdenes pendientes y SL/TP al precio indicado en la orden
      Todos los tipos de órdenes pendientes y SL/TP según los precios de mercado Bid/Ask en el momento de la activación

      Veamos un ejemplo con el instrumento Si-6.16. Con los precios actuales Bid=72570, Ask=72572, Last=72552 se ha colocado una orden Buy Stop con un precio de activación de 72580. En el flujo de precios hemos obtenido los nuevos precios actuales:

      • Bid=72588
      • Ask=72590
      • Last=72580


      En los instrumentos bursátiles, el precio Last es el que activa las órdenes stop. Por eso, la llegada del precio Last=72580 en el flujo ha provocado la activación de la orden Buy Stop. Antes, precisamente este precio 72580 se utilizaba para la ejecución de esta orden. Este comportamiento era incorrecto, puesto que el precio Ask=72580 para la ejecución de una operación de compra en el mercado no existe.


      En el simulador actualizado se usa el precio actual de compra Ask=72590, y la orden Buy Stop se ejecutará precisamente con él. De esta forma, el nuevo algoritmo de ejecución de operaciones en el simulador se corresponde de forma más precisa con el mercado real. Con el algoritmo antiguo, la operación comercial se ejecutaría a un precio que no sería de mercado, lo que provocaría que los resultados de la simulación fuesen incorrectos.

      Qué ha cambiado para los instrumentos no bursátiles
      Para los instrumentos no bursátiles, el algoritmo de activación permanece igual: para todos los tipos de órdenes pendientes y SL/TP se usan los precios Bid y Ask. Ha cambiado el modo de ejecución: antes sucedía según el precio indicado en la orden, ahora se usan los precios actuales de mercado Bid y Ask en el momento de la activación.

      Novedades en la simulación visual
      En la simulación visual ahora se muestran las líneas del precio máximo Ask y del mínimo Bid para la barra. En este gráfico es más fácil realizar la simulación de asesores con los instrumentos bursátiles, donde la construcción de las barras y la activación de órdenes tiene lugar según los precios Last, y la ejecución de las operaciones de mercado según Bid y Ask.



      En el gráfico de simulación visual ha aparecido la posibilidad de navegar por una fecha específica. Clique dos veces en el gráfico e indique la fecha y la hora. Aparte de esto, el gráfico puede ser desplazado a cualquier orden u operación: clique dos veces en una operación comercial en la pestaña "Comercio", "Historia" u "Operaciones".
    2. Tester: Ampliado el diario de carga de la historia de precios y ticks antes del inicio de la simulación. Ahora en el diario se muestra una ventana que indica la finalización de la carga de la historia, el volumen de los  datos cargados y el tiempo invertido en la carga:
      2016.05.10 12:47:53    Core 1    5.10 Mb of history processed in 0:00.842
      2016.05.10 12:47:53    Core 1    GBPUSD: history synchronization completed [5225 Kb]

    MQL5

    1. Corregido el error que provocaba en ciertas ocasiones que la función CopyTicks retornase menos ticks de los solicitados.
    2. Corregidos los errores de generación de la funciones-plantilla.
    3. Se ha actualizado la documentación.

    Correcciones de crash logs.
    12 mayo 2016
    Plataforma web MetaTrader 5: la versión beta ya está disponible para pruebas

    En respuesta a las numerosas peticiones de los tráders, se ha desarrollado una versión web de la plataforma MetaTrader 5. El nuevo producto combina la comodidad y el carácter multiplataforma con las ventajas de la quinta versión para PC, es decir: velocidad, faceta multimercado y características comerciales mejoradas.

    La plataforma web MetaTrader 5 ya está disponible en el sitio de la MQL5.community. Esta le permite negociar en los mercados financieros a través de cualquier navegador en cualquier sistema operativo (Windows, Mac, Linux). Y para ello, no es necesario instalar ningún software adicional, de hecho, basta con tener acceso a internet.

    En la versión beta, los tráders tienen de inmediato a su disposición:

    • un sistema de cobertura de registro de posiciones
    • 30 indicadores técnicos,
    • 24 objetos de análisis,
    • un conjunto completo de órdenes de negociación MetaTrader 5,
    • una interfaz en 41 idiomas.
    El lanzamiento beta está destinado a proporcionar pruebas públicas avanzadas y permitir a los tráders evaluar las nuevas opciones.
    22 abril 2016
    MetaTrader 5 build 1325: Comercio con cobertura y simulación con ticks reales

    Terminal

    1. Para ampliar las posibilidades de fórex retail, se ha añadido a la plataforma un segundo sistema de registro: la cobertura. Ahora puede haber multitud de posiciones de un instrumento, incluidas las posiciones opuestas. Esto hace que sea posible poner en práctica estrategias comerciales con el llamado bloqueo: si el precio va en contra del tráder, este tiene la posibilidad de abrir una posición en la dirección opuesta.

      El nuevo sistema de registro es análogo al usado en MetaTrader 4, por lo que será algo familiar para los tráders. Además, los tráders podrán valerse de todas la ventajas de la quinta versión de la plataforma: ejecución de órdenes usando varias operaciones (incluyendo las parciales), el simulador multidivisa y de flujo múltiple con soporte de la red de cálculos MQL5 Cloud Network y mucho más.

      Ahora en una cuenta es posible comerciar en la bolsa, donde se usa la compensación y solo se puede tener una posición en un instrumento. Además, en la misma plataforma, pero en otra cuenta se puede comerciar en fórex y usar la cobertura.

      Cómo abrir una cuenta con cobertura y dónde mirar el tipo de registro de posición
      El tipo de registro de posición se establece a nivel de la cuenta, se muestra en el encabezamiento de la ventana del terminal, así como en el registro de actividad:



      Para abrir una cuenta demo con cobertura, active la opción correspondiente:


      Sistema de compensación
      Este sistema presupone que en un momento concreto, en la cuenta puede haber solo una posición abierta del mismo símbolo:

      • Si ya hay una posición en el instrumento, al realizarse una operación en la misma dirección, se produce un incremento del volumen de esta posición.
      • Al realizarse una operación en la dirección opuesta, tiene lugar la reducción del volumen de la posición existente, su cierre (al realizarse una operación con un volumen igual al de la posición actual) o bien el viraje (si el volumen de la operación opuesta es mayor al de la posición actual).

      En este caso, no tiene importancia como resultado de qué acción se realiza la operación en la dirección opuesta, si como fruto de la ejecución de una orden de mercado o debido a la activación de una orden pendiente.

      Más abajo mostramos un ejemplo de ejecución de dos operaciones de compra de EURUSD con un volumen de 0.5 cada una de ellas:s each:


      Como resultado de la ejecución de estas operaciones, tenemos una posición general con un volumen de 1 lote.

      Sistema de cobertura
      Este sistema de registro de la posición permite tener multitud de posiciones comerciales de un mismo instrumento, incluso en direcciones diferentes.

      Si hay una posición abierta de un instrumento comercial y el tráder efectúa una nueva operación (o se activa una orden pendiente), se abre una nueva posición. La posición existente no cambia.

      Más abajo mostramos un ejemplo de ejecución de dos operaciones de compra de EURUSD con un volumen de 0.5 cada una de ellas:


      Como resultado de la ejecución de estas operaciones, tenemos la apertura de dos posiciones diferentes.

      Nuevo tipo de operación comercial Close By
      Para las cuentas con cobertura de registro de posiciones se ha añadido un nuevo tipo de operaciones comerciales: el cierre de una posición con una opuesta. Esta operación permite cerrar simultáneamente dos posiciones en direcciones opuestas de un mismo instrumento. Si las posiciones opuestas tienen una cantidad diferente de lotes, entonces quedará abierta solo una orden de las dos. Su volumen será igual a la diferencia de lotes de las dos posiciones cerradas, y la dirección de la posición y el precio de apertura serán como en la mayor (en volumen) de las posiciones cerradas.

      En comparación con el cierre individual de dos posiciones, el cierre por orden opuesta permite al tráder ahorrarse un spread:

      • Con el cierre individual, el tráder paga dos veces: cierra la compra al precio menor (Bid), y la venta, al mayor (Ask).
      • Con el cierre por orden opuesta, para cerrar la primera posición se usa el precio de apertura de la segunda posición, y para la segunda posición, el precio de apertura de la primera.


      Al cerrar la posición con otra opuesta se establece una orden del tipo "close by". En el comentario a la misma se indican los tickets de las posiciones cerradas. El cierre de una pareja de posiciones opuestas tiene lugar mediante dos operaciones del tipo "out by". La magnitud del beneficio/pérdida total obtenido como resultado del cierre de ambas posiciones, se indica solo en una de las operaciones.


    2. Como complemento al soporte de la cobertura, en la plataforma se han ampliado las posibilidades de traslado de cuentas desde MetaTrader 4. Ahoras los brókers pueden trasladar de forma automática las cuentas a MetaTrader 5 junto con todas las operaciones: las órdenes abiertas y pendientes, así como toda la historia comercial.

      Al conectar por primera vez una cuenta trasladada desde MetaTrader 4, usted podrá ver una ventana de bienvenida. El traslado se realiza de forma segura. Para comenzar a trabajar, indique la contraseña de la cuenta que antes utilizaba en MetaTrader 4, y después introduzca una nueva contraseña.


      Una vez efectuado el procedimiento, usted podrá trabajar de la forma habitual, como si la cuenta se hubiese abierto en MetaTrader 5, y conservando además toda la historia de operaciones de MetaTrader 4 en la cuenta nueva.
      Al efectuar la importación, los tickets de las órdenes y posiciones (incluidas las órdenes de la historia) no se guardan, dado que a una entrada en la historia comercial de MetaTrader 4 pueden corresponder hasta 4 entradas en la historia de MetaTrader 5. Todas las entradas de trading reciben nuevos tickets.

      Los números de las cuentas pueden conservarse o ser sustituidos, dependiendo de la forma en la que el bróker realice la importación.
    3. Añadido Chat. Ahora podrá hablar con sus amigos en MQL5.community directamente en la plataforma comercial. En el chat se muestran todos los mensajes de la cuenta MQL5. Para comenzar a hablar, entre en su cuenta directamente desde la ventana del chat o a través de los ajustes de la plataforma: Servicio -> Ajustes -> Comunidad.



    4. Simplificado la ventana de diálogo de apertura de la cuenta demo, añadida la posibilidad de abrir cuentas con cobertura. Ahora no es necesario rellenar un formulario enorme, basta con indicar los datos principales y elegir los parámetros comerciales: el tipo de cuenta, el depósito, el apalancamiento y la posibilidad de cobertura.



    5. Para comenzar a trabajar con la plataforma rápidamente, se ha añadido la selección automática de la cuenta demo. Si en la plataforma no hay ni una cuenta, entonces al iniciarla se destaca la cuenta demo en el primer servidor comercial disponible. Después de abrirse con éxito, la cuenta estará activada.

    6. Ahora cada posición tiene un ticket, un número único. Normalmente, corresponde al ticket de la orden como resultado de la cual se abrió la posición, excepto en los casos en los que el ticket ha cambiado debido a las operaciones de servicio en el servidor. Por ejemplo, el aumento de los swaps por la reapertura de posición. El ticket de todas las posiciones abiertas con anterioridad se designará después de actualizar hasta la nueva versión del terminal.



    7. Corregida la colocación de los niveles de Stop Loss y Take Profit al establecer una orden de mercado que provoca el cambio de dirección de la posición. Los niveles anteriormente correspondientes no se han establecido en la nueva posición.
    8. Corregida la representación de los precios con cuatro o más dígitos tras la coma en los elementos de control del panel de comercio con un click.
    9. Corregido el error de representación de una noticia en la ventana de vista previa antes de la impresión.
    10. Corregidos los errores de representación del gráfico de ticks.
    11. Corregida la apertura de la profundidad de mercado después de la finalización forzosa del trabajo del terminal.
    12. Añadida la posibilidad de comprobar si están permitidas las órdenes de mercado al representar los elementos de control del panel de comercio con un click.
    13. Optimizado el cálculo del beneficio y el margen con una gran cantidad de órdenes y posiciones abiertas.
    14. Añadida la traducción de la interfaz de usuario al malayo.
    15. Guía de usuario completamente actualizada. Un nuevo diseño, capturas de pantalla interactivas y vídeos tutoriales incorporados, todo para hacer el aprendizaje del comercio con MetaTrader 5 lo más sencillo y cómodo posible:



    16. Corregida la representación de los objetos gráficos en el modo "Gráfico arriba".

    Tester

    1. Añadida la posibilidad de testar los robots comerciales e indicadores técnicos según la historia de ticks real.

      La simulación y optimización sobre ticks reales son las más próximas a las condiciones reales. En lugar de los ticks generados basándose en los datos por minutos, se usan los ticks reales de los instrumentos financieros, acumulados por el bróker. Se trata de los ticks de la bolsa y de los proveedores de liquidez.

      Para comenzar la simulación u optimización según los ticks reales, elija el modo correspondiente en el simulador de estrategias:



      Los datos de tick tienen un tamaño significativamente mayor que los de minutos. Al realizarse el primer inicio de la simulación, su descarga puede ocupar bastante tiempo. Los datos de tick descargados se guardan por meses en archivos TKC en el catálogo \bases\[nombre del servidor comercial]\ticks\[nombre del símbolo]\.

      Peculiaridades de la simulación con ticks reales
      Al realizar la simulación con ticks reales, el spread en los límites de la barra de minutos puede cambiar, mientras que con la generación de ticks, dentro del minuto se usa un spread fijo en la barra correspondiente.

      Si se transmite la profundidad de mercado bursátil de un instrumento, las barras se construyen estrictamente según los precios de ejecución de la última operación Last. En caso contrario, el simulador intenta primero construir las barras con los precios Last, y solo si no los hay, usa los precios Bid. El evento de llegada de un tick OnTick se activa en todos los ticks, independientemente de si ha habido precio Last o no.

      Preste atención a que las operaciones comerciales siempre se realizan según los precios Bid y Ask, incluso si el gráfico se construye según los precios Last. Por ejemplo, un experto que use en el comercio solo los precios de apertura de barra (concretamente el Moving Average incorporado) recibirá la señal con un precio (Last), pero realizará la operación con otro (Bid o Ask dependiendo de la dirección). Al usar el modo de generación "Todos los ticks", las barras se construyen según los precios Bid, y las operaciones se realizan según Bid y Ask. Además, Ask se calcula como Bid + el spread fijo de la barra de minutos correspondiente.

      Si en la historia del símbolo hay una barra de minutos, pero no hay datos de tick de este minuto, el simulador generará los ticks en el modo "Todos los ticks". Esto permite poner a prueba el asesor en el perido planeado en el caso de que el bróker no disponga de datos de tick completos. Si en la historia del símbolo no hay barra de minutos, pero si existen datos de tick de ese minuto, entonces esos ticks se ignoran. Los datos de minutos se consideran más fiables.

      Simulación con ticks reales en la red de cálculos en nube MQL5 Cloud Network
      La simulación con ticks reales está disponible no solo en los agentes locales y remotos, sino también a través de la red de cálculos en la nube MQL5 Cloud Network. La optimización de estrategias, que podría ocupar meses, se puede ejecutar en unas cuantas horas, usando el poder de cálculo de miles de computadoras.

      Para realizar la simulación a través de la red, active el uso de los agentes en la nube:



      Al realizar la simulación de ticks reales a través de MQL5 Cloud Network, se puede transmitir un gran volumen de transferencia por internet. Esto puede influir significativamente en el coste total del uso de la red de computación.
    2. Corregido el error como resultado del cual no se calculaba la comisión en ciertos tipos de instrumentos comerciales.
    3. Corregido el rellenado del campo Expert de las órdenes comerciales que aparecían como resultado de la activación de SL/TP, de acuerdo con el campo Expert en las posiciones correspondientes. Antes no se rellenaba.
    4. Corregido el cambio a la pestaña de resultados de la optimización normal y en tiempo real.
    5. Corregido el cálculo y representación del indicador "Envelopes".
    6. Optimizada la ejecución del testing visual.
    7. Optimizado el cálculo del beneficio y el margen con una gran cantidad de órdenes y posiciones abiertas.
    8. Optimizada la ejecución de las operaciones comerciales en el comercio de alta frecuencia.
    9. Ahora la sincronización de la historia no se realiza al solicitar las propiedades de un símbolo secundario, que no exigen las cotizaciones actuales. Por ejemplo,  SYMBOL_SELECT, SYMBOL_DIGITS, SYMBOL_SPREAD_FLOAT, SYMBOL_TRADE_CALC_MODE, SYMBOL_TRADE_MODE, SYMBOL_TRADE_STOPS_LEVEL, SYMBOL_TRADE_FREEZE_LEVEL, SYMBOL_TRADE_EXEMODE, etcétera. Antes, al solicitarse cualquier propiedad de un símbolo secundario, se sincronizaba la historia de dicho símbolo.

    MQL5

    1. Modificado el formato de los archivos ejecutables EX5, debido a la adición de nuevas posibilidades en el lenguaje MQL5 y a la aparición de la cobertura en la plataforma MetaTrader 5. Todos los programas EX5 antiguos compilados en el MetaEditor de los builds anteriores funcionarán correctamente después de la actualización, de esta forma, la compatibilidad de abajo hacia arriba se conserva totalmente.

      Al mismo tiempo, los programas EX5 compilados en los builds 1325 y superiores no funcionarán en los terminales con los builds antiguos, no existe la compatibilidad inversa.
    2. Añadido el soporte de las clases abstractas y las funciones virtuales puras.

      Las clases abstractas están diseñadas para crear entidades genéricas, sobre cuya base se supone que se crearán clases derivadas más concretas en lo sucesivo. Una clase abstracta, es una clase que sólo puede ser utilizada como clase básica para alguna otra clase, por eso no se puede crear un objeto de tipo de clase abstracta.

      La clase que contenga aunque sea solo una función virtual pura, es abstracta. Por eso las clases derivadas de una clase abstracta deben implementar todas sus funciones virtuales puras, de lo contrario, también serán clases abstractas.

      Una función virtual se declara como "pura" con la ayuda de la sintaxis de un especificador puro. Veremos como ejemplo la clase CAnimal, que se crea solo para proporcionar las funciones generales, los propios objetos del tipo CAnimal tienen un carácter demasiado general para la aplicación práctica. De esta forma, la clase CAnimal es un buen candidato a clase abstracta:
      class CAnimal
        {
      public:
                            CAnimal();     // constructor
         virtual void       Sound() = 0;   // función virtual pura
      private:
         double             m_legs_count;  // número de patas del animal
        };
      
      Aquí la función Sound() es virtual pura, por eso se la declara con el especificador de función virtual pura PURE (=0).

      Las funciones virtuales puras son solo aquellas funciones virtuales para las que se indica el especificador puro  PURE, y  precisamente: (=NULL) o (=0). Ejemplo de declaración y uso de una clase abstracta:
      class CAnimal
        {
      public:
         virtual void       Sound()=NULL;   // PURE method, debe ser redefinido en la clase derivada, la propia clase CAnimal se ha convertido en abstracta y no puede ser creada
        };
      //--- derivada de la clase abstracta
      class CCat : public CAnimal
       {
      public:
        virtual void        Sound() { Print("Myau"); } // PURE es redefinido, la clase CCat no es abstracta y puede ser creada
       };
      
      //--- ejemplos de uso incorrecto
      new CAnimal;         // error 'CAnimal' - el compilador retorna el error "cannot instantiate abstract class"
      CAnimal some_animal; // error 'CAnimal' - el compilador retorna el error "cannot instantiate abstract class"
      
      //--- ejemplos de uso correcto
      new CCat;  // no hay error, la clase CCat no es abstracta
      CCat cat;  // no hay error, la clase CCat no es abstracta
      
      Limitaciones de uso de las clases abstractas
      Si el constructor de una clase abstracta invoca una función virtual pura (directa o indirectamente) el resultado es indefinido.
      //+------------------------------------------------------------------+
      //| Clase básica abstracta                                           |
      //+------------------------------------------------------------------+
      class CAnimal
        {
      public:
         //--- función virtual pura
         virtual void      Sound(void)=NULL;
         //--- función
         void              CallSound(void) { Sound(); }
         //--- constructor
         CAnimal()
          {
           //--- invocación directa del método virtual
           Sound();
           //--- invocación indirecta (a través de una tercera función)
           CallSound();
           //--- en el constructor y/o destructor siempre se invocan sus propias funciones,
           //--- a pesar del carácter virtual y de la redefinición de la función invocada en la derivada
           //--- si la función invocada es virtual pura, entonces
           //--- la invocación provocará el error de ejecución crítico: "pure virtual function call"
          }
        };
      
      Sin embargo, los constructores y destructores de las clases abstractas pueden invocar otras funciones miembro.

    3. Para que la organización de modelos de eventos sea más sencilla, se ha añadido el soporte de índices a una función.

      Para declarar un índice a una función, determine el tipo "índice a una función", por ejemplo:
      typedef int (*TFunc)(int,int);
      Ahora TFunc es un tipo y se puede declarar la variable-índice a una función:
      TFunc func_ptr;
      En la variable func_ptr se puede guardar la dirección de una función para invocarla más tarde:
      int sub(int x,int y) { return(x-y); }
      int add(int x,int y) { return(x+y); }
      int neg(int x)       { return(~x);  }
      
      func_ptr=sub;
      Print(func_ptr(10,5));
      
      func_ptr=add;
      Print(func_ptr(10,5));
      
      func_ptr=neg;           // error: neg no tiene el tipo  int (int,int)
      Print(func_ptr(10));    // error: tiene que haber dos parámetros
      
      Los índices a una función se pueden guardar y transmitir como parámetros. No es posible recibir un índice a un método de clase no estático.

    4. Se han añadido a la estructura de la solicitud comercial MqlTradeRequest dos nuevos campos:

      • position — ticket de la posición. Hay que rellenarlo al comerciar con cobertura, en caso de cambiar o cerrar una posición para su identificación inequívoca. Al comerciar con el sistema de compensación del registro de posiciones, rellenar esta campo no influye en nada, puesto que la identificación de la posición tiene lugar por el nombre del instrumento comercial.
      • position_by — ticket de la posición opuesta. Se usa al cerrar una posición con otra opuesta, abierta en el mismo instrumento, pero en dirección contraria. Solo se usa con el sistema de cobertura del registro de posiciones.

    5. A la enumeración de los tipos de operaciones comerciales ENUM_TRADE_REQUEST_ACTIONS se ha añadido TRADE_ACTION_CLOSE_BY, el cierre de una posición con la opuesta. Solo se usa con el sistema de cobertura del registro de posiciones.

    6. A la enumeración de las propiedades de las órdenes, operaciones y posiciones se han añadido los tickets de las operaciones comerciales:

      • A ENUM_ORDER_PROPERTY_INTEGER se ha añadido la propiedad ORDER_TICKET, el ticket de la orden. Un número único que se asigna a cada orden.
      • A ENUM_DEAL_PROPERTY_INTEGER se ha añadido la propiedad DEAL_TICKET, el ticket de la operación. Un número único que se asigna a cada operación.
      • A ENUM_POSITION_PROPERTY_INTEGER se ha añadido POSITION_TICKET, el ticket de la posición. Un número único que se asigna a cada posición abierta de nuevo. Normalmente, corresponde al ticket de la orden como resultado de la cual se abrió la posición, excepto en los casos en los que el ticket ha cambiado debido a las operaciones de servicio en el servidor. Por ejemplo, el aumento de los swaps por la reapertura de posición. Para encontrar la orden con la que se ha abierto la posición, se debe usar la propiedad POSITION_IDENTIFIER. El valor POSITION_TICKET corresponde a MqlTradeRequest::position.

    7. A la enumeración de los tipos de órdenes ENUM_ORDER_TYPE se ha añadido el valor ORDER_TYPE_CLOSE_BY, la orden de cierre de una posición con una posición opuesta.
    8. A la enumeración de los tipos de órdenes ENUM_ORDER_PROPERTY_INTEGER se ha añadido el valor ORDER_POSITION_BY_ID, el identificador de una posición opuesta para las órdenes del tipo ORDER_TYPE_CLOSE_BY.
    9. A la enumeración de las direcciones de una operación ENUM_DEAL_ENTRY se ha añadido el valor DEAL_ENTRY_OUT_BY, la operación ha tenido lugar como resultado del cierre de una posición por la opuesta.
    10. A la estructura de la transacción comercial MqlTradeRequest se han añadido dos campos análogos:

      • position — ticket de la posición a la que ha influido la transacción. Se rellena para las transacciones relacionadas con el procesamiento de las órdenes de mercado (TRADE_TRANSACTION_ORDER_* excepto TRADE_TRANSACTION_ORDER_ADD, donde el ticket de la posición no se ha adjudicado) y con la historia de las órdenes (TRADE_TRANSACTION_HISTORY_*).
      • position_by — ticket de la posición opuesta. Se usa al cerrar una posición con otra opuesta, abierta en el mismo instrumento, pero en dirección contraria. Se rellena solo para las órdenes de cierre de una posición con la opuesta (close by) y las operaciones de cierre con una opuesta (out by).

    11. Añadida la función PositionGetTicket, que retorna el ticket de la posición según el índice en la lista de posiciones abiertas y elige de forma automática esta posición para trabajar con ella posteriormente con la ayuda de las funciones PositionGetDouble, PositionGetInteger, PositionGetString.
      ulong  PositionGetTicket(
         int  index      // número en la lista de posiciones
         );
      

    12. Añadida la función PositionSelectByTicket, que elige una posicón abierta para trabajar posteriormente con ella según el ticket indicado.
      bool  PositionSelectByTicket(
         ulong   ticket     // ticket de la posición
         );
      

    13. A la enumeración de propiedades de los instrumentos comerciales ENUM_SYMBOL_INFO_DOUBLE se ha añadido el valor SYMBOL_MARGIN_HEDGED, el tamaño del contrato o margen para un lote de posiciones solapadas (posiciones opuestas de un símbolo).

      • Si para el instrumento se ha establecido un margen inicial (SYMBOL_MARGIN_INITIAL), entonces el margen cubierto se indica como valor absoluto (en dinero).
      • Si no se ha establecido un margen inicial (igual a 0), entonces en SYMBOL_MARGIN_HEDGED se indica el tamaño del contrato, que se usará al calcular el margen según la fórmula correspondiente el tipo de instrumento comercial (SYMBOL_TRADE_CALC_MODE).

      Las peculiaridades del cálculo del margen para las posiciones con cobertura se describen en la guía del usuario de la plataforma comercial MetaTrader 5.

    14. A la enumeración de las propiedades de la cuenta ENUM_ACCOUNT_INFO_INTEGER se ha añadido el valor ACCOUNT_MARGIN_MODE, el modo de cálculo del margen para la cuenta comercial actual:

      • ACCOUNT_MARGIN_MODE_RETAIL_NETTING se utiliza para el mercado no bursátil al registrar las posiciones en el modo "compensación" (en un símbolo puede haber solo una posición). El cálculo del margen se realiza basándose en el tipo de instrumento (SYMBOL_TRADE_CALC_MODE).
      • ACCOUNT_MARGIN_MODE_EXCHANGE se usa para el mercado bursátil. El cálculo del margen se realiza basándose en los descuentos indicados en los ajustes de los instrumentos. Los descuentos son establecidos por el bróker, pero no pueden ser inferiores a los valores determinados por la bolsa.
      • ACCOUNT_MARGIN_MODE_RETAIL_HEDGING se usa para el mercado no bursátil al realizarse el registro independiente de posiciones ("cobertura", en un símbolo pueden existir varias posiciones). El cálculo del margen se realiza basándose en el tipo de instrumento (SYMBOL_TRADE_CALC_MODE) y teniendo en cuenta el tamaño del margen cubierto (SYMBOL_MARGIN_HEDGED).

    15. A la enumeración de propiedades del terminal de cliente ENUM_TERMINAL_INFO_INTEGER se ha añadido el valor TERMINAL_SCREEN_DPI, la capacidad de resolución a la hora de mostrar información en la pantalla se mide por la cantidad de puntos por pulgada lineal de la superficie (DPI). El conocimiento de este parámetro permite definir las dimensiones de los objetos gráficos de tal forma que parezcan iguales en monitores con diferente capacidad de resolución.

    16. A la enumeración de propiedades del terminal de cliente ENUM_TERMINAL_INFO_INTEGER se ha añadido el valor TERMINAL_PING_LAST, el último valor conocido del ping hasta el servidor comercial en microsegundos. En un segundo hay millón de microsegundos.

    17. Corregido el retorno del resultado de la invocación de la función SendFTP. Antes, en caso de enviarse con éxito, retornaba el valor FALSE en lugar de TRUE.
    18. Corregido el error en la función StringConcatenate, que en ciertos casos provocaba el error de ejecución "Access violation".
    19. Corregida una serie de errores al trabajar con las funciones-plantilla.
    20. Ahora las funciones Print, Alert y Comment pueden mostrar líneas con un tamaño de 4000 símbolos.
    21. Corregido el error en la función ArrayCompare, que surgía al comparar la matriz consigo misma.
    22. Añadido a la biblioteca estándar el soporte del comercio con cobertura:

      CPosition
      Se han añadido los métodos:

      • SelectByMagic, elige una posición según el número mágico y el símbolo para trabajar posteriormente con ella.
      • SelectByTicket, elige una posición según el ticket para trabajar posteriormente con ella.

      CTrade
      Se han añadido los métodos:

      • RequestPosition, obtiene el ticket de la posición.
      • RequestPositionBy, obtiene el ticket de la posición opuesta.
      • PositionCloseBy, cierra una posición con la posición opuesta según el ticket indicado.
      • SetMarginMode, establece el modo de cálculo del margen de acuerdo con los ajustes de la cuenta actual.

      Se ha añadido la sobrecarga para los métodos:

      • PositionClose, cierra una posición según el ticket.
      • PositionModify, modifica la posición según el ticket.

      CAccountInfo
      Se han cambiado los métodos:

      • MarginMode, ahora obtiene el modo del cálculo del margen. Antes funcionaba de forma análoga al nuevo método StopoutMode.
      • MarginDescription, ahora obtiene el modo de cálculo del margen como línea. Antes funcionaba de forma análoga al nuevo método StopoutModeDescription.

      Se han añadido los métodos:

      • StopoutMode, obtiene el modo de establecimiento del nivel mínimo del margen.
      • StopoutModeDescription, obtiene el modo de establecimiento del nivel mínimo del margen como línea.

      CExpert
      Se han añadido los métodos:

      • SelectPosition, elige una posición para trabajar posteriormente con ella.

    23. Introducida una serie de cambios en la biblioteca estándar.
    24. Corregido el error de descarga de las bibliotecas DLL.
    25. Añadido el soporte de constructores de plantilla de las clases.

    Señales

    1. Corregida una serie de errores de representación del escaparate de señales.

    MetaEditor

    1. Corregida la búsqueda de una palabra por los archivos en el modo "Solo palabra completa".
    2. Añadido el paso a un archivo con un doble click en la línea del resultado de la compilación del archivo correspondiente.
    3. Corregida la representación de ciertos elementos de control en Windows XP.
    Se ha actualizado la documentación.
    1 abril 2016
    MetaTrader 5 build 1295

    Terminal

    1. Para ampliar las posibilidades de los tráders de fórex retail, se ha añadido a la plataforma un segundo sistema de registro: la cobertura. Ahora puede haber multitud de posiciones de un instrumento, incluidas las posiciones opuestas. Esto hace que sea posible poner en práctica estrategias comerciales con el llamado bloqueo: si el precio va en contra del tráder, este tiene la posibilidad de abrir una posición en la dirección opuesta.

      El nuevo sistema de registro es análogo al usado en MetaTrader 4, por lo que será algo familiar para los tráders. Además, los tráders podrán valerse de todas la ventajas de la quinta versión de la plataforma: ejecución de órdenes usando varias operaciones (incluyendo las parciales), el simulador multidivisa y de flujo múltiple con soporte de la red de cálculos MQL5 Cloud Network y mucho más.

      Ahora en una cuenta es posible comerciar en la bolsa, donde se usa la compensación y solo se puede tener una posición en un instrumento. Además, en la misma plataforma, pero en otra cuenta se puede comerciar en fórex y usar la cobertura.

      Cómo abrir una cuenta con cobertura y dónde mirar el tipo de registro de posición
      El tipo de registro de posición se establece a nivel de la cuenta, se muestra en el encabezamiento de la ventana del terminal, así como en el registro de actividad:


      Para abrir una cuenta demo con cobertura, active la opción correspondiente:



      Sistema de compensación
      Este sistema presupone que en un momento concreto, en la cuenta puede haber solo una posición abierta del mismo símbolo:

      • Si ya hay una posición en el instrumento, al realizarse una operación en la misma dirección, se produce un incremento del volumen de esta posición.
      • Al realizarse una operación en la dirección opuesta, tiene lugar la reducción del volumen de la posición existente, su cierre (al realizarse una operación con un volumen igual al de la posición actual) o bien el viraje (si el volumen de la operación opuesta es mayor al de la posición actual).


      En este caso, no tiene importancia como resultado de qué acción se realiza la operación en la dirección opuesta, si como fruto de la ejecución de una orden de mercado o debido a la activación de una orden pendiente.

      Más abajo mostramos un ejemplo de ejecución de dos operaciones de compra de EURUSD con un volumen de 0.5 cada una de ellas:

      Como resultado de la ejecución de estas operaciones, tenemos una posición general con un volumen de 1 lote.

      Sistema de cobertura
      Este sistema de registro de la posición permite tener multitud de posiciones comerciales de un mismo instrumento, incluso en direcciones diferentes.

      Si hay una posición abierta de un instrumento comercial y el tráder efectúa una nueva operación (o se activa una orden pendiente), se abre una nueva posición. La posición existente no cambia.

      Más abajo mostramos un ejemplo de ejecución de dos operaciones de compra de EURUSD con un volumen de 0.5 cada una de ellas:

      Como resultado de la ejecución de estas operaciones, tenemos la apertura de dos posiciones diferentes.

      Nuevo tipo de operación comercial Close By
      Para las cuentas con cobertura de registro de posiciones se ha añadido un nuevo tipo de operaciones comerciales: el cierre de una posición con una opuesta. Esta operación permite cerrar simultáneamente dos posiciones en direcciones opuestas de un mismo instrumento. Si las posiciones opuestas tienen una cantidad diferente de lotes, entonces quedará abierta solo una orden de las dos. Su volumen será igual a la diferencia de lotes de las dos posiciones cerradas, y la dirección de la posición y el precio de apertura serán como en la mayor (en volumen) de las posiciones cerradas.

      En comparación con el cierre individual de dos posiciones, el cierre por orden opuesta permite al tráder ahorrarse un spread:

      • Con el cierre individual, el tráder paga dos veces: cierra la compra al precio menor (Bid), y la venta, al mayor (Ask).
      • Con el cierre por orden opuesta, para cerrar la primera posición se usa el precio de apertura de la segunda posición, y para la segunda posición, el precio de apertura de la primera.

      Al cerrar la posición con otra opuesta se establece una orden del tipo "close by". En el comentario a la misma se indican los tickets de las posiciones cerradas. El cierre de una pareja de posiciones opuestas tiene lugar mediante dos operaciones del tipo "out by". La magnitud del beneficio/pérdida total obtenido como resultado del cierre de ambas posiciones, se indica solo en una de las operaciones.


    2. Añadida la posibilidad de testar los robots comerciales e indicadores técnicos según la historia de ticks real.

      La simulación y optimización sobre ticks reales son las más próximas a las condiciones reales. En lugar de los ticks generados basándose en los datos por minutos, se usan los ticks reales de los instrumentos financieros, acumulados por el bróker. Se trata de los ticks de la bolsa y de los proveedores de liquidez.

      Para comenzar la simulación u optimización según los ticks reales, elija el modo correspondiente en el simulador de estrategias:


      Los datos de tick tienen un tamaño significativamente mayor que los de minutos. Al realizarse el primer inicio de la simulación, su descarga puede ocupar bastante tiempo. Los datos de tick descargados se guardan por meses en archivos TKC en el catálogo \bases\[nombre del servidor comercial]\ticks\[nombre del símbolo]\.

      Peculiaridades de la simulación con ticks reales
      Al realizar la simulación con ticks reales, el spread en los límites de la barra de minutos puede cambiar, mientras que con la generación de ticks, dentro del minuto se usa un spread fijo en la barra correspondiente.

      Si se transmite la profundidad de mercado bursátil de un instrumento, las barras se construyen estrictamente según los precios de ejecución de la última operación Last. En caso contrario, el simulador intenta primero construir las barras con los precios Last, y solo si no los hay, usa los precios Bid. El evento de llegada de un tick OnTick se activa en todos los ticks, independientemente de si ha habido precio Last o no.

      Preste atención a que las operaciones comerciales siempre se realizan según los precios Bid y Ask, incluso si el gráfico se construye según los precios Last. Por ejemplo, un experto que use en el comercio solo los precios de apertura de barra (concretamente el Moving Average incorporado) recibirá la señal con un precio (Last), pero realizará la operación con otro (Bid o Ask dependiendo de la dirección). Al usar el modo de generación "Todos los ticks", las barras se construyen según los precios Bid, y las operaciones se realizan según Bid y Ask. Además, Ask se calcula como Bid + el spread fijo de la barra de minutos correspondiente.

      Si en la historia del símbolo hay una barra de minutos, pero no hay datos de tick de este minuto, el simulador generará los ticks en el modo "Todos los ticks". Esto permite poner a prueba el asesor en el perido planeado en el caso de que el bróker no disponga de datos de tick completos. Si en la historia del símbolo no hay barra de minutos, pero si existen datos de tick de ese minuto, entonces esos ticks se ignoran. Los datos de minutos se consideran más fiables.
      En este momento, la simulación y optimización con ticks reales son posibles solo en los agentes locales y remotos. El soporte de la red de cáculos en la nube MQL5 Cloud Network se añadirá próximamente.

    3. Añadido Chat. Ahora podrá hablar con sus amigos en MQL5.community directamente en la plataforma comercial. En el chat se muestran todos los mensajes de la cuenta MQL5. Para comenzar a hablar, entre en su cuenta directamente desde la ventana del chat o a través de los ajustes de la plataforma: Servicio -> Ajustes -> Comunidad.



    4. Simplificado la ventana de diálogo de apertura de la cuenta demo, añadida la posibilidad de abrir cuentas con cobertura. Ahora no es necesario rellenar un formulario enorme, basta con indicar los datos principales y elegir los parámetros comerciales: el tipo de cuenta, el depósito, el apalancamiento y la posibilidad de cobertura.


    5. Para comenzar a trabajar con la plataforma rápidamente, se ha añadido la selección automática de la cuenta demo. Si en la plataforma no hay ni una cuenta, entonces al iniciarla se destaca la cuenta demo en el primer servidor comercial disponible. Después de abrirse con éxito, la cuenta estará activada.

    6. Ahora cada posición tiene un ticket, un número único. Normalmente, corresponde al ticket de la orden como resultado de la cual se abrió la posición, excepto en los casos en los que el ticket ha cambiado debido a las operaciones de servicio en el servidor. Por ejemplo, el aumento de los swaps por la reapertura de posición. El ticket de todas las posiciones abiertas con anterioridad se designará después de actualizar hasta la nueva versión del terminal.



    7. Corregida la colocación de los niveles de Stop Loss y Take Profit al establecer una orden de mercado que provoca el cambio de dirección de la posición. Los niveles anteriormente correspondientes no se han establecido en la nueva posición.
    8. Corregida la representación de los precios con cuatro o más dígitos tras la coma en los elementos de control del panel de comercio con un click.
    9. Corregido el error de representación de una noticia en la ventana de vista previa antes de la impresión.
    10. Corregidos los errores de representación del gráfico de ticks.
    11. Corregida la apertura de la profundidad de mercado después de la finalización forzosa del trabajo del terminal.
    12. Añadida la posibilidad de comprobar si están permitidas las órdenes de mercado al representar los elementos de control del panel de comercio con un click.
    13. Optimizado el cálculo del beneficio y el margen con una gran cantidad de órdenes y posiciones abiertas.
    14. Añadida la traducción de la interfaz de usuario al malayo.
    15. Guía de usuario completamente actualizada. Un nuevo diseño, capturas de pantalla interactivas y vídeos tutoriales incorporados, todo para hacer el aprendizaje del comercio con MetaTrader 5 lo más sencillo y cómodo posible:


    MQL5

    1. Añadido el soporte de las clases abstractas y las funciones virtuales puras.

      Las clases abstractas están diseñadas para crear entidades genéricas, sobre cuya base se supone que se crearán clases derivadas más concretas en lo sucesivo. Una clase abstracta, es una clase que sólo puede ser utilizada como clase básica para alguna otra clase, por eso no se puede crear un objeto de tipo de clase abstracta.

      La clase que contenga aunque sea solo una función virtual pura, es abstracta. Por eso las clases derivadas de una clase abstracta deben implementar todas sus funciones virtuales puras, de lo contrario, también serán clases abstractas.

      Una función virtual se declara como "pura" con la ayuda de la sintaxis de un especificador puro. Veremos como ejemplo la clase CAnimal, que se crea solo para proporcionar las funciones generales, los propios objetos del tipo CAnimal tienen un carácter demasiado general para la aplicación práctica. De esta forma, la clase CAnimal es un buen candidato a clase abstracta:
      class CAnimal
        {
      public:
                            CAnimal();     // constructor
         virtual void       Sound() = 0;   // función virtual pura
      private:
         double             m_legs_count;  // número de patas del animal
        };
      
      Aquí la función Sound() es virtual pura, por eso se la declara con el especificador de función virtual pura PURE (=0).

      Las funciones virtuales puras son solo aquellas funciones virtuales para las que se indica el especificador puro  PURE, y  precisamente: (=NULL) o (=0). Ejemplo de declaración y uso de una clase abstracta:
      class CAnimal
        {
      public:
         virtual void       Sound()=NULL;   // PURE method, debe ser redefinido en la clase derivada, la propia clase CAnimal se ha convertido en abstracta y no puede ser creada
        };
      //--- derivada de la clase abstracta
      class CCat : public CAnimal
       {
      public:
        virtual void        Sound() { Print("Myau"); } // PURE es redefinido, la clase CCat no es abstracta y puede ser creada
       };
      
      //--- ejemplos de uso incorrecto
      new CAnimal;         // error 'CAnimal' - el compilador retorna el error "cannot instantiate abstract class"
      CAnimal some_animal; // error 'CAnimal' - el compilador retorna el error "cannot instantiate abstract class"
      
      //--- ejemplos de uso correcto
      new CCat;  // no hay error, la clase CCat no es abstracta
      CCat cat;  // no hay error, la clase CCat no es abstracta
      
      Limitaciones de uso de las clases abstractas
      Si el constructor de una clase abstracta invoca una función virtual pura (directa o indirectamente) el resultado es indefinido.
      //+------------------------------------------------------------------+
      //| Clase básica abstracta                                           |
      //+------------------------------------------------------------------+
      class CAnimal
        {
      public:
         //--- función virtual pura
         virtual void      Sound(void)=NULL;
         //--- función
         void              CallSound(void) { Sound(); }
         //--- constructor
         CAnimal()
          {
           //--- invocación directa del método virtual
           Sound();
           //--- invocación indirecta (a través de una tercera función)
           CallSound();
           //--- en el constructor y/o destructor siempre se invocan sus propias funciones,
           //--- a pesar del carácter virtual y de la redefinición de la función invocada en la derivada
           //--- si la función invocada es virtual pura, entonces
           //--- la invocación provocará el error de ejecución crítico: "pure virtual function call"
          }
        };
      
      Sin embargo, los constructores y destructores de las clases abstractas pueden invocar otras funciones miembro.

    2. Para que la organización de modelos de eventos sea más sencilla, se ha añadido el soporte de índices a una función.

      Para declarar un índice a una función, determine el tipo "índice a una función", por ejemplo:
      typedef int (*TFunc)(int,int);
      Ahora TFunc es un tipo y se puede declarar la variable-índice a una función:
      TFunc func_ptr;
      En la variable func_ptr se puede guardar la dirección de una función para invocarla más tarde:
      int sub(int x,int y) { return(x-y); }
      int add(int x,int y) { return(x+y); }
      int neg(int x)       { return(~x);  }
      
      func_ptr=sub;
      Print(func_ptr(10,5));
      
      func_ptr=add;
      Print(func_ptr(10,5));
      
      func_ptr=neg;           // error: neg no tiene el tipo  int (int,int)
      Print(func_ptr(10));    // error: tiene que haber dos parámetros
      
      Los índices a una función se pueden guardar y transmitir como parámetros. No es posible recibir un índice a un método de clase no estático.

    3. Se han añadido a la estructura de la solicitud comercial MqlTradeRequest dos nuevos campos:

      • position — ticket de la posición. Hay que rellenarlo al comerciar con cobertura, en caso de cambiar o cerrar una posición para su identificación inequívoca. Al comerciar con el sistema de compensación del registro de posiciones, rellenar esta campo no influye en nada, puesto que la identificación de la posición tiene lugar por el nombre del instrumento comercial.
      • position_by — ticket de la posición opuesta. Se usa al cerrar una posición con otra opuesta, abierta en el mismo instrumento, pero en dirección contraria. Solo se usa con el sistema de cobertura del registro de posiciones.

    4. A la enumeración de los tipos de operaciones comerciales ENUM_TRADE_REQUEST_ACTIONS se ha añadido TRADE_ACTION_CLOSE_BY, el cierre de una posición con la opuesta. Solo se usa con el sistema de cobertura del registro de posiciones.

    5. A la enumeración de las propiedades de las órdenes, operaciones y posiciones se han añadido los tickets de las operaciones comerciales:

      • A ENUM_ORDER_PROPERTY_INTEGER se ha añadido la propiedad ORDER_TICKET, el ticket de la orden. Un número único que se asigna a cada orden.
      • A ENUM_DEAL_PROPERTY_INTEGER se ha añadido la propiedad DEAL_TICKET, el ticket de la operación. Un número único que se asigna a cada operación.
      • A ENUM_POSITION_PROPERTY_INTEGER se ha añadido POSITION_TICKET, el ticket de la posición. Un número único que se asigna a cada posición abierta de nuevo. Normalmente, corresponde al ticket de la orden como resultado de la cual se abrió la posición, excepto en los casos en los que el ticket ha cambiado debido a las operaciones de servicio en el servidor. Por ejemplo, el aumento de los swaps por la reapertura de posición. Para encontrar la orden con la que se ha abierto la posición, se debe usar la propiedad POSITION_IDENTIFIER. El valor POSITION_TICKET corresponde a MqlTradeRequest::position.

    6. A la enumeración de los tipos de órdenes ENUM_ORDER_TYPE se ha añadido el valor ORDER_TYPE_CLOSE_BY, la orden de cierre de una posición con una posición opuesta.
    7. A la enumeración de los tipos de órdenes ENUM_ORDER_PROPERTY_INTEGER se ha añadido el valor ORDER_POSITION_BY_ID, el identificador de una posición opuesta para las órdenes del tipo ORDER_TYPE_CLOSE_BY.
    8. A la enumeración de las direcciones de una operación ENUM_DEAL_ENTRY se ha añadido el valor DEAL_ENTRY_OUT_BY, la operación ha tenido lugar como resultado del cierre de una posición por la opuesta.
    9. A la estructura de la transacción comercial MqlTradeRequest se han añadido dos campos análogos:

      • position — ticket de la posición a la que ha influido la transacción. Se rellena para las transacciones relacionadas con el procesamiento de las órdenes de mercado (TRADE_TRANSACTION_ORDER_* excepto TRADE_TRANSACTION_ORDER_ADD, donde el ticket de la posición no se ha adjudicado) y con la historia de las órdenes (TRADE_TRANSACTION_HISTORY_*).
      • position_by — ticket de la posición opuesta. Se usa al cerrar una posición con otra opuesta, abierta en el mismo instrumento, pero en dirección contraria. Se rellena solo para las órdenes de cierre de una posición con la opuesta (close by) y las operaciones de cierre con una opuesta (out by).

    10. Añadida la función PositionGetTicket, que retorna el ticket de la posición según el índice en la lista de posiciones abiertas y elige de forma automática esta posición para trabajar con ella posteriormente con la ayuda de las funciones PositionGetDouble, PositionGetInteger, PositionGetString.
      ulong  PositionGetTicket(
         int  index      // número en la lista de posiciones
         );
      

    11. Añadida la función PositionSelectByTicket, que elige una posicón abierta para trabajar posteriormente con ella según el ticket indicado.
      bool  PositionSelectByTicket(
         ulong   ticket     // ticket de la posición
         );
      

    12. A la enumeración de propiedades de los instrumentos comerciales ENUM_SYMBOL_INFO_DOUBLE se ha añadido el valor SYMBOL_MARGIN_HEDGED, el tamaño del contrato o margen para un lote de posiciones solapadas (posiciones opuestas de un símbolo).

      • Si para el instrumento se ha establecido un margen inicial (SYMBOL_MARGIN_INITIAL), entonces el margen cubierto se indica como valor absoluto (en dinero).
      • Si no se ha establecido un margen inicial (igual a 0), entonces en SYMBOL_MARGIN_HEDGED se indica el tamaño del contrato, que se usará al calcular el margen según la fórmula correspondiente el tipo de instrumento comercial (SYMBOL_TRADE_CALC_MODE).

      Las peculiaridades del cálculo del margen para las posiciones con cobertura se describen en la guía del usuario de la plataforma comercial MetaTrader 5.

    13. A la enumeración de las propiedades de la cuenta ENUM_ACCOUNT_INFO_INTEGER se ha añadido el valor ACCOUNT_MARGIN_MODE, el modo de cálculo del margen para la cuenta comercial actual:

      • ACCOUNT_MARGIN_MODE_RETAIL_NETTING se utiliza para el mercado no bursátil al registrar las posiciones en el modo "compensación" (en un símbolo puede haber solo una posición). El cálculo del margen se realiza basándose en el tipo de instrumento (SYMBOL_TRADE_CALC_MODE).
      • ACCOUNT_MARGIN_MODE_EXCHANGE se usa para el mercado bursátil. El cálculo del margen se realiza basándose en los descuentos indicados en los ajustes de los instrumentos. Los descuentos son establecidos por el bróker, pero no pueden ser inferiores a los valores determinados por la bolsa.
      • ACCOUNT_MARGIN_MODE_RETAIL_HEDGING se usa para el mercado no bursátil al realizarse el registro independiente de posiciones ("cobertura", en un símbolo pueden existir varias posiciones). El cálculo del margen se realiza basándose en el tipo de instrumento (SYMBOL_TRADE_CALC_MODE) y teniendo en cuenta el tamaño del margen cubierto (SYMBOL_MARGIN_HEDGED).

    14. A la enumeración de propiedades del terminal de cliente ENUM_TERMINAL_INFO_INTEGER se ha añadido el valor TERMINAL_SCREEN_DPI, la capacidad de resolución a la hora de mostrar información en la pantalla se mide por la cantidad de puntos por pulgada lineal de la superficie (DPI). El conocimiento de este parámetro permite definir las dimensiones de los objetos gráficos de tal forma que parezcan iguales en monitores con diferente capacidad de resolución.

    15. A la enumeración de propiedades del terminal de cliente ENUM_TERMINAL_INFO_INTEGER se ha añadido el valor TERMINAL_PING_LAST, el último valor conocido del ping hasta el servidor comercial en microsegundos. En un segundo hay millón de microsegundos.

    16. Corregido el retorno del resultado de la invocación de la función SendFTP. Antes, en caso de enviarse con éxito, retornaba el valor FALSE en lugar de TRUE.
    17. Corregido el error en la función StringConcatenate, que en ciertos casos provocaba el error de ejecución "Access violation".
    18. Corregida una serie de errores al trabajar con las funciones-plantilla.
    19. Ahora las funciones Print, Alert y Comment pueden mostrar líneas con un tamaño de 4000 símbolos.
    20. Corregido el error en la función ArrayCompare, que surgía al comparar la matriz consigo misma.
    21. Añadido a la biblioteca estándar el soporte del comercio con cobertura:

      CPosition
      Se han añadido los métodos:

      • SelectByMagic, elige una posición según el número mágico y el símbolo para trabajar posteriormente con ella.
      • SelectByTicket, elige una posición según el ticket para trabajar posteriormente con ella.

      CTrade
      Se han añadido los métodos:

      • RequestPosition, obtiene el ticket de la posición.
      • RequestPositionBy, obtiene el ticket de la posición opuesta.
      • PositionCloseBy, cierra una posición con la posición opuesta según el ticket indicado.
      • SetMarginMode, establece el modo de cálculo del margen de acuerdo con los ajustes de la cuenta actual.

      Se ha añadido la sobrecarga para los métodos:

      • PositionClose, cierra una posición según el ticket.
      • PositionModify, modifica la posición según el ticket.

      CAccountInfo
      Se han cambiado los métodos:

      • MarginMode, ahora obtiene el modo del cálculo del margen. Antes funcionaba de forma análoga al nuevo método StopoutMode.
      • MarginDescription, ahora obtiene el modo de cálculo del margen como línea. Antes funcionaba de forma análoga al nuevo método StopoutModeDescription.

      Se han añadido los métodos:

      • StopoutMode, obtiene el modo de establecimiento del nivel mínimo del margen.
      • StopoutModeDescription, obtiene el modo de establecimiento del nivel mínimo del margen como línea.

      CExpert
      Se han añadido los métodos:

      • SelectPosition, elige una posición para trabajar posteriormente con ella.

    22. Introducida una serie de cambios en la biblioteca estándar.

    Señales

    1. Corregida una serie de errores de representación del escaparate de señales.

    Tester

    1. Corregido el error como resultado del cual no se calculaba la comisión en ciertos tipos de instrumentos comerciales.
    2. Corregido el rellenado del campo Expert de las órdenes comerciales que aparecían como resultado de la activación de SL/TP, de acuerdo con el campo Expert en las posiciones correspondientes. Antes no se rellenaba.
    3. Corregido el cambio a la pestaña de resultados de la optimización normal y en tiempo real.
    4. Corregido el cálculo y representación del indicador "Envelopes".
    5. Optimizada la ejecución del testing visual.
    6. Optimizado el cálculo del beneficio y el margen con una gran cantidad de órdenes y posiciones abiertas.
    7. Optimizada la ejecución de las operaciones comerciales en el comercio de alta frecuencia.
    8. Ahora la sincronización de la historia no se realiza al solicitar las propiedades de un símbolo secundario, que no exigen las cotizaciones actuales. Por ejemplo,  SYMBOL_SELECT, SYMBOL_DIGITS, SYMBOL_SPREAD_FLOAT, SYMBOL_TRADE_CALC_MODE, SYMBOL_TRADE_MODE, SYMBOL_TRADE_STOPS_LEVEL, SYMBOL_TRADE_FREEZE_LEVEL, SYMBOL_TRADE_EXEMODE, etcétera. Antes, al solicitarse cualquier propiedad de un símbolo secundario, se sincronizaba la historia de dicho símbolo.

    MetaEditor

    1. Corregida la búsqueda de una palabra por los archivos en el modo "Solo palabra completa".
    2. Añadido el paso a un archivo con un doble click en la línea del resultado de la compilación del archivo correspondiente.
    3. Corregida la representación de ciertos elementos de control en Windows XP.

     

    1. Se ha actualizado la documentación.
    17 diciembre 2015
    MetaTrader 5 build 1240: Aumento de la velocidad de funcionamiento y vídeos incorporados

    Virtual Hosting

    1. En la ventana de diálogo para destacar el servidor virtual se ha añadido el enlace al vídeo didáctico "Cómo alquilar una plataforma virtual". Vea este vídeo de dos minutos y sepa lo sencillo que es iniciar un robot comercial o el copiado de señales en el modo 24 horas al día, 7 días a la semana.


      Este y otros muchos vídeos están disponibles en el canal oficial de MetaQuotes Software Corp. en YouTube.
    2. Corregido el error de migración al hosting al darse la llamada de un indicador personalizado o de la biblioteca EX5 en un indicador personalizado, que a su vez se llama desde el experto.

    Terminal

    1. Aumentada la velocidad de actualización de la lista de órdenes y posiciones abiertas al realizar operaciones comerciales con gran frecuencia (50 operaciones por segundo o más).
    2. Optimizada y acelerada significativamente la sincronización inicial del terminal con el servidor comercial con grandes cantidades (decenas de miles) de instrumentos comerciales. Ahora, después de activarla, usted podrá trabajar más rápido.
    3. Optimizado y reducido sustancialmente el gasto de memoria del terminal.
    4. Añadido el guardado y restablecimiento de los ajustes de la profundidad de mercado al cerrar/abrir el terminal.
    5. Corregidos los artefactos que surgían en Windows 10 al arrastrar las ventanas del terminal.
    6. Corregido el funcionamiento del menú de contexto de ayuda para una serie de comandos y diálogos. Para mostrar la ayuda sobre un elemento concreto, coloque el cursor sobre él y pulse F1.
    7. Se han continuado los trabajos de adaptación del interfaz al funcionamiento de las pantallas de alta defición (4K).

    MQL5

    1. Añadidas nuevas propiedades para las funciones de obtención de información sobre órdenes y operaciones OrderGetString, HistoryOrderGetString y HistoryDealGetString:

      • ORDER_EXTERNAL_ID - identificador de la orden en el sistema comercial externo (en la bolsa).
      • DEAL_EXTERNAL_ID - identificador de la operación en el sistema comercial externo.

    2. Corregido el funcionamiento de la función ZeroMemory al trabajar con estructuras y clases. En ciertos casos, no se realizaba la limpieza de la memoria.
    3. Añadidos los códigos de error al trabajar con la función SendFTP. La función envía el archivo a la dirección indicada en la ventana de ajustes, en la pestaña "FTP".

      • ERR_FTP_NOSERVER - no se ha indicado el servidor ftp en los ajustes
      • ERR_FTP_NOLOGIN - no se ha indicado el login ftp en los ajustes
      • ERR_FTP_FILE_ERROR - el archivo no existe
      • ERR_FTP_CONNECT_FAILED - no ha sido posible conectarse al servidor ftp
      • ERR_FTP_CHANGEDIR - en el servidor ftp no se ha encontrado el directorio para cargar el archivo
      • ERR_FTP_CLOSED - la conexión al servidor ftp está cerrada

    4. Corregida la comprobación sobre la accesibilidad de la colocación de objetos por herencia de descendientes a antepasados.
    5. Corregida una serie de errores en las plantillas de las clases.
    6. Corregido el error al solicitar los ticks de las funciones CopyTicks. Al indicar el parámetro COPY_TICKS_TRADE (copiar solo los ticks comerciales) para los ticks comerciales iguales que van de forma consecutiva (con el mismo volumen y el mismo precio last) solo se daba el primero de ellos.
    7. Corregido el error a la hora de determinar el tamaño de la variable de tipo personalizado.
    8. Corregido el error de uso de ZLib en la función CryptDecode, que provocaba un ciclo descompresión infinito.

    Tester

    1. Corregido el error de sincronización de la historia de precios según un instrumento comercial diferente al instrumento principal de testado.
    2. Corregida la duplicación de la transacción comercial TRADE_TRANSACTION_DEAL_ADD (adición de la operación a la historia) en el procesamiento de los eventos OnTradeTransaction.
    3. Se ha añadido al Asistente MQL5 el enlace al vídeo didáctico "Cómo montar un robot comercial en el Asistente MQL5". Vea este vídeo de 3 minutos y cree su propio robot comercial, sin escribir una sola línea de código.


      Este y otros muchos vídeos están disponibles en el canal oficial de MetaQuotes Software Corp. en YouTube.
    4. Modificado el comportamiento de los forward-test durante la optimización genética. Ahora en los pases forward participan todos los resultados únicos, obtenidos después de la optimización genética. Antes solo se usaba un 1/4 de los resultados.

    MetaEditor

    1. Corregido el funcionamiento de los comandos de puesta en orden de las ventanas abiertas, si una de las ventanas está completamente desplegada. A través del menú "Ventana", los archivos abiertos se pueden disponer en forma de mosaico, verticalmente, horizontalmente y en forma de cascada.
    2. MetaEditor: Se han continuado los trabajos de adaptación del interfaz al funcionamiento de las pantallas de alta defición (4K).
    Se ha actualizado la documentación.
    30 octubre 2015
    MetaTrader 5 build 1210: Mejoras de la Profundidad del Mercado y correcciones generales

    Terminal

    1. Ha sido añadida la posibilidad de colocar las órdenes limitadas peores del mercado en la Profundidad del Mercado. Esto permite conseguir la ejecución garantizada de la orden por el precio especificado en los mercados bursátiles.

      Si arrastra una orden limitada por el límite de las peticiones de compra y venta, ésta se cambiará por una orden Stop (Buy Limit se cambia por Buy Stop, Sell Limit se cambia por Sell Stop). Para que la orden limitada no se cambie por una orden Stop, mantenga pulsada la tecla Crtl durante el arrastre.




    2. En los ajustes del gráfico ha sido añadida la opción “Mostrar botones del trading rápido”. Esta opción permite ocultar los botones de la llamada del panel de trading rápido y de la Profundidad del Mercado desde el gráfico.



    3. Ha sido corregido el error que a veces provocaba los conflictos de los tooltips con otras aplicaciones.

    MQL5

    1. Ha sido corregido el trabajo de las funciones del copiado de datos históricos Copy* con los arrays dinámicos con la bandera AS_SERIES. La bandera se coloca por la función ArraySetAsSeries e indica que la indexación de los elementos del array va a realizarse como en las series temporales.
    2. Ha sido corregida la propiedad CHART_SHOW_ONE_CLICK para el trabajo de la cual se utiliza ChartSetInteger y ChartGetInteger. Antes esta propiedad permitía mostrar/ocultar el panel de trading rápido en el gráfico. Ahora ella muestra y oculta adicionalmente los botones de la llamada del panel de trading rápido y de la Profundidad del Mercado (análogo de la opción “Mostrar botones del trading rápido” en los ajustes del gráfico).
    3. Han sido corregidos algunos errores en el funcionamiento de las plantillas.
    La documentación ha sido actualizada.


    23 octubre 2015
    MetaTrader 5 build 1200: obtención de la historia de tics y pago directo de los servicios

    Terminal

    1. Añadido el trabajo con la historia de tics a la observación del mercado. Si antes el gráfico de tics solo mostraba la historia acumulada en el terminal durante el funcionamiento del mismo, ahora está disponible el acceso a la historia de tics completa en el servidor comercial. Desactive el auto scroll y comience a desplazarse por el gráfico de tics hacia atrás hasta aspectos pasados, con ayuda del ratón, para cargar desde el servidor comercial la historia que falte, igual que se hace con los gráficos de precio habituales. El nuevo funcional será útil para los traders que quieran conseguir gráficos de cambio de precio detallados al máximo.



      Para obtener automáticamente una historia de tics más profunda, use la función CopyTicks(), su funcionamiento ha sido modificado de tal forma que solicite y cargue la historia que falta, en caso de que esta se encuentre disponible en el servidor comercial.

    2. Añadido un icono de activación/desactivación rápida de la profundidad de mercado, se encuentra junto al panel "Comercio con un click". También podrá usar la nueva combinación de teclas de acceso rápido Alt+B, que funciona, no solo en el propio gráfico, sino también en la ventana Market Watch, en este caso, se abre la profundidad de mercado del símbolo que haya sido destacado en la Observación del mercado.




    3. Las características de la computadora y el sistema operativo se guardan ahora en el registro al inicio del terminal de cliente. Ejemplo:
      2015.10.14 14:48:18.486	Data Folder: C:\Program Files\MetaTrader 5
      2015.10.14 14:48:18.486	Windows 7 Professional (x64 based PC), IE 11.00, UAC, 8 x Intel Core i7  920 @ 2.67GHz, RAM: 8116 / 12277 Mb, HDD: 534262 / 753865 Mb, GMT+03:00
      2015.10.14 14:48:18.486	MetaTrader 5 build 1190 started (MetaQuotes Software Corp.)
    4. Mejorado el trabajo con los símbolos en la "Observación del mercado" (Market Watch):

      • Añadida la muestra del número de símbolos en Market Watch y de la cantidad total de símbolos disponibles en el servidor comercial
      • Añadida la línea de adición de un nuevo símbolo con la lista de selección inteligente
      • La búsqueda en la línea de símbolo nuevo se realiza, no solo por el nombre del símbolo, sino también por su descripción y nombre internacional.




    5. Añadido el soporte de calendario de eventos económicos en varias lenguas.
    6. Añadidos los iconos de los pictogramas de los países que faltaban en el calendario económico.
    7. Añadidas las teclas de acceso rápido para abrir la ventana de gestión de los símbolos en la Observación de mercado - Ctrl+U.
    8. Corregida la puesta en orden de las ventanas abiertas de los gráficos con los comandos en el menú "Window".
    9. Corregido el error cuando el terminal en ciertos casos no podía encontrar el archivo de certificado al usar la autenticación ampliada.
    10. Corregido el error que provocaba en ciertos casos un bucle en la sincronización de la historia de precios.
    11. Corregido el error que causaba el inicio de los niveles StopLoss/TakeProfit de una posición anteriormente abierta al aumentar su volumen, si se comerciaba con el instrumento en el modo Request Execution.
    12. En la profundidad de mercado se ha corregido la comprobación de la posibilidad de emitir una orden de compra en caso de que hubiese una posición larga de los instrumentos con el modo de comercio "Long only".
    13. Corregido el funcionamiento de la función Trailing Stop. En ciertos casos raros, un Stop Loss protector para una posición abierta podía moverse incorrectamente.
    14. Se han continuado los trabajos de adaptación del interfaz al funcionamiento de las pantallas de alta defición (4K).
    15. Corregido el error que provocaba la descarga de los datos históricos como no utilizados, a pesar de las solicitudes reiteradas a los datos por parte de los programas MQL5.
    16. Corregida la representación de una serie de elementos del interfaz de usuario al trabajar con Windows 10.
    17. Actualizadas las traducciones del interfaz de usuario.

    Market

    1. Revisado y optimizado el funcionamiento con la base de productos MQL5 Market.
    2. Añadida la prohibición de compra sin cuenta MQL5.community al usar el terminal en el entorno de la máquina virtual. Ahora para comprar es necesario indicar la cuenta en MQL5.community en los ajustes del terminal: Servicio - Ajustes - Comunidad.
    3. Añadida la compra directa de productos con ayuda del sistema de pago UnionPay.
    4. Añadido el historial ampliado al comprar productos en MQL5 Market.

    Virtual Hosting y Signals

    1. Hosting y Signals: Ahora el hosting virtual y la suscripción a las señales comerciales se pueden pagar directamente a través de los sistemas de pago.

      Para pagar el hosting no es obligatorio entrar en MQL5.community y recargar saldo. Ahora usted puede pagar sin más el servicio en uno de los sistemas de pago, directamente en la plataforma.



      Elija el sistema que necesite y realice el pago:




      De una forma igualmente directa, puede usted formalizar una suscripción de pago a señales comerciales directamente desde el terminal, solo tiene que elegir un sistema de pago cómodo para usted.




      La suma necesaria será transferida al principio a su cuenta MQL5.community, y desde allí se efectuará el pago. De esta forma, usted siempre podrá disponer de una historia transparente de hostings alquilados y suscripciones a las señales, pudiendo ver, además, todos sus pagos por los servicios de MQL5.community.
    2. Hosting: Añadida la gestión del hosting virtual (excepto la migración) al trabajar con la versión de 32 bits del terminal de cliente.
    3. Hosting: Corregida la migración de los ajustes de la exportación de FTP al hosting virtual, independientemente del permiso de publicación vía FTP.

    MQL5

    1. Activado un nuevo compilador de optimización. La velocidad de ejecución de programas en las plataformas de 64 bits se ha multiplicado por 5. Los programas de MQL5 deben ser compilados de nuevo en la última versión de MetaEditor.
    2. Ampliado el formato de la estructura MqlTick. En esta, ahora se transmite la hora de llegada del tic en milisegundos, así como las banderas que permiten determinar qué parámetro del tic ha cambiado precisamente.
      struct MqlTick
        {
         datetime     time;          // Hora de la última actualización de los precios
         double       bid;           // Precio Bid actual
         double       ask;           // Precio Ask actual
         double       last;          // Precio actual de la última transacción (Last)
         ulong        volume;        // Volumen para el precio Last actual
         long         time_msc;      // Hora de la última actualización de los precios en milisegundos
         uint         flags;         // Banderas de los tics
        };
      Todos los parámetros de cada tic siempre se llenan, independientemente de si han cambiado los datos en comparación con el tic anterior. Esto permite tener siempre el estado actual de los precios en cualquier momento, sin buscar los valores anteriores en la historia de tics. Por ejemplo, con el tic solo ha podido cambiar el precio bid, pero en la estructura, aparte del nuevo precio, se mostrarán también todos los demás parámetros: el precio anterior ask, el volumen, etcétera. Para saber qué datos precisamente han cambiado con el tic actual, analice sus banderas:

      • TICK_FLAG_BID - el tic ha cambiado el precio bid
      • TICK_FLAG_ASK  - el tic ha cambiado el precio ask
      • TICK_FLAG_LAST - el tic ha cambiado el precio de la última transacción
      • TICK_FLAG_VOLUME - el tic ha cambiado el volumen
      • TICK_FLAG_BUY - el tic ha aparecido como resultado de una transacción de compra
      • TICK_FLAG_SELL - el tic ha aparecido como resultado de una transacción de venta

      La estructura MqlTick se usa en dos métodos:
      • CopyTicks - el método no proporciona soporte al viejo formato de estructura. Los archivos EX5 compilados anteriormente, que usan el antiguo formato de tic, al llamar la función CopyTicks retornarán el error 4006 (ERR_MQL_INVALID_ARRAY).
      • SymbolInfoTick - el método proporciona soporte tanto al viejo formato de estructura, como al nuevo.

    3. Añadidas las plantillas de clases que permiten crear clases parametrizadas como en C++. Esto permitirá lograr una mayor abstracción y usar el mismo código para trabajar de una manera uniforme con objetos de diferentes clases. Ejemplo de uso:
      //+------------------------------------------------------------------+
      //|                                                    TemplTest.mq5 |
      //|                        Copyright 2015, MetaQuotes Software Corp. |
      //|                                             https://www.mql5.com |
      //+------------------------------------------------------------------+
      #property copyright "Copyright 2015, MetaQuotes Software Corp."
      #property link      "https://www.mql5.com"
      #property version   "1.00"
      //+------------------------------------------------------------------+
      //| Anunciamos la plantilla de clase                                 |
      //+------------------------------------------------------------------+
      template<typename T>
      class TArray
        {
      protected:
         T                 m_data[];
      
      public:
      
         bool              Append(T item)
           {
            int new_size=ArraySize(m_data)+1;
            int reserve =(new_size/2+15)&~15;
            //---
            if(ArrayResize(m_data,new_size,reserve)!=new_size)
               return(false);
            //---
            m_data[new_size-1]=item;
            return(true);
           }
         T                 operator[](int index)
           {
            static T invalid_index;
            //---
            if(index<0 || index>=ArraySize(m_data))
               return(invalid_index);
            //---
            return(m_data[index]);
           }   
        };
      //+------------------------------------------------------------------+
      //| La plantilla de clase de la matriz de indicadores,               |
      //| en el destructor elimina aquellos objetos a los que se referían  |
      //| los indicadores guardados en la matriz.                          |
      //| Preste atención a la herencia de la clase de plantilla TArray    |
      //+------------------------------------------------------------------+
      template<typename T>
      class TArrayPtr : public TArray<T *>
        {
      public:
         void             ~TArrayPtr()
           {
            for(int n=0,count=ArraySize(m_data);n<count;n++)
               if(CheckPointer(m_data[n])==POINTER_DYNAMIC)
                  delete m_data[n];
           }
        };
      //+------------------------------------------------------------------+
      //| Anunciamos la clase, los indicadores a sus objetos               |
      //| los guardaremos en la matriz                                     |
      //+------------------------------------------------------------------+
      class CFoo
        {
         int               m_x;
      public:
                           CFoo(int x):m_x(x) { }
         int               X(void) const { return(m_x); }
        };
      //+------------------------------------------------------------------+
      //|                                                                  |
      //+------------------------------------------------------------------+
      TArray<int>     ExtIntArray;   // instanciamos la plantilla TArray (especializamos la plantilla TArray con el tipo int)
      TArray<double>  ExtDblArray;   // instanciamos la plantilla TArray (especializamos la plantilla TArray con el tipo double)
      TArrayPtr<CFoo> ExtPtrArray;   // instanciamos la plantilla TArrayPtr (especializamos la plantilla TArrayPtr con el tipo CFoo)
      //+------------------------------------------------------------------+
      //| Script program start function                                    |
      //+------------------------------------------------------------------+
      void OnStart()
        {
      //--- llenamos las matrices con datos
         for(int i=0;i<10;i++)
           {
            int integer=i+10;
            ExtIntArray.Append(integer);
            
            double dbl=i+20.0;
            ExtDblArray.Append(dbl);
            
            CFoo *ptr=new CFoo(i+30);
            ExtPtrArray.Append(ptr);
           }
      //--- generamos el contenido de las matrices
         string str="Int:";
         for(int i=0;i<10;i++)
            str+=" "+(string)ExtIntArray[i];      
         Print(str);   
         str="Dbl:";
         for(int i=0;i<10;i++)
            str+=" "+DoubleToString(ExtDblArray[i],1);
         Print(str);   
         str="Ptr:";
         for(int i=0;i<10;i++)
            str+=" "+(string)ExtPtrArray[i].X();      
         Print(str);
      //--- no es necesario eliminar los objetos CFoo creados a través de new, se eliminan en el destructor del objeto TArrayPtr<CFoo>  
        }
      Resultado de la ejecución:
      TemplTest (EURUSD,H1)    Int: 10 11 12 13 14 15 16 17 18 19
      TemplTest (EURUSD,H1)    Dbl: 20.0 21.0 22.0 23.0 24.0 25.0 26.0 27.0 28.0 29.0
      TemplTest (EURUSD,H1)    Ptr: 30 31 32 33 34 35 36 37 38 39

    4. Añadidas las nuevas operaciones * y & - respectivamente, para obtener la variable según el enlace y para obtener el enlace a la variable.
    5. Añadida la forma sobrecargada de la función ObjectsDeleteAll - borra todos los objetos del tipo indicado, según el prefijo del nombre en la subventana del gráfico.
      int  ObjectsDeleteAll(
         long           chart_id,   // indentificador del gráfico
         const string     prefix,   // prefijo del nombre del objeto
         int       sub_window=-1,   // índice de la ventana
         int      object_type=-1    // tipo del objeto a eliminar
         );

    6. Corregido el funcionamiento de la función ObjectGetValueByTime. Antes, en ciertos casos (por ejemplo, para la línea de tendencia horizontal) se retornaba de foma incorrecta el valor del precio según la hora en el gráfico.
    7. Corregido el funcionamiento de las funciones Copy* en ausencia de datos históricos en el servidor. Antes, en ausencia de datos en el servidor, la llamada de estas funciones provocaba un retraso de 30-50 segundos a la hora de recuperar el control.
    8. Realizada una serie de correcciones en la biblioteca estándar MQL5.
    9. La documentación sobre la Biblioteca estándar se ha traducido al alemán, francés, chino, turco, español y portugués.
    10. Añadida la documentación MQL5 en japonés.

    Tester

    1. Ahora elegir un programa para iniciar en el simulador de estrategias es basntante más fácil. La lista se muestra en forma de árbol, de acuerdo con los catálogos en los que se encuentran los asesores e indicadores.




    2. La representación de ciertos indicadores durante el testado visual se ha adecuado al terminal de cliente.
    3. Corregido el error de establecimiento del apalancamiento y del marco temporal del gráfico durante la depuración de programas MQL5 a através del simulador de estrategias.
    4. Corregida la depuración de los indicadores al simular sobre datos históricos.

    Correciones de crash logs.

    Se ha actualizado la documentación.
    3 junio 2015
    MetaTrader 5 build 622: ¡Comprar robots en el Mercado es ahora más fácil y rápido!

    Ahora es posible comprar cualquier aplicación en el Mercado en un solo paso, sin registrarse directamente en las plataformas MetaTrader 4/5. Para ello solo es necesario pulsar el botón "Comprar" y elegir el sistema de pago conveniente.


    Después de esto, usted será redirigido a la página del sistema de pago, donde podrá realizar la compra. PayPal, WebMoney, Neteller o tarjeta bancaria, pague por sus compras en la tienda de robots e indicadores preparados usando el método que más le convenga.


    Después de comprar, recomendamos de todas formas registrar una cuenta en MQL5.community, su compra quedará automáticamente ligada a ella. Así, usted tendrá la posibilidad de actualizar el producto e instalarlo en otros ordenadores. Además, la cuenta MQL5.community le abrirá acceso a usted a multitud de otros servicios para la plataforma MetaTrader, a las señales comerciales, para copiar transacciones de traders de éxito, al hosting virutal, para que sus aplicaciones puedan funcionar de manera ininterrumpida y al servicio freelance, con el que podrá encargar robots exclusivos a los desarrolladores.

    Ahora seguro que ya sabe el modo más rápido y simple de obtener un robot comercial. ¡Más de 5 000 aplicaciones diferentes para MetaTrader ya le están esperando en el Mercado, elija y compre!


    25 mayo 2015
    MetaTrader 5 build 1150: Compras sencillas en el Market, depuración a base del historial y la fuente de operaciones
    MetaTrader 5 Client Terminal build 1150
    1. Market: Presentamos el nuevo mecanismo de compras “directamente”. Ahora es aún mucho más fácil comprar un robot comercial en el Market, y para eso ni siquiera necesita tener una cuenta en MQL5.community.

      Compra con un paso
      Para realizar la compra, no hace falta entrar en MQL5.community y hacer depósito en la cuenta. Ahora puede pagar por el producto elegido utilizando uno de los sistemas de pago directamente dentro de la plataforma. Para que Usted tenga siempre un historial de compras en el Market transparente y claro, en vez de buscarlas en diferentes sistemas de pago, el importe necesario primero va a depositarse en su cuenta MQL5.community, y luego este importe se descontará de su cuenta en concepto del pago por el producto seleccionado.

      De esta manera, Usted siempre podrá ver sus pagos a través de su perfil en MQL5.community.




      Compra sin registrarse
      Ahora Usted puede realizar sus compras en el Market sin tener una cuenta abierta en MQL5.community. Simplemente haga clic en “Comprar” y pague su producto a través de uno de los sistemas de pago disponibles.



      Después de pulsar este botón, será redirigido a la página del sistema de pago seleccionado donde podrá finalizar su compra.



      Le recomendamos insistentemente que abra una cuenta en MQL5.community, y su compra será vinculada automáticamente a ella. Así podrá actualizar el producto e instalarlo en otros ordenadores.

    2. Editor: Ha sido añadida la posibilidad de depurar los Asesores Expertos (EAs) e indicadores basándose en los datos históricos. Antes el proceso de depuración se realizaba sólo a base de los gráficos que se actualizaban en tiempo real.

      Ahora Usted puede comprobar el funcionamiento del programa en una parte del historial que le interesa. La depuración se realiza en el modo de simulación visual en el Probador de Estrategias. El programa se inicia en el gráfico que se construye según la secuencia de los ticks modelada en el Probador de Estrategias.

      Establezca los parámetros necesarios para la depuración en los ajustes de MetaEditor: símbolo, marco temporal, intervalo, modos de ejecución y generación de ticks, depósito inicial y apalancamiento. La simulación visual será iniciada precisamente con estos parámetros.



      Coloque los puntos de interrupción en el código del programa y luego inicie la depuración a base de datos históricos.



      Después de eso, se iniciará las simulación visual y se empezará el proceso de depuración.




    3. Hosting: En el trabajo del “Hosting virtual” han sido agregadas muchas mejoras y correcciones.

      La mayor parte de modificaciones se refieren al trabajo en Wine en los ordenadores con sistemas operativos Linux y Mac OS. Ahora el servidor virtual se selecciona exitosamente y Usted puede trabajar con él en modo normal: realizar la migración, controlar el consumo de recursos y ver los logs.


      El trabajo con el diario también se ha cambiado. Si se solicita una cantidad de entradas demasiado grande, se carga sólo una parte de las primeras entradas para el período especificado. Eso previene la reducción del rendimiento si los logs son demasiado grandes. Ahora, para cargar las entradas más antiguas, ya no hace falta cambiar las fechas de la solicitud, sólo hay que seleccionar la última fila en la ventana y pulsar la tecla PgDn.




    4. Terminal: Ha sido añadido el soporte de un tipo especial de los instrumentos no tradeables que pueden ser utilizados como los activos que cubren las posiciones abiertas de otros instrumentos financieros. Por ejemplo, el trader puede tener en su depósito un determinado volumen de oro en modo físico y utilizarlo como fianza para las posiciones abiertas.

      Estos activos se visualizan en forma de posiciones abiertas y su coste se determina según la siguiente fórmula: Contract size * Lots * Market Price * Liquidity Rate, donde:

      • Contract size - tamaño del contrato
      • Lots - volumen en lotes
      • Market Price - precio actual en el mercado del instrumento
      • Liquidity Rate - coeficiente de liquidez (una parte del coste del activo que el broker permite usar para la fianza)


      Los activos (Assets) se suman a fondos propios (Equity) y aumentan el tamaño del margen libre (Free Margin), lo que permite aumentar los volúmenes de las operaciones comerciales realizadas en la cuenta.

      De esta manera, ha surgido la posibilidad de crear las cuentas con diferentes tipos de cobertura.


      En el ejemplo de arriba el trader tiene 1 onza de oro que según el precio actual del mercado vale 1 210,56 USD. Este valor se suma a los fondos propios y al margen libre. De esta manera, el trader puede seguir operando incluso con el balance cero.

    5. Terminal: Nueva Profundidad del Mercado (DOM) con el gráfico de ticks y visualización de la fuente de operaciones Time&Sales en el gráfico.

      Ahora en la DOM para los instrumentos bursátiles, para los que se transmiten los precios reales de las operaciones, se muestra el gráfico de ticks. En este gráfico se muestran todas las transacciones concertadas en la bolsa:

      • Círculos rojos - operaciones de venta
      • Círculos azules - operaciones de compra
      • Círculos verdes - la dirección de la operación no está determinada. Se utiliza cuando la bolsa no transmite la dirección de las operaciones. En este caso, la dirección se determina según el precio de la operación respecto a los precios Ask y Bid. La compra - si la operación se ha realizado por el precio Ask o mayor, la venta - si se ha realizado por el precio Bid o menor. La dirección se considera indeterminada si el precio de la operación se encuentra entre Bid y Ask.

      Cuanto más grande sea el tamaño del círculo, mayor será el volumen de la operación realizada. Además, los volúmenes de las operaciones se muestran en forma del histograma debajo del gráfico de ticks.



      Arriba y abajo se muestran los volúmenes totales de las ofertas de compra y de venta.

    6. Terminal: En el cuadro de la selección de los símbolos ha sido agregada la columna en la que se muestra la fecha de expiración del instrumento financiero, así como la opción para ocultar los símbolos expirados. Además, ha sido agregado el reemplazo de los contratos vencidos por los actuales.



      Para una visualización más compacta, en la lista se ocultan todos los instrumentos con el plazo de vigencia expirado. Es muy cómodo para el trabajo en el mercado rápido. El instrumento no actual se considera el instrumento con el plazo de vigencia expirado que se determina según el parámetro “Último día de invocación”. Esta fecha se indica en la lista de los símbolos en la columna “Expiración”. Para ver todos los símbolos, active la opción “Mostrar contratos expirados”.

      Por razones de conveniencia, las lista de los símbolos se ordena automáticamente:

      • primero van los instrumentos sin fecha de expiración
      • luego, con fecha de expiración empezando con la fecha más reciente
      • luego, los símbolos expirados empezando con el último símbolo expirado
      • les siguen los símbolos según el orden alfabético

      Para el reemplazo automático de los símbolos expirados por los actuales, en la ventana “Observación del Mercado” se utiliza la opción “Autoeliminación de los expirados”, en el menú contextual.



      Cuando el terminal se reinicia, los símbolos con el plazo expirado se ocultan, en vez de ellos aparecen los más actuales. Por ejemplo, el contrato de futuros expirado LKOH 3.15 será reemplazado por el siguiente contrato del mismo activo base LKOH 6.15.

      Además, ocurre también el reemplazo de los símbolos en los gráficos abiertos (pero sólo si no tienen EAs en funcionamiento).

    7. Terminal: Ha sido corregida la actualización de los estados de los botones de trading en la DOM dependiendo de la presencia/ausencia de la posición y permiso para abrir sólo posiciones largas. Si no hay posiciones, el botón Close se pone inactivo. Si la apertura de posiciones cortas está prohibida, el botón Sell se pone inactivo.

    8. Terminal: Siguen los trabajos de adoptación de la interfaz para el trabajo en las pantallas de alta resolución (4K).
    9. Terminal: Han sido corregidos los errores durante la comprobación del volumen de la posición que se cierra en el modo Request Execution, cuando el volumen de la operación es menor que el permitido.
    10. Terminal: Ha sido corregido el error que provocaba, en algunas ocasiones, el arranque de varios ejemplares del terminal desde la misma carpeta.
    11. Terminal: Ha sido agregado el soporte y filtración automática del calendario de eventos económicos en viarios idiomas. La filtración se realiza según el idioma de la interfaz del terminal.
    12. Terminal: En el visor del Diario ha sido agregada la posibilidad de la búsqueda en las entradas visualizadas del Diario.



      La búsqueda de una palabra/frase se realiza sólo en las entradas visualizadas.
    13. Terminal: El terminal ha sido traducido al tai.
    14. Terminal: La traducción del terminal al hindú ha sido actualizada.
    15. MQL5: Ha sido agregada la nueva función GetMicrosecondCount - devuelve la cantidad de microsegundos transcurridos desde el momento del comienzo de trabajo del programa MQL5:
      ulong  GetMicrosecondCount();
      Se puede utilizar esta función para el perfilaje adicional de la ejecución del programa y detección de “cuellos de botella”.

    16. MQL5: En la enumeración ENUM_OPENCL_PROPERTY_INTEGER ha sido agregada la propiedad CL_BUFFER_SIZE que devuelve el tamaño real del búfer OpenCL en bytes. Se puede obtener esta propiedad mediante la función CLGetInfoInteger.
    17. MQL5: Ha sido modificado el aviso sobre los errores en la función WebRequest. En caso del error del uso de la función, el array result va a contener la descripción del error.
    18. MQL5: Ha sido corregida una serie de errores durante la compilación de las macro.
    19. MQL5: Las funciones de ordenación y búsqueda en el array ArraySort, ArrayBsearch, ArrayMinimum y ArrayMaximum ahora trabajan con los arrays multidimensionales. La ordenación y la búsqueda se realiza sólo por el primer (cero) índice del array. Antes estas funciones trabajaban sólo con los arrays unidimensionales.
    20. Tester: Ha sido introducida una serie de correcciones y mejoras en el funcionamiento de la simulación visual. Ahora la regulación de la velocidad del testeo a través de la barra de herramientas es más suave.
    21. Han sido corregidos los errores según los crash logs.
    22. Ha sido actualizada la documentación.

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

    12345678910111213