English Русский 中文 Deutsch 日本語 Português
preview
Introducción a MQL5 (Parte 4): Estructuras, clases y funciones de tiempo

Introducción a MQL5 (Parte 4): Estructuras, clases y funciones de tiempo

MetaTrader 5Asesores Expertos | 31 julio 2024, 10:19
403 0
Israel Pelumi Abioye
Israel Pelumi Abioye

Introducción

Bienvenido a la cuarta parte de nuestra serie sobre los fundamentos de MQL5. En esta ocasión, hablaremos de las estructuras, las clases y las funciones de tiempo, tratando de hacer más accesibles conceptos complejos. El objetivo sigue siendo el mismo: crear un espacio inclusivo en el que el lenguaje MQL5 resulte accesible para todos. Permítanme recordarles nuevamente que cualquier pregunta que tengan será bienvenida: así no quedará ningún detalle sin entender. Estamos intentando que el aprendizaje de MQL5 no solo sea útil, sino también ameno.

Soy consciente de que programar puede ser tedioso, sobre todo para los principiantes, por eso en estos artículos intentamos exponer las cosas complejas con el mayor detalle posible para que sean comprensibles para todos. Pero si algo sigue sin estar claro, por favor, pregunte, la curiosidad abre el camino al conocimiento. Hoy entraremos juntos en un nuevo capítulo del estudio del trading algorítmico. No solo presentaremos material teórico, sino también ejemplos prácticos de código con explicaciones detalladas. Espero que nuestro viaje por los nuevos conocimientos resulte agradable para usted. Disfrute de la programación y recuerde: la curiosidad es la mejor compañera del progreso.

En el presente artículo abarcaremos los siguientes temas:

  • Estructuras
  • Clases
  • Funciones de tiempo en MQL5

Estimados lectores, antes de pasar al material principal de esta cuarta parte, les presentaremos (como viene siendo tradición) un breve vídeo para refrescar sus conocimientos sobre los conceptos expuestos en la tercera parte. Este vídeo servirá como recapitulación, y también como ayuda para que usted refresque sus conocimientos y se prepare para aprender material nuevo. Y si necesita repetir lo básico o volver atrás y fijarse en los detalles que se haya perdido, este vídeo le ayudará. A continuación comenzaremos a aprender el material nuevo, que también es básico.



1. Estructuras

¿Qué son las estructuras?

En programación, una estructura es un tipo de datos compuesto que permite agrupar diferentes tipos de datos bajo un mismo nombre. Permite organizar información relacionada de forma lógica y gestionarla cómodamente. La estructura puede incluir varios tipos de datos, como números enteros, números de coma flotante y caracteres. El objetivo principal de la estructura es mejorar la legibilidad y reutilización del código, así como representar objetos con múltiples atributos.

En MQL5, la estructura sirve para el mismo propósito. Se trata de un tipo de datos definido por el usuario que permite crear un contenedor para guardar elementos de datos relacionados. Las estructuras en MQL5 se usan a menudo para representar objetos del mundo real en algoritmos comerciales, instrumentos financieros o en cualquier escenario en el que se deban asociar diferentes atributos a un mismo objeto. La sintaxis de declaración de estructuras en MQL5 es similar a la de otros lenguajes. Las estructuras suponen una forma universal de organizar y acceder eficazmente a los datos en los scripts comerciales y asesores expertos.


Analogía

Imaginemos un construcción en forma de mochila. En esta mochila podemos meter diferentes cosas: juguetes, golosinas e incluso un pequeño mapa. Cada cosa de la mochila es una información diferente. Por ejemplo, el juguete es un tipo de juguete, las golosinas tienen un sabor determinado y el mapa muestra la dirección. 

Una mochila de este tipo puede considerarse una estructura de programación. Las estructuras contienen distintos tipos de información (juguetes, golosinas y mapas), del mismo modo que una estructura almacena distintos datos en un programa. Si necesitamos averiguar algo sobre un juguete, buscaremos en la mochila y encontraremos el juguete. En el programa, la estructura se utilizará para buscar información específica. De este modo, la estructura nos ayudará a organizar y trasladar diferentes cosas, facilitando la búsqueda de aquello que necesitemos.

1.1. Cómo declarar estructuras

Declarar una estructura en MQL5 resulta similar a definir una estructura cuando se crea, por ejemplo, un formulario para rellenar. Así, especificamos los tipos y nombres de los distintos datos que deseamos incluir.

struct Person
 {
    string name;
    int age;
    string address;
};

Explicación:

“struct Person”:

  • Esta línea inicia la declaración de la estructura llamada Person. Una estructura es un tipo de datos definido por el usuario que permite agrupar diferentes tipos de variables bajo un mismo nombre.

“string name;”:

  • Dentro de la estructura se declaran tres campos (variables). El primero es name y es de tipo string. Este campo se usará para almacenar el nombre de la "persona".

“int age;”:

  • El segundo campo, age, es de tipo int. Este campo está diseñado para almacenar la edad de la persona.

“string address;”:

  • El tercer campo es address, también de tipo string. Este campo sirve para almacenar la dirección de la persona.

Así que tenemos un contenedor o molde especial en el que clasificar de forma ordenada la información sobre una persona. Esta estructura Person es como un formulario con campos específicos (name, age, y address) donde podemos completar la información sobre cada persona. Una vez que tengamos esta estructura, podremos crear ejemplares de la misma para diferentes personas, y cada ejemplar contendrá información sobre una persona específica.

1.2. Uso

Una vez declarada la estructura, podremos utilizarla. La propia declaración de estructura servirá como una especie de plano para crear ejemplares u objetos personalizados. Estos ejemplares almacenarán datos específicos de cada persona.

void OnStart()
  {

   struct Person
     {
      string         name;
      int            age;
      string         address;
     };

// Creating variables of type Person
   Person person1, person2;

// Filling in details for person1
   person1.name = "Israel";
   person1.age = 25;
   person1.address = "123 Main St";

// Filling in details for person2
   person2.name = "Bob";
   person2.age = 30;
   person2.address = "456 Oak St";

// Now you can use person1 and person2 with their specific details
   Print("Details of Person 1: ", person1.name, ", ", person1.age, ", ", person1.address);
   Print("Details of Person 2: ", person2.name, ", ", person2.age, ", ", person2.address);

  }

Explicación:

“void OnStart()”:

  • Este será el punto de inicio de la ejecución del script. Cualquier código de esta función se ejecutará cuando ejecutemos el script o cuando lo adjuntemos a un gráfico.

“Person person1, person2;”:

  • Declaración de las dos variables person1 y person2 de tipo Person. Estas variables actuarán como contenedores para almacenar información sobre las personas.

“person1.name = "Israel";”:

  • Asignaremos el valor Israel al elemento name en person1.

“person1.age = 25;”:

  • Asignaremos el valor "25" al elemento age en person1.

“person1.address = "123 Main St";”:

  • Asignaremos el valor "123 Main St" al elemento address en person1.

“person2.name = "Bob";” to “person2.address = "456 Oak St";”:

  • Del mismo modo, asignaremos los valores correspondientes para la variable person2.

“Print("Details of Person 1: ", person1.name, ", ", person1.age, ", ", person1.address);”:

  • Imprimiremos la información sobre person1 utilizando la función Print.

“Print("Details of Person 2: ", person2.name, ", ", person2.age, ", ", person2.address);”:

  • Imprimiremos la información sobre person2 utilizando la función Print.

Analogía:

Imagine que está creando tarjetas de información personalizadas para personas concretas. Estas tarjetas contienen campos separados para el nombre, la edad y la dirección de cada persona. Un cuidadoso proceso de creación garantizará que cada tarjeta contenga información única sobre la persona para la que se ha creado.

Creación de tarjetas personalizadas:

  • En el taller, colocaremos dos tarjetas en blanco sobre nuestra mesa y pondremos nombre a person1 y a person2. Las tarjetas estarán diseñadas para contener diferentes datos de distintas personas.

Vamos a introducir los datos en la tarjeta person1:

  • En la primera ficha de person1, escribiremos el nombre "Israel" en el campo de nombre "Name". A continuación, en la sección Age, introduciremos una edad de 25 años. En la sección Address, escribiremos la dirección de la persona, "123 Main St".

A continuación, rellenaremos la segunda tarjeta person2:

  • Para crear la segunda tarjeta person2, repetiremos el mismo proceso. Esta vez rellenaremos los siguientes datos: nombre "Bob", edad "30", dirección "456 Oak St".

Trabajo con tarjetas personalizadas:

  • Sacaremos la primera tarjeta person1 y leeremos su contenido: "Estos son los datos de la primera persona: se llama Israel, tiene 25 años y vive en el 123 de Main Street". A continuación, leeremos la segunda tarjeta con los datos de la segunda persona exactamente de la misma manera.

En este ejemplo, la estructura Person servirá como plantilla que definirá la presencia de secciones en las fichas. Las variables person1 y person2 contendrán los datos de cada individuo. Y para llegar a un determinado conjunto de datos de cada persona, bastará con sacar la tarjeta correspondiente.

Nota: entender conceptos tales como arrays y estructuras puede parecer un poco confuso al principio. Un error común de los principiantes es confundir los arrays y las estructuras debido a su aparente similitud. Ambos implican la organización de datos, pero son diferentes. Los arrays son listas organizadas en las que elementos similares de información (tipos de datos similares) se disponen en orden secuencial y son accesibles mediante indexación. Las estructuras, en cambio, son más bien contenedores en los que se pueden combinar distintos tipos de información (distintos tipos de datos) para una entidad concreta.

Es decir, los arrays son colecciones de elementos idénticos, mientras que las estructuras permiten crear tipos de datos complejos que contienen piezas de información distintas. Aunque ahora le parezca un poco complicado, con el tiempo comprenderá todas estas sutilezas.


