MetaTrader 4 build 970: Apertura sencilla de cuentas demo y posibilidades de MQL4 ampliadas

Últimas actualizaciones de MetaTrader 4

3 junio 2016

Terminal

  1. Simplificada la ventana de diálogo de apertura de la cuenta demo. 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 y el apalancamiento.




MQL4

  1. Modificado el formato de los archivos ejecutables EX4, a raíz de la adición de nuevas posibilidades al lenguaje MQL4. Todos los programas EX4 antiguos compilados en el MetaEditor de 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 EX4 compilados en los builds 970 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, defina 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 el índice a 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. 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.
  5. 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 un millón de microsegundos.
  6. En los indicadores de usuario, los búferes DRAW_NONE (no hay construcciones gráficas) ahora no participan en los cálculos del mínimo y el máximo de la ventana del gráfico.
  7. Corregida la formación de eventos relacionados con el desplazamiento del ratón y la pulsación de los botones del ratón sobre los objetos del tipo OBJ_LABEL y OBJ_TEXT. Antes, si se encontraban dentro de los límites de otros objetos del tipo OBJ_RECTANGLE_LABEL, OBJ_RECTANGLE, los eventos se formaban de manera incorrecta.
  8. En los indicadores de usuario se ha corregido el dibujado de las columnas del histograma de altura cero. Antes estas columnas no se dibujaban, ahora se dibujan con una altura de un píxel.

Signals

  1. Corregidos los errores de búsqueda de instrumentos comerciales al comparar los instrumentos comerciales disponibles de la fuente de la señal y del suscriptor.

Tester

  1. Corregida la aplicación del spread en un archivo fxt, si en los ajustes de la simulación se usa el spread actual.

Market

  1. Corregida una serie de errores en la representación del escaparate del Mercado.

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 algunos elementos de control en Windows XP.


Correcciones de crash logs.