Simulación de mercado (Parte 19): Iniciando SQL (II)
Introducción
Hola, chicos, y sean bienvenidos a un artículo más de la serie sobre cómo construir un sistema de repetición/simulación.
En el artículo anterior, «Simulación de mercado (Parte 18): Iniciando SQL (I)», empezamos a ver los primeros comandos que podemos usar en SQL. El objetivo era poder crear una base de datos inicial para recibir información y realizar búsquedas futuras. Mostré que puedes usar lo mismo que se ve en cualquier programa o script de SQL dentro de MetaEditor. Por tanto, también podrás usar el mismo código, solo que dentro de un ejecutable hecho en MQL5. Así, se podrá ejecutar directamente desde MetaTrader 5.
Sin embargo, existe un comando en SQL que, si intentas ejecutarlo con MetaEditor, no funcionará. El mismo reportará un error cuando se intente ejecutar. No obstante, quiero dejar muy clara una cosa: todos los comandos de SQL se pueden usar sin problemas en MQL5 y en MetaEditor. Esto se debe a que MetaTrader 5 hace uso de SQLite. Aunque puedas usar cualquier comando en un ejecutable de MQL5, no ocurre lo mismo en MetaEditor. Para evitar malentendidos, veamos de qué comando se trata.
Un comando SQL que nunca será ejecutado por MetaEditor
Muy bien, ahora es el momento de experimentar. Estamos empezando a aprender, así que los efectos colaterales serán pequeños. No obstante, quiero advertirte, querido lector, de que nunca ejecutes ningún comando de SQL en una base de datos importante sin antes entender lo que hace. Si vas a probar algo nuevo, hazlo de la manera más segura posible para evitar molestias después. Como dice el refrán, la fe puede mover montañas, pero no restaurará tus datos.
Entonces, veamos qué bendito comando es este. En la animación de abajo, puedes ver de qué se trata.

Presta mucha atención: el comando DROP, cuando se usa en SQL, nos permite borrar de forma permanente algo. Si usas este comando sin prestar la debida atención, tendrás serios problemas. Ten en cuenta que SQL no te pedirá ningún tipo de confirmación. Simplemente eliminará lo que le hayas indicado.
Pero, cuando estamos usando MetaEditor, no se borrará el archivo de la base de datos. Sin embargo, si envías el mismo comando que generó un error en la animación para que SQL lo ejecute, tu archivo de base de datos será eliminado.
Sin embargo, podrías imaginar, erróneamente, que MetaEditor se está negando a ejecutar el comando DROP. Pero, como se pudo ver en la animación, no es eso lo que ocurre, ya que fue posible eliminar la tabla creada anteriormente.
Tal vez estés pensando que, si intentamos usar el comando CREATE DATABASE en MetaEditor, tampoco lo conseguiremos, como tampoco lo haremos con el comando USE. Sí, es verdad. Sin embargo, ambos comandos están implementados, pero de una forma que no necesitas escribirlos.
No obstante, para eliminar un archivo de la base de datos de una unidad de disco, MetaEditor no hará tal cosa. Entonces, existe una diferencia: MetaEditor, por motivos de seguridad, no permite la ejecución del comando DROP DATABASE, que en SQL indica la eliminación del archivo de la base de datos.
Así que acabo de demostrar, y puedes comprobarlo, que existe un comando SQL que MetaEditor no ejecuta. Fuera de ese comando, todos los demás se ejecutarán sin fallos. Considero que, con esto, queda explicado el comando DROP, que no es más que un comando para eliminar de forma permanente algo, ya sea una columna, una tabla o incluso una base de datos entera. Ten cuidado con este comando, pues no te pedirá confirmación alguna sobre si debe ejecutarse o no.
Sin embargo, existen formas de impedir que se elimine algo sin los permisos adecuados. Pero para eso sería necesario explicar con más profundidad cómo trabajar con SQL. Y esa no es la intención. El objetivo es proporcionarte una base para que entiendas lo que haremos después, que consistirá en usar SQL dentro de un ejecutable creado en MQL5.
Insertando información en la base de datos
El siguiente comando que veremos es el que se encarga de insertar información en la base de datos. No intentes editar un archivo de base de datos de forma manual. Lo correcto es utilizar siempre comandos SQL para ello. Da igual si la base de datos es pequeña o tiene pocas columnas y datos: nunca debes editarla de forma manual. Siempre debes usar comandos SQL para ello.
El comando responsable de insertar información en la base de datos es bastante simple. Sin embargo, debes tener cuidado. En realidad, lo que necesitas es estar atento al utilizar el comando, ya que funciona como un modelo clave-valor. Quien sabe programación en Python, entenderá rápidamente la idea.
Esto se debe a que el comando SQL para insertar información en la base de datos se parece mucho a la creación de un diccionario en Python. Es decir, se usa una clave y se le asigna un valor. Pero aquí, en SQL, la cosa funciona un poco diferente. Sin embargo, la idea es la misma. Veamos cómo ocurre en realidad.
Ahora ya no vamos a mostrar el mismo comando en MetaEditor. Esto se debe a que creo que ya quedó claro el hecho de que los comandos que se deben ejecutar serán los mismos. Entonces, no tiene sentido seguir repitiendo lo mismo. Para que sea más simple explicar el comando, usaremos un pequeño código en SQL, algo bien simple y sencillo.
Observa el código de abajo:
01. CREATE DATABASE IF NOT EXISTS MT5_Tutor_DB;
02. USE MT5_Tutor_DB;
03.
04. CREATE TABLE IF NOT EXISTS tb_Quotes
05. (
06. of_day DATE,
07. symbol CHAR(6),
08. price DECIMAL(5, 2)
09. );
10.
11. INSERT INTO tb_Quotes (of_day, symbol , price)
12. VALUES ('2023-07-06', 'BOVA11' , 105.61);
13.
14. SELECT * FROM tb_Quotes; Script en SQL
De momento, no te preocupes por la línea 14. De momento, está ahí solo para que puedas ver el resultado de una forma más sencilla. Este código se puede usar tanto en MetaEditor como directamente en el servidor SQL. Sin embargo, si vas a usarlo en MetaEditor, debes tener en cuenta que las líneas uno y dos deberán ejecutarse de otra manera. a lo expliqué en los artículos anteriores. En caso de duda, busca los artículos para saber cómo proceder en MetaEditor y ejecutar este mismo código. Lo que nos interesa aquí son las líneas cuatro y 11, donde creamos la tabla e insertamos datos, respectivamente.
A pesar de que este código funciona, no es un código que debas usar cuando vayas a crear una base de datos. El motivo es que permite que los datos se dupliquen infinitamente dentro de la base de datos. Si has oído hablar de las bases de datos, sabrás que en ellas no se pueden duplicar valores. Se crean de manera que se evite que esto ocurra. Sin embargo, aunque el propósito sea este, si codificas un script en SQL de forma amateur, con toda certeza tendrás valores duplicados. Esa forma amateur se observa en el código de arriba. Pero, como el propósito aquí es explicar cómo añadir valores a la base de datos, podemos permitirnos el lujo de aceptar valores duplicados e incluso algunos errores durante esta inserción, como campos con el valor NULL.
Para que entiendas lo que está ocurriendo, fíjate en que en la línea cuatro vamos a crear la tabla solo si no existe en la base de datos. Esta tabla tendrá las siguientes columnas. Acompaña la explicación: en la línea seis, indicamos que queremos una columna cuyo contenido será una fecha.
En la línea siete, indicamos que queremos una columna de seis caracteres de ancho. Así podremos colocar el nombre del símbolo que vamos a almacenar. Esta nomenclatura sigue el patrón del nombre de los símbolos de la B3 (Bolsa de Brasil).
En la línea ocho, indicamos que queremos un espacio de cinco caracteres, de los cuales dos se utilizarán para indicar el valor decimal. De este modo, podemos introducir cotizaciones que van de 0 a 999,99, lo que es más que suficiente para los símbolos negociados en B3. Bien, observa que no estamos definiendo ninguna clave ni condición de bloqueo. Es precisamente la ausencia de dichas condiciones lo que permite que los valores se dupliquen.
Ahora, veamos qué ocurre en la línea 11. Observa que el comando para insertar algo en la tabla comienza con INSERT INTO. Justo después, indicamos cuál es la tabla que recibirá los valores. En este caso, tb_Quotes, que acabamos de crear. A continuación, declaramos los nombres de las columnas que recibirán los valores.
Ahora, presta atención: puedes colocar las columnas en cualquier orden, pero debes respetar el mismo nombre que tienen en la tabla. Si colocas un nombre diferente, el comando generará un error. Una vez que hayas definido el orden de las columnas, añade la palabra VALUES y comienza a declarar los valores que se van a utilizar. En este punto, deberás colocar los valores en la misma secuencia en la que se declararon las columnas. Es decir, si declaras la columna price antes que la columna symbol, deberás ajustar los valores para que el precio vaya antes del nombre del símbolo.
Tal vez esto haya quedado confuso, pero, si tú usas lo que se muestra abajo, tendrás el mismo efecto del script mostrado arriba, esto para insertar valores:
INSERT INTO tb_Quotes (of_day, price, symbol)
VALUES ('2023-07-06', 105.61, 'BOVA11'); Script en SQL
Observa que he cambiado el orden de declaración de las columnas. Por esta razón, fue necesario modificar el orden de colocación de los valores. Este es el principal aspecto en el que debes fijarte. Ahora, es posible que tengas una duda: ¿por qué la fecha se declara de esta forma? Bien, el motivo es que este es el formato que espera MySQL. Es decir, primero indicamos el año, después el mes y, por último, el día. Algunas bases de datos permiten utilizar otros formatos, que se formatearán como se ve aquí cuando la información vaya a grabarse en la base de datos. Un ejemplo de esto es SQL Server, que permite usar el formato día-mes-año. De todas formas, dentro de la base de datos, el formato será año-mes-día.
Muy bien, si tú ejecutas este script, mostrado arriba, tendrás como resultado que se muestre la imagen de abajo.

Ahora, presta atención: si tú vuelves a ejecutar la línea 11 nuevamente, duplicarás esta misma información en la base de datos. El resultado será lo que se ve justo debajo.

Podrías pensar que esto no es un problema, que basta con que borres la línea duplicada. Sí, bastaría con que borraras la línea duplicada. Pero primero debes entender que en este ejemplo es sencillo. Piensa ahora en una base de datos real: puedes tener una cantidad enorme de registros. Tener un registro duplicado hará que tu base de datos sea completamente inadecuada para su uso. Además, claro, impedirá o dificultará cambios o actualizaciones de algún registro específico. Por eso, crear una base de datos es algo que requiere estudio y planificación.
Aunque, conceptualmente, el script mostrado arriba es correcto, ya que se ejecuta, no lo es por permitir que la base de datos pueda contener datos duplicados. Pero es que, además, no permite cambiar o actualizar ningún registro. Para entender este detalle, vamos a usar otra forma de insertar datos en la base de datos. En lugar de declarar todas las columnas y valores de una sola vez, lo haremos por partes, algo que, en muchos escenarios, de hecho, ocurre. Así, el código para insertar los mismos valores que en el script quedaría como se muestra a continuación:
01. CREATE DATABASE IF NOT EXISTS MT5_Tutor_DB;
02. USE MT5_Tutor_DB;
03.
04. CREATE TABLE IF NOT EXISTS tb_Quotes
05. (
06. of_day DATE,
07. symbol CHAR(6),
08. price DECIMAL(5, 2)
09. );
10.
11. INSERT INTO tb_Quotes (of_day) VALUES ('2023-07-06');
12. INSERT INTO tb_Quotes (symbol) VALUES ('BOVA11');
13. INSERT INTO tb_Quotes (price) VALUES (105.61);
14.
15. SELECT * FROM tb_Quotes; Script en SQL
Fíjate que aquí estamos, literalmente, usando el concepto clave-valor, que es el mismo usado cuando creamos diccionarios en Python. Y sí, podemos hacer este tipo de cosa en SQL, y la base de datos recibirá los valores, almacenándolos dentro de la tabla indicada. Sin embargo, observa el resultado de la ejecución de este script. Esto se puede ver justo debajo:

Pero, ¿qué ocurrió? ¿Por qué obtuvimos este resultado y no el anterior? Hay dos motivos para ello. El primero es que simplemente estamos añadiendo datos a la base de datos. El segundo es que la base de datos está estructurada de forma que puede duplicar valores. Si intentas modificar algún registro, no lo conseguirás si tu base de datos se está creando como se muestra en estos scripts. Necesitamos crear alguna forma de selección de registro específico para poder manipularlo y modificar su valor. Así, podremos insertar los datos uno a uno, en formato clave-valor. Pero, ¿cómo podemos hacer esto?
El primer paso es transformar una de estas columnas en una clave única. Este es el primer paso. Al hacerlo, se impedirá que algún registro se duplique en la base de datos. Pero mi pregunta es: ¿cuál es la mejor forma de hacerlo?
Algunas personas suelen crear una columna solo para este propósito, lo cual no es una mala idea. Sin embargo, el tipo de solución depende de cada caso. En nuestro caso, no es necesario crear una columna extra solo para que sirva de clave única. Podemos hacerlo simplemente seleccionando la columna correcta. Así que vamos a pensarlo.
La columna «Precio» puede recibir valores que, en ocasiones, serán diferentes y, en otras, iguales. Por tanto, puede que no sea una buena idea hacerla única. En cambio, la columna que contiene el nombre del símbolo se repetirá con toda certeza en cada nuevo registro añadido. La columna de la fecha es una posible candidata.
Pero, ¿por qué posible y no la candidata? El motivo es que, ¿cada cuánto tiempo vamos a introducir nuevos registros en la base de datos? ¿Y por qué es importante? El motivo es que, si vas a registrar en un plazo muy corto, tendrás que crear realmente una columna solo para eso. Pero si los registros se realizan una vez al día, ya está.
Así, suponiendo que tú quieras guardar la cotización diaria de un símbolo, podrás modificar el primer script visto arriba de la siguiente forma:
01. CREATE DATABASE IF NOT EXISTS MT5_Tutor_DB;
02. USE MT5_Tutor_DB;
03.
04. CREATE TABLE IF NOT EXISTS tb_Quotes
05. (
06. of_day DATE PRIMARY KEY,
07. symbol CHAR(6),
08. price DECIMAL(5, 2)
09. );
10.
11. INSERT INTO tb_Quotes (of_day, symbol , price)
12. VALUES ('2023-07-06', 'BOVA11' , 105.61);
13.
14. SELECT * FROM tb_Quotes; Script en SQL
Observa que todo lo que se modificó en el primer script es precisamente la línea seis, donde añadimos el término PRIMARY KEY. En este momento, indicamos que el valor de la columna of_day será la clave primaria de esta tabla. Podemos tener más de una columna como clave primaria. Sin embargo, NO y vuelvo a repetir, NO podemos tener valores duplicados en la clave primaria. Si intentas hacerlo, SQL lo entenderá como un error y no se ejecutará el comando.
Por tanto, si intentas ejecutar de nuevo el comando INSERT INTO con la misma fecha que ya existe en la base de datos, no lo conseguirás. Será necesario proporcionar otra fecha para que el registro que estés intentando insertar sea aceptado por SQL. Este tipo de medida, extremadamente simple, es lo que hace que una base de datos sea consistente y evita que los registros se dupliquen. Como se ha dicho, una medida muy sencilla ha resuelto una serie de problemas.
El resultado de la ejecución del script de arriba se ve en la imagen de abajo:

Observa que es diferente de las demás imágenes. Aunque, en el momento de la consulta, el resultado será el mismo. Naturalmente, estarás pensando que ahora podremos insertar datos al estilo clave-valor o, mejor dicho, columna-valor. Sí, podemos hacer esto. Entonces, tu primera idea es crear un script como se muestra a continuación:
01. CREATE DATABASE IF NOT EXISTS MT5_Tutor_DB;
02. USE MT5_Tutor_DB;
03.
04. CREATE TABLE IF NOT EXISTS tb_Quotes
05. (
06. of_day DATE PRIMARY KEY,
07. symbol CHAR(6),
08. price DECIMAL(5, 2)
09. );
10.
11. INSERT INTO tb_Quotes (of_day) VALUES ('2023-07-07');
12. INSERT INTO tb_Quotes (symbol) VALUES ('BOVA11');
13. INSERT INTO tb_Quotes (price) VALUES (105.61);
14.
15. SELECT * FROM tb_Quotes; Script en SQL
Recuerda que este script se ejecuta justo después de tener un valor en of_day. Así, para evitar que SQL impida la creación del registro, cambias la fecha. De hecho, estás usando la lógica y demostrando que has entendido cómo funcionan las claves primarias. Sin embargo, al ejecutar este script, obtienes un error. Y, como eres curioso, buscas ver qué ocurrió en la base de datos, y obtienes la imagen de abajo:

Ahora puedes estar intrigado: ¿por qué se ha generado un error si se ha creado el registro? El motivo es que, en la línea 12, intentas insertar información. Al hacerlo, SQL intentará crear un nuevo registro. Pero espera un momento. ¿Cómo es que SQL tiene que crear un nuevo registro si yo no estoy diciendo que estoy creando una nueva clave primaria? Pensé que, mientras usara una clave primaria, estaría usando el mismo registro. De hecho, mucha gente comete este error al principio porque no ha entendido el concepto.
Pero aclaremos las cosas. Cuando tú usas el comando INSERT INTO, tú creas una nueva entrada de registro en la base de datos. Pero, para modificar este registro, que es justamente lo deseado ahora, tienes que usar otro comando. Así que vamos a separar las cosas y ver esto en otro tema.
Modificando y actualizando un registro
Para que SQL sepa qué registro modificar o actualizar, necesitamos una clave única, es decir, una clave primaria. Como definimos el valor of_day como clave primaria, lo primero que debemos hacer es intentar añadirla a la base de datos. Si ya existe, SQL impedirá la creación de un nuevo registro.
Una vez definida y registrada la clave primaria en la base de datos, podemos modificar o actualizar los valores de las demás columnas. Presta atención a esto: no debes intentar modificar el valor de la clave primaria para evitar problemas. Lo que debes hacer es crear la clave y, después, actualizar el registro. El código que hace la actualización para tener un nuevo registro usando el concepto de clave-valor o, mejor dicho, columna-valor, se ve justo debajo:
01. CREATE DATABASE IF NOT EXISTS MT5_Tutor_DB;
02. USE MT5_Tutor_DB;
03.
04. CREATE TABLE IF NOT EXISTS tb_Quotes
05. (
06. of_day DATE PRIMARY KEY,
07. symbol CHAR(6),
08. price DECIMAL(5, 2)
09. );
10.
11. INSERT INTO tb_Quotes (of_day) VALUES ('2023-07-07');
12. UPDATE tb_Quotes SET symbol = 'BOVA11' WHERE of_day = '2023-07-07';
13. UPDATE tb_Quotes SET price = 105.61 WHERE of_day = '2023-07-07';
14.
15. SELECT * FROM tb_Quotes; Script en SQL
El resultado de la ejecución de este script se ve justo debajo:

