Hace un mes que Microsoft lanzó una gran actualización del sistema operativo Windows 10 Creators Update (versión 1703). Después de instalarla, algunos usuarios no han podido iniciar sus programas MQL4. En la nueva versión de la plataforma MetaTrader 4 build 1080 se ha solucionado este problema. Los asesores e indicadores se iniciarán correctamente en los gráficos, sin que para ello sea necesario su compilación en el nuevo MetaEditor.
A partir del 1 de octubre de 2017, los terminales de cliente de MetaTrader 4 inferiores al build 1065 dejarán de tener soporte. Dichos terminales no podrán conectarse a los servidores de las nuevas versiones. Le recomendamos encarecidamente que actualice sus terminales de antemano.
En plataforma actualización se ha corregido el error de reinicio de los expertos en los gráficos después de cambiar el marco temporal. Ahora el funcionamiento de los asesores no se detiene, la reinicialización tiene lugar correctamente.
Una nueva actualización de la plataforma MetaTrader 4, relacionada con la salida de la versión preliminar de Windows 10 Insider Preview build 15007. Los cambios en los mecanismos de seguridad del OS Windows 10 han causado que en ciertos casos los terminales de cliente MetaTrader 4 no puedan iniciarse.
Le rogamos que instale la nueva la nueva versión de la plataforma, así estará preparado para la salida de la nueva actualización de Windows 10.
Añadido un chat en el que los miembros de MQL5.community podrán comunicarse entre sí. Indicando el login del usuario necesario en el remite del mensaje, podrá enviarle un mensaje directamente al dispositivo móvil.
El aspecto externo de los mensajes ha sido renovado. Ahora la correspondencia en MQL5.community y las notificaciones de la plataforma de escritorio se muestran en forma de chat, como los acostumbrados en los servicios de chat móvil más populares.
También se dispone de la posibilidad de pasar de uno a otro de los 22 idiomas directamente en la plataforma. Si prefiere comerciar usando la interfaz en inglés, active dicho idioma en el apartado "Ajustes" ("Sobre el programa", en iPad) sin cambiar el idioma de su dispositivo.
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'
Correcciones de crash logs.
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 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á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.
Ahora, para acceder a la aplicación se puede establecer un código PIN. Sus cuentas estarán protegidas de forma adicional, incluso en el caso de que pierda su dispositivo móvil. Active "Bloqueo de pantalla" en los ajustes de la aplicación. Por defecto, usará el mismo código PIN que existe para el acceso al generador de contraseñas de un solo uso.
En la nueva versión también se han introducido múltiples correcciones y mejoras.
La nueva versión de la plataforma MetaTrader 4 recibió un conjunto completo de indicadores para el análisis técnico. Ahora ella tiene 30 de los indicadores técnicos más populares en el mundo, al igual que en la versión de escritorio de MetaTrader 4:
Acelerador Oscilador |
DeMarker | Moving Average |
Acumulação/Distribuição | Envelopes | Moving Average of Oscillator |
Alligator | Force Index |
On Balance Volume |
Average Directional Movement Index | Fractais | Parabolic SAR |
Average True Range |
Oscilador Gator | Relative Strength Index |
Oscilador Maravilhoso | Ichimoku Kinko Hyo | Relative Vigor Index |
Bears Power |
MACD | Desviación Estándar |
Bollinger Bands |
Índice de facilitación de mercado |
Stochastic Oscillator |
Bulls Power |
Momentum | Volume |
Commodity Channel Index |
Índice de flujo de dinero | Williams' Percent Range |
Todavía estamos trabajando en el acceso a la aplicación, es por eso que ahora la interfaz de la plataforma web está disponible en 38 idiomas. Se agregaron traducciones en 14 idiomas:
Holandés |
Lituano | Croata |
Griego | Rumano | Checo |
Hebreo | Serbio |
Sueco |
Italiano | Esloveno |
Estonio |
Letón |
Finlandés | |
¡Abra su plataforma web ahora y disfrute de su aplicación actualizada!
En la nueva versión de la plataforma MetaTrader 4, aceleramos significativamente los gráficos mediante el uso de tecnología moderna de gráficos WebGL, por lo que ahora incluso un conjunto de indicadores que se ejecutan al mismo tiempo no afectará el rendimiento de la plataforma web.
Fue iniciado un trabajo en la implementación de indicadores técnicos. Actualmente ya están disponibles los indicadores Bill Williams:
Se ha añadido al Asistente MQL4 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.
Correciones de crash logs.
//+------------------------------------------------------------------+ //| 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 índices, en el destructor elimina | //| aquellos objetos a los que se referían los índices guardados en la matriz. | //| | //| Preste atención a la herencia de la plantilla de la clase 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 índices 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(i=0;i<10;i++) str+=" "+(string)ExtIntArray[i]; Print(str); str="Dbl:"; for(i=0;i<10;i++) str+=" "+DoubleToString(ExtDblArray[i],1); Print(str); str="Ptr:"; for(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: