Metatrader 4: Novedades en mql4 v.6xx y clase 12 de curso mql4 intermedio de investingdev

5
Adaptación al nuevo MQL4 Necesitamos concretar cuáles son alguno de los cambios del nuevo lenguaje MQL4, vigente a partir de la versión de MetaTrader 4 build 600. Estos son los cambios más importantes: Cambio en los históricos Los nuevos históricos llevan los campos adicionales de spread y de volumen “real”. Se conservan el resto de campos que antes teníamos. La diferencia entre el volumen “viejo” y el volumen “nuevo” es que el volumen “nuevo” es volumen en número de lotes operados, y el viejo es únicamente el número de ticks. A pesar de decir ser el número de lotes real, esta información tampoco es tan “real”, puesto que el mercado de Forex es un mercado descentralizado sin un ente regulador que registre todas las operaciones, sino que cada bolsa, y cada broker, es el encargado de encontrar el volumen para casar sus órdenes. De manera que este volumen nos dará, únicamente, el volumen registrado por nuestro broker, no el volumen más REAL que nos daría en caso de estar operando un Futuro, ETF, opción o cualquier otro instrumento financiero sí centralizado y regulado por un único ente. Histórico antiguo: Histórico nuevo: Este cambio conlleva implicaciones profundas: los viejos desarrollos que usen DLLs basadas en el antiguo RateInfo no funcionarán correctamente en el nuevo terminal y se precisará convertir el desarrollo y compilarlo nuevamente.

description

Esta es la clase numero 12 del curso de programacion mql4 Intermedio de Investingdev, que dimos en abierto debido a las actualizaciones de la plataforma de MetaTrader 4 a las Build 6xx

Transcript of Metatrader 4: Novedades en mql4 v.6xx y clase 12 de curso mql4 intermedio de investingdev

Page 1: Metatrader 4: Novedades en mql4 v.6xx y clase 12 de curso mql4 intermedio de investingdev

Adaptación al nuevo MQL4

Necesitamos concretar cuáles son alguno de los cambios del nuevo lenguaje

MQL4, vigente a partir de la versión de MetaTrader 4 build 600. Estos son los cambios

más importantes:

Cambio en los históricos

Los nuevos históricos llevan los campos adicionales de spread y de volumen

“real”. Se conservan el resto de campos que antes teníamos. La diferencia entre el

volumen “viejo” y el volumen “nuevo” es que el volumen “nuevo” es volumen en

número de lotes operados, y el viejo es únicamente el número de ticks. A pesar de decir

ser el número de lotes real, esta información tampoco es tan “real”, puesto que el

mercado de Forex es un mercado descentralizado sin un ente regulador que registre

todas las operaciones, sino que cada bolsa, y cada broker, es el encargado de encontrar

el volumen para casar sus órdenes. De manera que este volumen nos dará, únicamente,

el volumen registrado por nuestro broker, no el volumen más REAL que nos daría en

caso de estar operando un Futuro, ETF, opción o cualquier otro instrumento financiero

sí centralizado y regulado por un único ente.

Histórico antiguo:

Histórico nuevo:

Este cambio conlleva implicaciones profundas: los viejos desarrollos que usen

DLLs basadas en el antiguo RateInfo no funcionarán correctamente en el nuevo

terminal y se precisará convertir el desarrollo y compilarlo nuevamente.

Page 2: Metatrader 4: Novedades en mql4 v.6xx y clase 12 de curso mql4 intermedio de investingdev

Nuevos tipos de datos

Se han añadido los tipos char, short, long, uchar, uint, ulong y double. La lista

completa de tipos de datos es entonces:

char: un carácter. Ocupe 1 byte de memoria (8 bits). Rango [-128, 127]

uchar: igual que el anterior, solo que el rango de valores es [0, 255]

short: Ocupa 2 bytes en memoria. Rango [-32768, 32767]

ushort: igual que el anterior, pero con rango [0, 65535]

int: Entero de 4 bytes. Rango [-2147483648, 2147484647]

uint: Rango [0, 4294967295]

long: Ocupa 8 bytes. Rango [-(2^64/2), (2^64/2) -1]

ulong: Rango [0, 2^64-1]

bool: Verdadero (true) o Falso (false), o 1 ó 0.

string: En formato Unicode.

double: Número con coma flotante de 8 bits.

float: Número con coma flotante de 4 bits

color: Pensado para alojar variables de información de colores. Ocupa 4 bytes en

memoria.

datetime: Fecha

enum: Enumeraciones. Una enumeración es una secuencia de valores que están

relacionados y que suelen estar numerados. Ejemplos de enumeraciones típicas

son los meses del año o los dias del mes. Pensando en el contexto de la

programación de estrategias de inversiones, una enumeración podría ser toda la

serie de símbolos que podemos operar con nuestro broker.

Además, en el nuevo MQL4 podemos crear Tipos Abstractos de Datos (TAD), que

son tipos de datos creados por el propio programador. Hay 2 clases de TAD:

Estructuras (struct). Una estructura agrega una serie de informaciones de

distintos tipos de datos sobre un concepto o ente. Una estructura se declara de

este modo:

Y un ejemplo, en el lenguaje MQL4, de estructura, es este:

Page 3: Metatrader 4: Novedades en mql4 v.6xx y clase 12 de curso mql4 intermedio de investingdev

Clases (class). Una clase es un TAD parecido en cierto sentido a un struct, solo

que más complejo: además de agregar datos sobre ese “ente”, agregaremos

también comportamiento. En una clase, los “datos” son los llamados atributos, y

el “comportamiento” son los métodos, que serán únicamente funciones que

podrán ser llamadas desde otros puntos de nuestro programa.

Un ejemplo de la declaración de una clase:

Y este el modo en que se declaran sus métodos:

Page 4: Metatrader 4: Novedades en mql4 v.6xx y clase 12 de curso mql4 intermedio de investingdev

Cabe destacar a este respecto que viejos desarrollos que usen DLLs que

trabajen con funciones de la API de Windows cuyos parámetros sean strings

deberán ser actualizados para usar el nuevo formato Unicode en vez de ANSI,

que era la codificación en versión antigua.

El Volumen ahora se guarda en arrays de tipo long. Se recomienda hacer conversión

explícita de tipos para evitar errores de desbordamiento.

Se han incorporado al lenguaje estructuras, clases, punteros, la palabra clave this, y

todas las propiedades de Programación Orientada a Objetos (POO):

Encapsulación y Tipos Extensibles

Herencia

Polimorfismo

Sobrecarga

Funciones Virtuales

Ahora bien, aunque se han añadido todas las capacidades para poder desarrollar

mediante POO, se puede seguir desarrollando con la metodología procedural que

veníamos haciendo con mql4 hasta ahora.

Las funciones predefinidas init( ), deinit( ) y start( ) ahora mismo están obsoletas,

aunque se sigue conservando la compatibilidad con las mismas y se pueden seguir

usando. No obstante, las funciones actuales son las de OnInit( ), OnDeInit( ), OnStart(),

OnCalculate( ) y OnTick( ). Otras de estas funciones nuevas son OnTimer( ),

OnChartEvent( ) y OnTester( ), que permiten un mayor control sobre los desarrollos y

una programación más orientada “al evento”.

Los nombres de variable no pueden contener puntos ni caracteres especiales, y las

nuevas palabras clave del mql4 actualizado no pueden existir en los programas. Los

programas que ya estén compilados (ficheros .ex4) no sufrirán de este cambio, pero sí

que podría afectar a programas fuente desarrollados con la versión antigua de mql4.

Para asegurarse de que un programa concreto cumple estas restricciones, se deberán

recompilar con el nuevo MetaEditor todos aquellos ficheros fuente generados con el

antiguo lenguaje.

Las reglas de precedencia de operadores en operaciones lógicas y aritméticas siguen

ahora las mismas reglas que los estándares de C. Para no cometer errores de este tipo,

nosotros siempre recomendamos usar paréntesis en las operaciones y no confiar en las

Page 5: Metatrader 4: Novedades en mql4 v.6xx y clase 12 de curso mql4 intermedio de investingdev

reglas de precedencia de los compiladores, pues estas pueden cambiar entre versiones

distintas de los compiladores.

Cambia el comportamiento de la función ArrayCopyRates( )

Antes, ArrayCopyRates( ) copiaba los precios en un array bidimensional del tipo

double[][6] . Ahora, debemos hacerlo mediante la estructura, ya vista de MqlRates

Este sería el modo de realizar una llamada a la función ArrayCopyRates( ) con la sintaxis

actual:

Aunque todavía se mantiene la compatibilidad con la nomenclatura antigua, de este

modo:

Se puede tener un máximo de 64 ficheros abiertos, frente a los 32 que soportaba

antes el terminal de MetaTrader. Además, hasta ahora los ficheros se abrían por

defecto en los modos de FILE_SHARE_READ o FILE_SHARE_WRITE. Ahora hay que

especificarlo expresamente.