Nota que estamos considerando el hecho de que ya existe un registro anterior a la ejecución de este script de arriba. Por esta razón, hicimos las cosas de esta forma. Entonces, en la línea 11, creamos la clave para indicar que estaremos añadiendo una nueva entrada en la base de datos. En cuanto tenemos esta clave creada, usamos el comando UPDATE de la siguiente forma:
- Justo después del nombre del comando, indicamos cuál es el nombre de la tabla.
- Después del nombre de la tabla viene el comando SET; este indica que vamos a modificar o actualizar alguna columna.
- A continuación, tenemos el nombre de la columna con el respectivo valor que se colocará en ella.
- Para que SQL encuentre el registro que debe actualizarse, usamos el comando WHERE, indicando cuál es la clave que se usará.
Aquí tenemos algunas cuestiones más. Pero no voy a complicar las cosas. Vamos a mantener todo lo más simple posible. La idea es darte una base para que puedas usar SQL junto con MetaTrader 5, no impartir un curso sobre SQL. Pero te sugiero que profundices un poco más en lo que estoy mostrando, pues aquí podemos hacer muchas más cosas para agilizar el trabajo de SQL y evitar sobrecargarlo con requerimientos poco eficientes. La idea aquí es ser didácticos, no eficientes.
Muy bien, ahora que tú ya sabes cómo insertar, modificar y actualizar un registro, falta entender cómo eliminar un registro. Pero, nuevamente, vamos a separar las cosas para que no las confundas.
Eliminando un registro
Eliminar un registro de la base de datos es muy sencillo. Existen diversas maneras de eliminar ramas enteras de registros de una base de datos. Pero, una vez más, veremos el método más sencillo y básico, para que puedas, al menos, eliminar un registro de la base de datos.
Para hacerlo, supongamos lo siguiente: añadiste un registro para el 7 de julio de 2023, pero después te diste cuenta de que ese día no hubo negociación. Por tanto, deseas eliminar ese registro de la base de datos, ya que un registro inválido puede echar a perder toda la base de datos. Una de las maneras de hacerlo es usar el siguiente script que se muestra a continuación:
1. USE MT5_Tutor_DB; 2. 3. DELETE FROM tb_Quotes WHERE of_day = '2023-07-07'; 4. 5. SELECT * FROM tb_Quotes;
Script en SQL
Observa que primero seleccionamos la base de datos en la línea uno. En la línea tres, enviamos la solicitud para eliminar un registro de la base de datos. ¿Cómo se hizo esto? De la forma más simple posible. Es decir, primero indicamos el nombre del comando, que es: DELETE FROM; después, el nombre de la tabla en la que se encuentra el registro, tb_Quotes, en este caso. A continuación, especificamos qué se eliminará. Para ello, usamos el comando WHERE, seguido de la información que indica a SQL el tipo de coincidencia que se busca. En nuestro caso, utilizamos la clave primaria del día que queremos eliminar de la base de datos.
Para finalizar el script, en la línea cinco, le pedimos a SQL que nos muestre la tabla. ¿Notaste lo extremadamente simple que es eliminar un registro? Pero esta forma que se está mostrando es solo una de tantas formas posibles.
Consideraciones finales
En este artículo, he intentado simplificar las cosas todo lo posible. Sé que existen formas mucho mejores de hacer lo mismo que se muestra aquí. Si ya tienes experiencia y conocimientos sobre programas SQL, sabes muy bien que todo el contenido mostrado aquí es el verdadero arroz con frijoles de SQL. Para quien no lo sepa, el término arroz con frijoles es una expresión regional, que se usa para decir que necesitas lo mínimo, pero también cierta variedad, también mínima, para poder satisfacerte de alguna forma.
Pero, volviendo al tema, quiero prepararte mínimamente, querido lector, para que puedas hacer algo en SQL a través de estos artículos. No quiero que tengas que programar cosas que, como expliqué en el primer artículo, no tiene sentido que pierdas el tiempo programando rutinas y más rutinas para conseguir generar o producir algo que SQL ya contiene.
Hago este tipo de cosas para que tú, querido lector, te sientas motivado a buscar siempre un conocimiento adecuado y más amplio, para que no te quedes en la zona de confort ni pierdas el tiempo programando cosas que podrían hacerse de una manera mucho más simple, eficiente y segura si usaras la herramienta adecuada.
A menudo, mucha gente frunce el ceño al ver a un programador o a un grupo usando algún tipo de herramienta y dice que eso no está de acuerdo con su interés personal. Pero quiero decirte, querido lector que aspiras a ser un programador de calidad, que te olvides de esa vanidad. Empieza a usar las herramientas disponibles. Serás mucho más productivo, tendrás más confianza en lo que haces y, principalmente, serás mucho más valorado. Esto se debe a que, mientras otros se rompen la cabeza buscando una solución, tú, gracias a tu conocimiento más amplio, vas directamente a la herramienta adecuada y produces fácilmente la solución que el cliente desea. El mensaje de este artículo es:
El mundo de la tecnología evoluciona muy rápidamente. En el momento en que tú entiendes algo, significa que eso ya se volvió obsoleto.
Piensa en esto. Y nos vemos en el próximo artículo. Pues aún existen algunas cosas por explicar sobre SQL antes de que podamos, de hecho, empezar a producir algo para nuestro sistema de repetición/simulador usando la unión entre SQL y MQL5. Entonces, hasta luego.
| Archivo | Descripción |
|---|---|
| Experts\Expert Advisor.mq5 | Demuestra la interacción entre Chart Trade y el Asesor Experto (es necesario el Mouse Study para la interacción) |
| Indicators\Chart Trade.mq5 | Crea la ventana para configurar la orden a ser enviada (es necesario el Mouse Study para la interacción) |
| Indicators\Market Replay.mq5 | Crea los controles para la interacción con el servicio de reproducción/simulador (es necesario el Mouse Study para la interacción) |
| Indicators\Mouse Study.mq5 | Permite la interacción entre los controles gráficos y el usuario (necesario tanto para operar el sistema de repetición como en el mercado real) |
| Servicios\Market Replay.mq5 | Crea y mantiene el servicio de reproducción y simulación de mercado (archivo principal de todo el sistema) |
| Código VS C++\Server.cpp | Crea y mantiene un socket servidor desarrollado en C++ (versión MiniChat). |
| Code in Python\Server.py | Crea y mantiene un socket en Python para la comunicación entre MetaTrader 5 e o Excel |
| Indicators\Mini Chat.mq5 | Permite implementar un minichat mediante un indicador (requiere el uso de un servidor para funcionar) |
| Experts\Mini Chat.mq5 | Permite implementar un mini chat mediante un Asesor Experto (requiere el uso de un servidor para funcionar) |
| Scripts\SQLite.mq5 | Demuestra el uso de un script SQL mediante MQL5 |
| Files\Script 01.sql | Demuestra la creación de una tabla simple, con clave foránea |
| Files\Script 02.sql | Demuestra la adición de valores en una tabla |
Traducción del portugués realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/pt/articles/12927
Advertencia: todos los derechos de estos materiales pertenecen a MetaQuotes Ltd. Queda totalmente prohibido el copiado total o parcial.
Este artículo ha sido escrito por un usuario del sitio web y refleja su punto de vista personal. MetaQuotes Ltd. no se responsabiliza de la exactitud de la información ofrecida, ni de las posibles consecuencias del uso de las soluciones, estrategias o recomendaciones descritas.
Automatización de estrategias de trading en MQL5 (Parte 16): Ruptura del rango de medianoche con BoS (Break of Structure) basada en la acción del precio
Algoritmo de optimización caótica — Chaos optimization algorithm (COA)
Redes neuronales en el trading: Optimización de LSTM para la predicción de series temporales multivariadas (Final)
Automatización de estrategias de trading en MQL5 (Parte 15): Patrón armónico Cypher de acción del precio con visualización
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso