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:
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.
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:
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:
Se ha actualizado la documentación.
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 } //+------------------------------------------------------------------+
string text="Hello"; ushort symb=text[0]; // retornará el código del símbolo 'H'
Se ha actualizado la documentación.
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:
Transferir los certificados SSL desde la plataforma de escritorio a la plataforma móvil ahora es muy cómodo. Ya no será necesario usar iTunes.
En MetaTrader 5 es posible proteger las cuentas de forma adicional con un certificado sin el cual no es posible conectarse. Si el certificado ha sido creado en la versión de escritorio, entonces para acceder a la cuenta en la plataforma móvil, será imprescindible transferirlo.
Para ello, ahora bastará con abrir la plataforma de escritorio y, pulsando el botón derecho en la cuenta en el navegador, elegir la transferencia. Después tendrá que indicar la contraseña de protección del certificado, que solo conocerá usted, y luego abrir la plataforma móvil y conectarse a la cuenta. Al instante se le propondrá importar el certificado.
Aparte de esto, ha aparecido un diálogo de migración para las cuentas trasladadas desde MetaTrader 4. Si han trasladado su cuenta a la plataforma de 5 generación, será calurosamente bienvenido, le contarán todas las novedades y le propondrán cambiar la contraseña.
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:
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 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:
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:
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:
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.
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).
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 abstractaLimitaciones de uso de las clases abstractas
//+------------------------------------------------------------------+ //| 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.
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ámetrosLos í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.
ulong PositionGetTicket( int index // número en la lista de posiciones );
bool PositionSelectByTicket(
ulong ticket // ticket de la posición
);
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:
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:
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.
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).
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 abstractaLimitaciones de uso de las clases abstractas
//+------------------------------------------------------------------+ //| 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.
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ámetrosLos í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.
ulong PositionGetTicket( int index // número en la lista de posiciones );
bool PositionSelectByTicket(
ulong ticket // ticket de la posición
);
El nuevo sistema es similar al de MetaTrader 4, pero los tráders, además, pueden valerse de todas la ventajas de la quinta versión de la plataforma: ejecución de órdenes usando varias operaciones (incluyendo las parciales), órdenes stop-limit y mucho más.
Será posible probar el comercio con cobertura en cuanto actualice la plataforma. Al abrir una cuenta demo, active la opción "Usar cobertura", que estará disponible si el servidor comercial del bróker ya ha sido actualizado y configurado.
El nuevo sistema es similar al de MetaTrader 4, pero los tráders, además, pueden valerse de todas la ventajas de la quinta versión de la plataforma: ejecución de órdenes usando varias operaciones (incluyendo las parciales), órdenes stop-limit y mucho más.
Será posible probar el comercio con cobertura en cuanto actualice la plataforma. Al abrir una cuenta demo, active la opción "Usar cobertura", que estará disponible si el servidor comercial del bróker ya ha sido actualizado y configurado.
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.
El escalado de los gráficos de la parejas de divisas es ahora aún más sencillo: se ha aumentado la cantidad de pasos y se ha aumentado la suavidad de representación.