2. Clases

¿Qué son las clases?

En MQL5, las clases se pueden comparar con plantillas que ayudan a crear objetos. En este contexto, los objetos serían ejemplares o realizaciones concretas de una clase. Una clase es un conjunto de instrucciones para crear varios objetos, mientras que cada objeto es un elemento único creado a partir de estas instrucciones.

Imagine que tiene una clase "Frutas" con instrucciones sobre cómo crear diferentes frutas como manzanas, plátanos y naranjas. Los objetos serán manzanas, plátanos y naranjas reales que se crearán a partir de dichas instrucciones. Cada objeto de fruta tendrá atributos específicos (como el color y el sabor) y podrá realizar acciones (como ser comido). Así, en MQL5, las clases definen las reglas, y los objetos son cosas tangibles que se crean según estas reglas.

Analogía

Imagine que está jugando con bloques de construcción y tiene un conjunto especial de instrucciones sobre cómo construir una nave espacial genial. Este conjunto de instrucciones sería similar a una clase. Le dirá qué colores utilizar, cómo apilar los bloques e incluso cómo hacer volar una nave espacial (como un patrón de clase en programación). Cada vez que construya una nave espacial utilizando estas instrucciones, esa nave espacial se convertirá en un objeto de clase. Cada nave espacial que construya puede tener colores y características diferentes, pero todas seguirán las mismas instrucciones.

En programación informática, las clases también son instrucciones especiales sobre cómo crear algo. Ayudan a los programadores a crear cosas (las llamaremos objetos) con determinadas funciones y acciones. Es una forma de organizar y planificar ciertos pasos, lo cual facilita la creación de muchas cosas similares. De este modo, no tendremos que empezar de cero cada vez. Con estos conjuntos de instrucciones podemos crear muchos objetos diferentes.

Imagine que tiene una planta de producción que elabora distintos tipos de galletas. Tiene una receta, en eso consiste la clase. Determina qué ingredientes debe llevar cada galleta y cómo deberá hornearse.

2.1. Cómo declarar una clase

En MQL5, la sintaxis de la declaración de clase incluye el uso de la palabra clave class seguida del nombre de la clase y un bloque de código que contiene los miembros de la misma.

Ejemplo:

void OnStart()
  {

   class Person
     {
   public:
      // Attributes (data members)
      string         name;
      int            age;

      // Methods (member functions)
      void           displayInfo()
        {
         Print("Name: ", name);
         Print("Age: ", age);
        }
     };

// Creating an object of the Person class
   Person person1;

// Initializing attributes of the object
   person1.name = "John";
   person1.age = 25;

// Calling the displayInfo method to print information
   person1.displayInfo();

  }

Explicación:

Declaración de clase:

class Person {

  • Esta línea declarará una clase llamada Person. La palabra clave class irá seguida del nombre de la clase, y la llave de apertura "{" indicará el comienzo de la definición de la clase.

Dominio público:
public:
  • Esta línea declarará el especificador de acceso public, indicando que los siguientes miembros de la clase (atributos y métodos) serán accesibles desde fuera de la clase.
Atributos (miembros de datos):
string name;
int age;
  • Estas líneas declararán dos atributos (miembros de datos) dentro de la clase: el atributo name, de tipo string, y el atributo age, de tipo entero.
Método (función de miembro):
void displayInfo() 
{
    Print("Name: ", name);
    Print("Age: ", age);
}
  • Aquí se definirá un método (función de miembro) llamado displayInfo dentro de la clase. Imprimirá los valores de los atributos name y age mediante la función Print.
Llave de cierre:
};
  • La llave de cierre "}" marca el final de la definición de la clase.
Uso en la función OnStart:
void OnStart() {
  • La función OnStart es una función especial en MQL5 que se ejecutará cuando se inicia un script o asesor experto.
Creación de objetos:
Person person1;
  • Esta línea creará un objeto llamado person1 con el tipo Person. Así es como se crea un ejemplar específico de una clase.

Ajustamos los atributos:

person1.name = "John";
person1.age = 25;

  • Aquí se establecerán los valores de los atributos name y age del objeto person1.
Llamada del método:

person1.displayInfo();

  • Esta línea llamará al método displayInfo del objeto person1, que mostrará la información almacenada en los atributos.


Las clases y las estructuras son algo similares, pero tendrán propósitos diferentes. Se utilizarán para definir tipos de datos personalizados y agrupar datos relacionados. La principal diferencia radica en su funcionalidad.

Las estructuras son más simples y sirven básicamente como contenedores de datos sin incluir métodos o funciones. Pueden compararse con unidades de almacenamiento organizadas que agrupan distintos elementos de datos para facilitar el acceso a los mismos. En la programación orientada a objetos, las clases no solo abarcan los datos, sino también el comportamiento a través de métodos. Las clases son herramientas genéricas que no solo contienen información, sino que también ofrecen los medios para realizar acciones o funciones. Así, aunque tanto las clases como las estructuras organizan los datos, las clases ofrecerán un nivel adicional de funcionalidad a través de los métodos.

Resulta perfectamente normal que la distinción entre clases y estructuras no esté del todo clara al principio. En el siguiente artículo, proporcionaremos un vídeo que mostrará estos conceptos visualmente para que sean más fáciles de entender. Si todo esto le parece un poco confuso ahora, espere al próximo artículo. Poco a poco, paso a paso, aprenderemos juntos todos los fundamentos de la programación.


3. Funciones de tiempo en MQL5

Tiempo

En el contexto de la programación y el comercio, el "tiempo" se refiere al flujo continuo de horas, minutos y segundos. Se trata de un aspecto fundamental del trading algorítmico, ya que los mercados financieros operan dentro de determinados marcos temporales y los tráders necesitan sincronizar sus estrategias con estos elementos temporales.

Funciones

En programación, una función es un bloque de código autónomo diseñado para realizar una tarea u operación concreta. Las funciones ayudan a organizar el código, haciéndolo más modular y fácil de comprender. Toman los datos de entrada, los procesan y proporcionan los datos de salida.

¿Qué son las funciones de tiempo?

Las funciones de tiempo en programación, especialmente en MQL5, son herramientas que permiten a los desarrolladores y tráders trabajar con datos temporales y utilizarlos en sus algoritmos. Estas funciones permiten recuperar la hora actual del servidor, convertir valores horarios y realizar diversas operaciones relacionadas con las marcas temporales. En el contexto del trading algorítmico, las funciones de tiempo se utilizan para sincronizar las estrategias comerciales con marcos temporales específicos, establecer tiempos de ejecución precisos y crear condiciones para las señales comerciales según el tiempo. Permiten trabajar con los aspectos temporales de los mercados financieros y utilizarlos en las estrategias comerciales.

Analogía

Imagine que tiene un reloj que le dice cuándo debe hacer ciertas cosas, como cuándo jugar, comer o dormir. En el mundo de los programas informáticos, las funciones de tiempo son como los relojes. Ayudan a la computadora a controlar el tiempo y decidir cuándo realizar determinadas tareas.

Si está escribiendo un programa comercial, podrá utilizar las funciones de tiempo para decir: "Si es de día, aplica esta estrategia comercial, y si es de la noche, haz otra cosa". Las funciones de tiempo son como instrucciones sobre lo que debemos hacer en diferentes momentos.

Antes de pasar a un estudio más amplio de las funciones de tiempo en MQL5, echaremos un vistazo más de cerca a la más importante: datetime.

3.1. datetime

En MQL5, datetime es un tipo de datos especial usado para representar la fecha y la hora. Supone un reloj digital que puede monitorear la fecha y la hora actuales en el mundo del trading. Este tipo de datos permite a los tráders y algoritmos cronometrar acontecimientos, así como analizar y aplicar estrategias basadas en condiciones temporales específicas.

3.1.1. Cómo declarar una variable datetime

Así, la variable datetime guarda la fecha y la hora. Al declarar una variable datetime, podemos establecer un punto específico en el tiempo para ella.

Ejemplo:

void OnStart()
  {

// Declaration of datetime variable
   datetime magicalClock;

// Assigning a special date and time to our magical clock
   magicalClock = D'2024.01.15 12:30:00';

// Let's tell the computer to show us the date and time inside our
   Comment(magicalClock);

  }

Explicación:

"datetime magicalClock;":

  • Aquí declararemos una variable llamada magicalClock con el tipo de datos datetime. Esta variable guardará la fecha y la hora.

“magicalClock = D'2024.01.15 12:30:00';”:

  • En esta línea, asignaremos una fecha y una hora concretas (15 de enero de 2024, 12:30:00) a la variable magicalClock utilizando el formato "D'YYYY.MM.DD HH:MI:SS'".
  • "D" indica que estamos asignando una constante de fecha y hora.
  • “2024” — año.
  • “01” — mes.
  • “15” — día.
  • “12” — hora.
  • “30” — minutos.
  • “00” — segundos.

“Comment(magicalClock);”:

  • Aquí utilizaremos la función Comment para mostrar el contenido del reloj (magicalClock). La computadora mostrará la fecha y hora almacenadas en la variable datetime.

Este fragmento de código muestra la declaración, asignación y visualización de la variable datetime en MQL5.

Figura 1: Resultado de la ejecución del código en MT5

3.2. Funciones básicas de tiempo

3.2.1. TimeCurrent

En el contexto del comercio algorítmico, la función TimeCurrent() en MQL5 representa la hora actual del servidor. Esta función retornará el valor de la variable datetime, que esencialmente representa la marca de tiempo actual en el servidor donde se ejecutan las transacciones.

¿Cuál es la importancia de esta función? Supongamos que utilizamos una estrategia comercial que implica determinadas acciones en función de la hora del día. Por ejemplo, podría tratarse de acciones distintas a la apertura y al cierre del mercado o durante las horas de volatilidad. Con TimeCurrent(), podremos acceder de forma programática a la hora actual y adaptar las decisiones comerciales en consecuencia. Con el reloj sincronizado con la hora del servidor, nuestro algoritmo podrá adaptarse dinámicamente a las diferentes condiciones del mercado a lo largo del día.

En la práctica, podremos utilizar TimeCurrent() para crear condiciones dependientes del tiempo en los algoritmos comerciales. Por ejemplo, podremos permitir que las transacciones se abran solo durante determinadas horas o ajustar las estrategias de gestión del riesgo según la hora del día. De este modo, podremos asegurarnos de que nuestros algoritmos estén sincronizados con la situación siempre cambiante de los mercados financieros.

Analogía

Imaginemos que el tiempo en programación es como un reloj que nos dice cuándo ocurre algo. Usando TimeCurrent(), preguntaremos a la computadora: "¿Qué hora es?"

Cuando usemos TimeCurrent(), la computadora nos informará de la hora actual en un formato especial, como «2024.01.15 12:30:00». Podremos usar esta información para saber cuándo se han producido determinados acontecimientos o para planificar acciones. Es un reloj que muestra siempre la hora actual en el mundo de la programación.

Ejemplo:
void OnStart()
  {

// Ask the magical clock for the current time
   datetime currentTime = TimeCurrent();

// Display the current time on the console
   Print("The magical clock says it's now: ", currentTime);

  }

Explicación:

“datetime currentTime = TimeCurrent();”:

  • Aquí declararemos una variable llamada currentTime de tipo datetime (un tipo de datos que contiene información sobre la fecha y la hora). Utilizaremos la función TimeCurrent() para obtener la hora actual del servidor, y el resultado se asignará a la variable currentTime.

“Print("The magical clock says it's now: ", currentTime);”:

  • La función Print() se utilizará para imprimir mensajes en la consola. En esta línea, imprimiremos el mensaje junto con el valor currentTime, para que muestre la hora actual reportada por nuestra función.

En términos sencillos, el programa comprobará la hora actual utilizando TimeCurrent() y luego nos dirá lo que ha encontrado mostrando un mensaje en la consola.

Figura 2: Resultado después de ejecutar el código en MetaTrader 5

Veamos ahora otro ejemplo para entender mejor cómo opera la función. Se trata de un ejemplo un poco más complejo del uso de la función TimeCurrent(). Vamos a mostrar un escenario en el que comprobaremos si la hora actual del servidor coincide con una hora predeterminada. Esta es otra variante del uso de funciones de tiempo en MQL5. De hecho, pueden existir muchísimas opciones.

Ejemplo:

void OnStart()
  {

// Declaration of datetime variable
   datetime magicalClock;

// Assigning a special date and time to our magical clock
   magicalClock = D'2024.01.15 12:30:00';

// Check if TimeCurrent is equal to our magical clock
   if(TimeCurrent() == magicalClock)
     {
      Print("The magic moment has arrived!");
     }
   else
     {
      Print("Not yet the magic time...");
     }

  }

Explicación:

"datetime magicalClock;":

  • Declarará una variable llamada magicalClock de tipo datetime.

“magicalClock = D'2024.01.15 12:30:00';”:

  • Asignará una fecha y hora específicas (15 de enero de 2024, 12:30) a la variable magicalClock, utilizando el prefijo D para los literales datetime.

“if (TimeCurrent() == magicalClock) { ... }”:

  • Comparará la hora actual del servidor (TimeCurrent()) con un valor magicalClock predefinido. Si son iguales, la consola mostrará "The magic moment has arrived!"; en caso contrario, mostrará "Not yet the magic time...".

Al aprender MQL5 y trading algorítmico, algunos conceptos pueden resultar confusos, especialmente para los principiantes. Es normal que el proceso de aprendizaje implique buscar respuestas y aclaraciones con cierta frecuencia. Siéntase libre de hacer cualquier pregunta: sobre arrays, funciones personalizadas, preprocesadores, procesamiento de eventos, o cualquier otro tema que hayamos tratado.

La programación, como cualquier otra habilidad, puede parecer un poco desalentadora al principio, pero trabajando juntos podremos hacer que el viaje sea más agradable y comprensible. Lo que hace única nuestra experiencia de aprendizaje son las preguntas que nos hacemos y las discusiones que mantenemos. Participe activamente en el proceso de aprendizaje.

3.2.2. TimeGMT

La función TimeGMT() de MQL5 nos permitirá trabajar con la hora estándar del meridiano de Greenwich (GMT). El GMT es un reloj universal que la gente de todo el mundo usa como referencia, por lo que se considera una medida de tiempo normalizada. En el comercio algorítmico, esta característica facilita la coordinación y la sincronización de las acciones a nivel global, ofreciendo un marco común para las transacciones basadas en el tiempo.

La función TimeGMT en MQL5 retornará la hora actual del meridiano de Greenwich (GMT) con la corrección del horario de verano (DST), basada en la hora local de la computadora donde se está ejecutando el terminal de cliente. Con esta corrección, el GMT retornado considerará si el horario de verano está actualmente en vigor.

Analogía

Imagine que hay un reloj en una ciudad especial llamada Greenwich. Esta ciudad se parece al cuartel general de los Guardianes del Tiempo. La hora del reloj de Greenwich se considera la hora de referencia seguida por todo el mundo. Ahora supongamos que tiene amigos en distintos lugares, cada uno con su propia hora local. Si quiere programar una reunión virtual con ellos, puede resultar difícil porque cada uno tiene horas diferentes en sus relojes.

Y ahí es donde el GMT vendrá al rescate. Esta sincronización permitirá que todo el mundo se sincronice. El GMT es la hora que marca el reloj en Greenwich, y cuando sabemos qué hora es, resulta más fácil coordinarnos con nuestros amigos estén donde estén. Así pues, el GMT supone una hora de referencia que ayudará a las personas de distintos lugares a ponerse de acuerdo sobre cuándo hacer cosas juntas.

Imagínese que en nuestra ciudad de Greenwich, a veces cambian los relojes en determinadas épocas del año: se trata de un acontecimiento especial, de ahí viene el horario de verano (DST), que resulta diferente del horario normal. Por lo tanto, también deberemos saber si el reloj está en el modo de horario de verano o no. La función TimeGMT() en MQL5 informa sobre esta hora de referencia, considerando si el reloj está actualmente en el modo de horario de verano o no.

En programación, esta información resulta crucial porque permite a los tráders y algoritmos hacer un seguimiento preciso del tiempo, teniendo en cuenta cualquier cambio. TimeGMT() siempre informa de la hora correcta, teniendo en cuenta el horario de verano y el horario de invierno.

Ejemplo:

void OnStart()
  {

// Declaration of a variable to store GMT time
   datetime gmtTime;

// Assigning the current GMT time to the variable
   gmtTime = TimeGMT();

// Printing the GMT time
   Print("Current GMT Time: ", TimeToString(gmtTime));

  }

Explicación:

"datetime gmtTime;":

  • Esta línea declarará una variable llamada gmtTime de tipo datetime. Este es un tipo de datos en MQL5 que se usa para representar los valores de fecha y hora.

“gmtTime = TimeGMT();”:

  • Esta línea asignará la hora GMT actual a la variable gmtTime. La función TimeGMT() se llamará para obtener la hora GMT actual.

“Print("Current GMT Time: ", TimeToString(gmtTime));”:

  • La función Print imprimirá un mensaje en la consola, a saber, "Current GMT Time: " seguido de la hora GMT convertida a cadena mediante la función TimeToString(gmtTime).

Así, este fragmento de código declarará una variable para almacenar la hora GMT, asignará la hora GMT actual a esa variable y, a continuación, mostrará un mensaje con la hora GMT actual en la consola.

3.2.3. TimeLocal

La función TimeLocal() en MQL5 es similar a ajustar el reloj a la hora local de nuestra computadora. Nos permite saber qué hora es en nuestra ubicación geográfica concreta. Al utilizar TimeLocal(), obtendremos la hora del reloj del sistema de nuestra computadora sin realizar correcciones de acuerdo con ninguna zona horaria global.

Supongamos que nos encontramos en Nueva York y que el reloj de nuestra computadora está ajustado a la hora de Nueva York. TimeLocal() informará sobre la hora actual basándose en la hora de nuestra computadora, facilitando la adaptación a nuestra rutina diaria y a la configuración horaria local. Esta función resulta útil al trabajar con la hora en el contexto de nuestra zona horaria sin tener que considerar diferencias globales.

Analogía

Imagine un reloj que da la hora. La función TimeLocal en MQL5 preguntará a su reloj: "¿Qué hora es aquí, dónde estoy?" Así, mostrará la hora según sus condiciones locales.

Ejemplo:

void OnStart()
  {

// Declaration of a variable to store local time
   datetime localTime;

// Assigning the current local time to the variable
   localTime = TimeLocal();

// Printing the local time
   Print("Current Local Time: ", TimeToString(localTime));

  }

Explicación:

Este código le pedirá a la computadora que utilice la función TimeLocal() para averiguar la hora en su ubicación específica. A continuación, mostrará la hora en la pantalla. Así que, si su reloj fuera un programa informático, ¡así es como daría la hora en su habitación!

Figura 3: Resultado después de ejecutar el código en MetaTrader 5

3.2.4. TimeGMTOffset

La función TimeGMTOffset() en MQL5 permite encontrar la diferencia horaria entre nuestra hora local y GMT (Greenwich Mean Time). "¿Cuántas horas de adelanto o retraso tengo con respecto a la hora mundial estándar?".

Fórmula:

TimeGMTOffset = TimeGMT() - TimeLocal()

TimeGMTOffset es una función muy práctica que determina la diferencia horaria (offset) en segundos entre GMT y la hora local de la computadora que ejecuta el terminal comercial.

Analogía

Imaginemos que su reloj funciona de forma un poco distinta. No solo informan de la hora, sino también de la diferencia de nuestra hora con respecto a la hora de referencia seguida por todo el mundo. Esta hora de referencia será una hora de consenso en la que todo el mundo estará de acuerdo, GMT. En lugar de complicadas matemáticas para averiguar cuánto difiere nuestra hora de GMT, tendremos un botón mágico llamado TimeGMTOffset. Pulsando este botón, obtendremos una respuesta directa: cuántos segundos de adelanto o retraso tiene nuestra hora con respecto a la hora universal.

Si alguna vez quiere planear algo al mismo tiempo con amigos de distintos lugares en diferentes zonas horarias, este botón le ayudará a determinar cuándo reunirse sin tener que calcularlo todo por sí mismo. Este ayudante se asegurará de que todo el mundo se encuentre en la misma página, ¡estén donde estén!

Ejemplo:

void OnStart()
  {

// Declaration of variables
   int gmtOffsetSeconds, gmtOffsetMinutes;

// Assigning the current GMT offset to the variable in seconds
   gmtOffsetSeconds = TimeGMTOffset();

// Converting seconds to minutes
   gmtOffsetMinutes = gmtOffsetSeconds / 60;

// Printing the GMT offset in minutes
   Print("Current GMT Offset (in minutes): ", gmtOffsetMinutes);

  }

Explicación:

“int gmtOffsetSeconds, gmtOffsetMinutes;”:

  • Aquí declararemos dos variables (gmtOffsetSeconds y gmtOffsetMinutes) para almacenar el desfase GMT en segundos y minutos respectivamente.

“gmtOffsetSeconds = TimeGMTOffset();”:

  • Utilizaremos la función TimeGMTOffset() para obtener el desfase actual con respecto a GMT en segundos. Lo asignaremos a la variable gmtOffsetSeconds.

"gmtOffsetMinutes = gmtOffsetSeconds / 60;":

  • Para convertir el desfase GMT de segundos a minutos, dividiremos gmtOffsetSeconds entre 60 y almacenaremos el resultado en gmtOffsetMinutes.

“Print("Current GMT Offset (in minutes): ", gmtOffsetMinutes);”:

  • Por último, mostrará el desplazamiento en minutos en la consola. La función Print mostrará el texto entre comillas junto con el desfase GMT calculado en minutos.

En este código, primero obtendremos el desfase GMT en segundos utilizando TimeGMTOffset(), luego dividiremos este valor por 60 para convertirlo en minutos. Y mostraremos la información en minutos. Si ejecutamos un script con este código, mostrará el desfase GMT en minutos.

Figura 4: Resultado de la ejecución del código en MT5

Un desfase GMT de -60 significará que la hora local está 60 minutos por delante de GMT.

3.2.5. TimeToStruct

En MQL5, la función TimeToStruct() se usa para convertir la marca de tiempo (representada como el número de segundos transcurridos desde el 1 de enero de 1970) en un formato estructurado. Este formato estructurado se representará mediante la estructura predefinida MqlDateTime, que incluye elementos independientes para el año, el mes, el día, la hora, los minutos y los segundos.

Ejemplo:

void OnStart()
  {

// Declare an MqlDateTime variable
   MqlDateTime myTime;

// Convert the current timestamp to a structured format
   TimeToStruct(TimeCurrent(), myTime);

// Access individual components of the structured time
   Print("Current Year: ", myTime.year);
   Print("Current Month: ", myTime.mon);
   Print("Current Day: ", myTime.day);
   Print("Current Hour: ", myTime.hour);
   Print("Current Minute: ", myTime.min);
   Print("Current Second: ", myTime.sec);

  }

En el ejemplo anterior, TimeCurrent() retorna la marca de tiempo actual, y TimeToStruct convierte esa marca de tiempo en un formato estructurado almacenado en una variable myTime de tipo MqlDateTime. Tras la conversión, podremos acceder a los componentes específicos del tiempo (año, mes, día, etc.) utilizando los elementos de la estructura myTime.

Nota: explicaremos cómo funciona MqlDateTime más tarde.

Analogía

Veamos qué hace TimeToStruct(). Imagine que tiene una gran cantidad de segundos que empezaron a contar en 1970 (el punto de partida del cronometraje informático). Estos segundos se acumulan y usted necesita saber cuántas horas, minutos, días e incluso años contiene este gran número.

Aquí es donde entra en juego TimeToStruct(). Esta herramienta tomará una enorme pila de segundos y los descompondrá en un formato más humano. Y si tenemos un número enorme, como 100 000 segundos, TimeToStruct() nos informará de que son 27 horas, 46 minutos y 40 segundos. Se trata de una calculadora que convierte un simple número de segundos en un desglose detallado del tiempo, tomando como punto de partida 1970.

Imagine que tiene una cápsula del tiempo llamada MqlDateTime, y cuando le transmite un punto específico en el tiempo (como la hora actual), se abre y revela los detalles. La función TimeToStruct() convierte los segundos brutos transcurridos desde 1970 en un conjunto de información cómodamente organizada.

Si disponemos de un contador de segundos, TimeToStruct() agitará su varita mágica y tendremos una visión clara de los años, meses, días, horas, minutos, segundos, días de la semana y días del año, todo ello perfectamente empaquetado en una estructura MqlDateTime. El enigmático código de tiempo se convertirá en un formato legible, lo que hará que nuestros programas sean más versátiles y prácticos.

Ejemplo:

void OnStart()
  {

// Declare an MqlDateTime variable
   MqlDateTime myTime;

// Convert the number of seconds into a structured format
   TimeToStruct(100000, myTime);

// Now, myTime will tell us the breakdown since 1970
   Print("Years: ", myTime.year);
   Print("Months: ", myTime.mon);
   Print("Days: ", myTime.day);
   Print("Hours: ", myTime.hour);
   Print("Minutes: ", myTime.min);
   Print("Seconds: ", myTime.sec);

  }

Explicación:

"MqlDateTime myTime;":

  • Vamos a declarar un reloj llamado myTime utilizando la estructura MqlDateTime.

"TimeToStruct(100000, myTime);":

  • Aquí utilizaremos TimeToStruct para convertir el número de segundos (100 000 en este caso) en un formato estructurado almacenado en myTime. Así es como descifraremos un momento concreto en el tiempo.

“Print("Years: ", myTime.year);”:

  • Ahora se nos pedirá que mostremos los años desde 1970 utilizando el atributo año. Lo mismo ocurrirá con los meses, los días, las horas, los minutos y los segundos.

Tenemos un momento en el tiempo (100 000 segundos desde 1970) y se nos pedirá que lo descompongamos en años, meses, días, etc. Así sabremos de qué momento estamos hablando. Me pregunto si será un tic.

Al aprender las sutilezas de las funciones de tiempo en MQL5, como cualquier otro aspecto de la programación, no se olvide de formular preguntas. Paso a paso iremos explorando nuevas áreas de programación. Si hay algo que no entienda, pregunte en los comentarios.

Nota: la información que hemos analizado hoy sobre MqlDateTime es solo el principio. Seguiremos estudiando con detalle las estructuras predefinidas en el próximo artículo.


Conclusión

Bien, en el presente artículo, hemos explorado un área interesante de las estructuras, las clases y el concepto de tiempo en MQL5. Recuerda que el aprendizaje es un viaje dinámico en el que usted es un participante activo. Si tiene alguna duda, no deje de exponerla para que nada quede sin aclarar. Permanezca atento a los próximos artículos de esta serie; en ellos nos adentraremos en nuevos niveles de programación MQL5. Le deseo suerte programando y negociando.


Traducción del inglés realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/en/articles/14232

Inferencia causal en problemas de clasificación de series temporales Inferencia causal en problemas de clasificación de series temporales
En este artículo, examinaremos la teoría de la inferencia causal utilizando el aprendizaje automático, así como la implementación del enfoque personalizado en Python. La inferencia causal y el pensamiento causal tienen sus raíces en la filosofía y la psicología y desempeñan un papel importante en nuestra comprensión de la realidad.
Redes neuronales: así de sencillo (Parte 74): Predicción de trayectorias con adaptación Redes neuronales: así de sencillo (Parte 74): Predicción de trayectorias con adaptación
Este artículo presenta un método bastante eficaz de previsión de trayectorias de múltiples agentes, capaz de adaptarse a diversas condiciones ambientales.
Factorización de matrices: lo básico Factorización de matrices: lo básico
Como el objetivo aquí es ser didáctico. Mantendré las cosas en su forma más sencilla. Es decir, implementaremos solo lo necesario: la multiplicación de matrices. Verás que esto será suficiente para simular la multiplicación de una matriz por un escalar. La gran dificultad que muchas personas tienen a la hora de implementar un código utilizando la factorización de matrices es que, a diferencia de una factorización escalar, donde en casi todos los casos el orden de los factores no altera el resultado, cuando se usan matrices, la cosa no es así.
Desarrollo de un sistema de repetición (Parte 58): Volvemos a trabajar en el servicio Desarrollo de un sistema de repetición (Parte 58): Volvemos a trabajar en el servicio
Después de haber tomado un descanso en el desarrollo y perfeccionamiento del servicio usado en la repetición/simulación, retomaremos el trabajo en él. Ahora que no utilizaremos algunos recursos, como las variables globales del terminal, es necesario reestructurar por completo algunas partes de él. No se preocupen, este proceso se explicará adecuadamente para que todos puedan seguir el desarrollo del servicio.