MetaTrader 5 build 1295

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

1 abril 2016

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.