Русский Português
preview
Simulación de mercado (Parte 11): Sockets (V)

Simulación de mercado (Parte 11): Sockets (V)

MetaTrader 5Ejemplos |
335 0
Daniel Jose
Daniel Jose

Introducción

En el artículo anterior, «Simulación de mercado (Parte 10): Sockets (IV)», hablé sobre xlwings y su capacidad para integrar Python con Excel. Muy bien, pese a que todo aquello pueda parecer muy distante y sin aplicaciones para nosotros aquí, en el sistema de repetición/simulador. Y antes de que frunzas el ceño ante la integración entre Python y Excel, veamos cómo podemos usar xlwings para controlar, en cierta medida, MetaTrader 5 a través de Excel. Lo que voy a mostrar aquí se centrará principalmente en la didáctica. No pienses que solo podemos hacer lo que mostraré. Podemos hacer muchas más cosas. No obstante, necesitarás estudiar cómo xlwings consigue que Excel funcione vía Python. Solo así lograrás tener un control total de MetaTrader 5 desde Excel o incluso sin utilizar Excel. Podrás controlar MetaTrader 5 desde Python.


Empezamos con lo básico

Para empezar, necesitamos hacer algo muy sencillo. Sin embargo, deberá funcionar de verdad. Empezaré usando un ejemplo de la documentación de xlwings, pero lo explicaré de forma diferente. Así entenderás por qué podemos ejecutar Python dentro de Excel.

Vamos a empezar con algo muy fácil. En cualquier editor, escribe y guarda el código en Python que se ve en la imagen de abajo.

Fíjate en algunos detalles de la imagen, como el lugar donde guardo el archivo. Pero lo más importante es el nombre del archivo. Este nombre será muy importante después. Ahora, observa que este script en Python hace referencia a algo. En este caso, hacemos referencia a una hoja de cálculo de Excel. Pero ¿a qué hoja? Calma, un paso a la vez. Antes de averiguar qué hoja es, fíjate en que, en la línea cinco, escribiremos un texto en una celda concreta.

Pero, para que este código funcione, es necesario que la hoja de cálculo esté abierta en una sesión de Excel. Esto se debe a la línea cuatro. Es ella la que establece la conexión para saber en qué hoja escribiremos el texto. Entonces, haz lo siguiente: bre Excel y añade una nueva hoja, de modo que Excel quede como se muestra en la imagen de abajo:

Ahora, atención. Tal y como está ahora, podemos seleccionar una hoja u otra en Excel. ¿Y por qué estamos haciendo esto? El motivo es que vamos a crear una macro que se activará cuando se seleccione la hoja Sheet1. Así, no será necesario añadir elementos extra para llamar a la macro. Presiona ALT + F11 para abrir el VBA de Excel y escribe el código que se muestra en la imagen de abajo.

Observa que el código pertenece a Sheet1. Así, tan pronto como esta se active, este pequeño script en VBA se ejecutará. Ahora, observa la tercera línea del código. Para que esta línea se interprete correctamente, xlwings debe estar referenciado. En el artículo anterior, expliqué cómo hacerlo. Una vez referenciado xlwings, podemos hacer que el script en Python se ejecute. Pero, ¿cómo?

Como puedes ver, estamos importando el archivo que guardamos en la primera imagen de este tema. Ahora, para que VBA sepa dónde está el archivo, debemos pasarle su nombre junto con el directorio al que pertenece. Pero, como nuestra hoja de cálculo se guardará en el mismo directorio, no es necesario indicar cuál es.

Ahora, para que VBA, o mejor dicho, xlwings, sepa qué parte del script en Python será ejecutada, le informamos esto después del punto y coma. Luego, vuelve a Excel y cambia de hoja. Cuando hagas esto, el resultado será el que se muestra en la imagen inmediatamente inferior.

Perfecto. Acabas de ver cómo Python puede realizar tareas dentro de Excel, reemplazando gran parte del VBA. Digo «gran parte» porque aun así necesitarás hacer algunas cosas en VBA para que Python ejecute lo programado en el script.

Pero ¿qué tiene esto que ver con MetaTrader 5? Calma, querido lector, ya llegaremos allí. Si no tienes conocimientos de Python, puede que pienses que lo que acabamos de hacer es una tontería. Sin embargo, si ya estudias o programas en Python, seguramente se te habrán iluminado los ojos al imaginar las posibilidades que este simple «Hola, mundo» nos acaba de abrir.

Muy bien, si podemos escribir, también podemos leer. Y es en este punto donde la cosa empieza a ponerse interesante. ¿Recuerdas que dije que, aunque podríamos usar un servidor RTD o DDE para transferir datos a Excel, en realidad sería una pérdida de tiempo? La información se dirigiría únicamente a Excel y no podríamos utilizar ningún cálculo realizado en Excel para controlar MetaTrader 5.

Pues bien, dado que podemos usar Python para escribir y leer datos directamente en Excel, ahora podemos empezar a pensar un poco más allá. Esto nos permite controlar un Asesor Experto desde Excel, para lo que solo necesitamos crear una forma de comunicación entre Excel y MetaTrader 5. No obstante, si no quieres usar Excel, puedes hacer lo mismo con Python.

Sin embargo, algunos operadores ni siquiera miran el gráfico. Operan basándose únicamente en el precio. O, mejor dicho, en los fundamentos. ¿Y cuál es la mejor forma de analizar los fundamentos? Exacto: una hoja de cálculo de Excel. Pero no solo Excel, sino que hacen falta otras herramientas junto a él. En este caso, sin embargo, nos centraremos en lo básico, ya que la idea es mostrar cómo hacer otra cosa que crearemos en otro momento.


Planificamos la comunicación entre Excel y MetaTrader 5

Para establecer esta comunicación entre Excel y MetaTrader 5, necesitamos un método eficaz y sencillo de implementar. Una de las mejores formas de hacerlo es mediante sockets. Esto se debe a que un socket permite que Excel se encuentre en un equipo y MetaTrader 5 en otro, pero también que ambos se encuentren en el mismo dispositivo. La forma de seleccionar esta configuración la controlará el operador. Es decir, si la persona quiere dejar un equipo dedicado a MetaTrader 5 y otro a Excel, los sockets permitirán que esto ocurra. Y, aun cuando el operador desee usar ambos programas en una misma máquina, se hará sin que sea necesario cambiar el protocolo de comunicación. En resumen, los sockets son una herramienta muy práctica.

Muy bien, pero ¿cómo lo haremos? Aquí entra en juego la decisión personal de cada uno. Pero, como estoy mostrando cómo se usa Python en Excel y ya sabemos que los scripts en Python se pueden utilizar en MetaTrader 5, esto nos abre muchas posibilidades. La principal es crear un servidor en Python que podamos usar tanto en MetaTrader 5 como en Excel. Sin embargo, antes de hacerlo, pensemos un poco. Python nos permitirá leer y escribir valores directamente en la hoja de cálculo. Sin embargo, como expliqué, lo ideal será hacerlo mediante sockets. Por tanto, necesitamos que MetaTrader 5 o Excel ejecuten un cliente. En este punto, queda claro que, si hacemos que el servidor se ejecute en MetaTrader 5, necesitaremos programar un cliente en Excel. No obstante, MQL5 nos permite crear un cliente para ejecutarse directamente en un Asesor Experto de forma muy sencilla.

Ahora creo que ya has captado la idea básica de lo que debemos programar. Así que vamos a comenzar nuevamente con algo muy sencillo. Nada de cosas complicadas ni llenas de enredos. De esta manera, surge la idea de probar a crear un servidor de eco. Este servirá únicamente para probar la comunicación entre Excel y MetaTrader 5, ya que es lo más simple de programar cuando se trata de sockets.


Implementamos el servidor de eco

Como este es el código de servidor más sencillo, no esperes demasiado de él. La idea es probar únicamente cómo Excel trabajará con un servidor escrito en Python. Veamos qué debemos hacer. En primer lugar, crearemos el código del servidor en Python. Puede verse a continuación.

01. import socket
02. import xlwings as xw
03. 
04. def Echo():
05.         wb = xw.Book.caller()
06.         server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
07.         server.bind(("127.0.0.1", 27015))
08.         wb.sheets[0]['A1'].value = "Waiting connection..."
09.         server.listen(1)
10.         client, addr = server.accept()
11.         client.send("Wellcome to Server in Python\n\r".encode())
12.         wb.sheets[0]['A2'].value = str(f"Client connected by {addr}")
13.         while True:
14.             info = client.recv(512)
15.             if not info:
16.                 break
17.             client.send(b"Echo Server:" + info)
18.         wb.sheets[0]['A3'].value = "Client disconnected"
19.         client.close()

Script en Python

Pero, ¿eso es todo? Sí. Aunque hay un detalle. Este código está diseñado para interactuar con Excel e informar sobre lo que se está haciendo en el servidor. Si ya entiendes Python, este código ni siquiera te hará cosquillas. Pero si no tienes ni idea de lo que está ocurriendo, vamos a ver qué hace este script en Python.

En las líneas uno y dos le indicamos a Python qué módulos necesitamos. En la línea cuatro, iniciamos la construcción de un procedimiento. Se utilizará más adelante en VBA. Pero primero, comprendamos esta parte en Python. En la línea cinco, nos conectamos a Excel, por así decirlo. En las líneas ocho, doce y dieciocho, colocamos el estado de ejecución en la hoja de cálculo de Excel, tal como hicimos en el tema anterior.

Todas las demás líneas forman parte del servidor de eco. El detalle importante es que este servidor solo permite una conexión. Es decir, cuando alguien se conecte a él, quedará bloqueado en ese cliente y no aceptará ninguna otra conexión. Cuando ese cliente cierre la conexión, el servidor se apagará. Puede que esto parezca poco versátil, pero recuerda que solo estamos probando.

Otro detalle, y este tal vez sea aún más importante, se encuentra en la línea siete. Observa que allí tenemos un valor indicado. Este valor, en formato IPv4, indica que solo se aceptará la conexión de un cliente que se encuentre en la dirección indicada. En este caso, se refiere al host local. Es decir, tanto el cliente como el servidor deben estar en la misma máquina. Da igual que sea física o virtual. Lo que importa es que ambos estén en el mismo equipo.

Puedes modificar el valor indicado por otro lugar donde se espera que esté el cliente. Puede ser incluso un sitio web. Sin embargo, si no lo sabes o prefieres que el cliente pueda estar en cualquier dirección, basta con poner el valor «0.0.0.0». En este caso, Python o, mejor dicho, el socket, entenderá que cualquier dirección es válida para que el cliente se conecte. Recuerda que solo se permite un cliente cada vez:

Está bien, pero ¿qué pasa si quieres llegar a un número mucho mayor de clientes? ¿Cómo proceder? En este caso, será necesario añadir las conexiones a un hilo, casi de la misma forma que hicimos en el código de C++. Sin embargo, en Python es aún más sencillo. No obstante, para nuestro propósito, esto no será necesario. El hecho de que este servidor acepte una conexión y se haga eco de ella ya nos será suficiente.

Ahora que tienes el código del servidor en Python, podemos hacer lo mismo que se hizo en el tema anterior. Es decir, usar la función RunPython para ejecutar el servidor, ¿no es así? ¿Cierto? Es correcto. Pero hagamos una pequeña modificación al código VBA del tema anterior. El código en VBA quedará como se muestra abajo:

1. Private Sub Worksheet_Activate()
2.     MsgBox "Call Server..."
3.     RunPython "import Server_Echo; Server_Echo.Test()"
4. End Sub

Script VBA

La simplicidad de este código resulta sorprendente. Observa que, en la línea tres, solo hemos cambiado el nombre del archivo y el del procedimiento que se va a llamar. El detalle está en la línea dos. Esta línea está ahí para que veas cuándo el servidor intenta ser llamado nuevamente. Prueba a cambiar de hoja para activar el servidor. Cuando se haga un intento de segunda creación, Python disparará un aviso de error. Pero no se trata de un error en sí mismo. Lo que sucede es que este código no verifica si el servidor está activo. Algo similar ocurrirá cuando dos clientes intenten conectarse en la misma sesión. Dejaré estos experimentos como tarea. Así comprenderás las limitaciones de este código didáctico y podrás realizar las correcciones pertinentes.

Entregar el código ya corregido y completamente funcional para poder utilizarlo como servidor de eco. Creo que es algo sin sentido. Lo mejor es que tú, estimado lector, procures entender los problemas. Intenta crear o implementar una solución. De esta forma, tanto el conocimiento como el concepto detrás de un socket se asimilarán mejor. Pero resolver estas fallas no es nada complicado. Ya di las pistas para subsanarlas. Solo es cuestión de procurar entender lo que está ocurriendo y corregir el problema.

Muy bien, esta parte está lista. Ahora veamos el cliente en MQL5.


Implementamos el cliente en MQL5, versión eco

Al igual que hicimos en la parte del servidor, aquí también podríamos implementar un código completamente en Python. Pero ya nos prepararemos para lo que haremos después. Así que olvidemos Python por un momento y centrémonos en MQL5. El código de la parte del cliente se encuentra justo abajo.

01. //+------------------------------------------------------------------+
02. #property service
03. #property copyright "Daniel Jose"
04. #property description "Echo Server Test Service."
05. #property description "Requires that the Python server is running in Excel."
06. #property version   "1.00"
07. //+------------------------------------------------------------------+
08. input string     user00 = "127.0.0.1";   //Address
09. input int        user01 = 27015;         //Port
10. //+------------------------------------------------------------------+
11. void OnStart()
12. {
13.     char buff[], resp[];
14.     int sock = SocketCreate(), ret;
15.     uint len;
16.     string szMsg;
17.     
18.     if (sock == INVALID_HANDLE)
19.     {
20.         Print("Unable to create socket. Error: ", GetLastError());
21.         return;
22.     }
23.     if (!SocketConnect(sock, user00, user01, 1000))
24.     {
25.         Print("Connection with the address [", user00, "] in port ", user01, " failed. Error code: ", GetLastError());
26.         SocketClose(sock);
27.         return;
28.     }
29.     while (!_StopFlag)
30.     {
31.         szMsg = TimeToString(TimeLocal(), TIME_DATE | TIME_SECONDS);
32.         len = StringToCharArray(szMsg, buff) - 1;
33.         Print("To Server: ", szMsg);
34.         if (SocketSend(sock, buff, len) != len)
35.         {
36.             Print("Error code: " , GetLastError());
37.             break;
38.         };
39.         szMsg = "";
40.         do
41.         {
42.             len = SocketIsReadable(sock);
43.             ret = SocketRead(sock, resp, len, 1000);
44.             if (ret > 0)
45.                 szMsg += CharArrayToString(resp, 0, ret);
46.         }while ((ret <= 0) && (!_StopFlag));
47.         Print("From Server: ", szMsg);
48.         Sleep(1000);
49.     }
50.     SocketSend(sock, buff, 0);
51.     SocketClose(sock);
52. }
53. //+------------------------------------------------------------------+

Servicio en MQL5

Antes de hablar sobre este código, veamos un pequeño detalle que deberás ajustar para que todo funcione correctamente. Sí, es necesario indicarle a MetaTrader 5 que permites abrir un socket. Principalmente, debes especificar la dirección de destino. Esto se hace tal y como se muestra en la imagen inferior.

Una vez hecho esto, podemos ver cómo funciona el código del cliente en MQL5. Lo primero que probablemente llamará tu atención es la línea dos. Efectivamente, podemos usar un servicio para implementar el socket. El único tipo de aplicación que no puede implementar un socket es un indicador. Fuera de eso, tendrás total libertad con los demás tipos de aplicación.

Ahora, es muy probable que encuentres este código bastante similar al de los artículos anteriores. De hecho, lo es. Todo código orientado a trabajar con sockets es muy similar. Por lo tanto, todo lo explicado anteriormente sigue siendo válido. La única diferencia real está en la línea 50.

Ahora bien, es posible que te preguntes: ¿por qué existe esta línea? Para entenderla, es necesario comprender el código del servidor en Python. En él se puede ver que, cuando en la línea 15 el servidor recibe una información inválida o vacía, se cierra. Es precisamente eso lo que ejecuta la línea 50, aunque esta no es la mejor forma de hacer que el servidor y el cliente se comuniquen para indicar que se va a cerrar la conexión. Sin embargo, para fines iniciales y pruebas básicas, podemos aceptarlo por ahora. Así, mientras el cliente esté conectado al servidor, verás en MetaTrader 5 la siguiente imagen.

Observa que estamos haciendo eco de la información del reloj. Es algo sencillo, pero que ayuda a entender cómo se está desarrollando el proceso de comunicación. Si consultas la siguiente imagen, que se mostrará en Excel, podrás ver lo que te explico.


Aspectos que deben comprenderse antes de la próxima etapa

Bien. Esto es lo más básico de lo básico. Sin embargo, antes de pasar a la siguiente etapa y ver el código completo, recordemos una vez más que el objetivo de este código es didáctico, no está terminado. Me gustaría aprovechar este momento para explicar algunas cosas sobre lo que tenemos hasta ahora.

Estas cosas no serán ninguna novedad para quienes ya tienen experiencia. No obstante, creo que tú, estimado lector, quizás aún no tienes tanta experiencia en el uso de sockets. La verdad es que me preocupa que, al estar empezando tus estudios, pienses que todo es perfecto y que basta con seguir una receta para que los sockets funcionen correctamente.

Pero la realidad no es tan bella. Aunque tampoco es algo tan aterrador. No debería infundirte miedo ni hacerte huir cuando se habla de sockets. Los sockets son, de hecho, una de las herramientas más prácticas y simples que existen para comunicarse. Ya sea entre programas, entre diferentes plataformas (entiéndase como sistemas operativos) o incluso entre equipos distintos, como usar una Raspberry junto con un ordenador personal. En definitiva, los sockets hacen que la comunicación entre estos elementos, que pueden ser muy diferentes entre sí, sea muy sencilla. Pero, si no tomas ciertas precauciones, tendrás serios problemas o, como mínimo, dificultades para comprender y resolver los obstáculos que, sin duda, surgirán.

Pensemos por un momento en nuestra pequeña implementación, que ya está funcionando, y en la que tenemos un intercambio de información entre Excel y MetaTrader 5. A diferencia de lo que hicimos en los artículos anteriores, donde usábamos un único servidor que se ejecutaba en la línea de comandos, aquí podrías, sin darte cuenta, intentar algo que normalmente no harías de forma consciente: ejecutar dos servidores en el mismo entorno. Es decir, tener un símbolo del sistema con un servidor en ejecución, abrir otro en la misma sesión del sistema operativo e intentar ejecutar el mismo servidor en este nuevo prompt. Si no sabes lo que pasará en este caso, pruébalo. Verás que, de alguna manera, no es posible. Sin embargo, aquí es donde se esconde una cuestión que muchas personas, incluso las que tienen mucha experiencia (al menos en teoría), no comprenden acerca de los sockets.

Si ejecutas el servidor de Mini Chat desde un prompt, no podrás ejecutar ese mismo servidor en otra consola dentro de la misma sesión del sistema operativo bajo ninguna circunstancia. Esto es un hecho.

Ahora recuerda que el servidor del minichat utilizará el puerto 27015 y que el servidor de eco, que se ejecutará en Excel, también hará uso de él. Por tanto, en teoría, tendremos aquí un conflicto de intereses. Podrías pensar que el sistema operativo impediría que un servidor interfiriera o intentara escuchar en el mismo puerto utilizando el mismo protocolo. En este caso, estamos usando el protocolo TCP. Sin embargo, podríamos estar usando TCP en un servidor y UDP en el otro. En ese caso, no habría problema en que ambos usaran el mismo puerto.

Sin embargo, cuando usamos el mismo puerto, con el mismo protocolo y en el mismo host, las cosas comienzan a complicarse un poco.

Quiero hacer hincapié en este punto para que tú, estimado lector y aspirante a convertirte en un usuario avanzado de sockets, comprendas que existen ciertas precauciones que deben tomarse cuando se quiere trabajar con sockets. Pero, sobre todo, quiero que, antes de ver cómo se implementa la comunicación entre Excel y MetaTrader 5, comprendas lo que ocurre cuando dos servidores diferentes utilizan los mismos recursos. En este caso, el mismo protocolo, el mismo puerto y el mismo host. Para entenderlo, abre primero el servidor del minichat y déjalo esperando a que se produzca alguna conexión.

Ahora, abre el servidor de eco en Excel y déjalo también esperando a que ocurra una conexión. Es decir, tendrás algo similar a lo que se muestra en la imagen de abajo.

Ahora viene mi pregunta: antes de probar, quiero que pienses cuál de los servidores aceptará la conexión con el cliente. O, dicho de otro modo, ¿cuál comenzará a escuchar y responder al cliente? Recuerda que ambos tienen un código muy simple, sin ningún tipo de verificación que autentifique si el cliente es adecuado para el servidor ni qué tipo de requerimiento debería esperar recibir el servidor.

No sé si has logrado comprender realmente lo que intento explicarte. El hecho es que, aunque los dos servidores sean distintos, ambos utilizan los mismos recursos. Es decir, utilizan el mismo puerto y el mismo protocolo, que en este caso es TCP, y el mismo equipo o host. Esta situación es la que hace que el trabajo con sockets sea tan complejo. Si tienes un servidor que debe responder a determinados requerimientos y añades otro que usa los mismos recursos sin darte cuenta, podrías impedir que los clientes recibieran correctamente la respuesta a sus solicitudes.

Por eso es importante que entiendas que los códigos que muestro aquí NO ESTÁN terminados. Son solo para uso personal y con fines didácticos. Un código real de un servidor real es muy diferente en cuanto a las reglas de uso que debe seguir.

En muchos casos, algunos podrían decir simplemente que es fácil resolver esta cuestión. Todo lo que necesitas hacer es cambiar el protocolo o el puerto. Eso resolvería el conflicto entre los servidores. Es verdad. Incluso una solución tan simple como colocar un servidor en un equipo y otro en otro resolvería el problema, aunque ambos utilizaran el mismo puerto y protocolo.

Pero la cuestión sigue en el aire. En la imagen de arriba, ¿cuál de los dos responderá a la solicitud del cliente para conectarse? Para saberlo, basta con observar cuál fue el último en ponerse en funcionamiento. Es decir, si aún no se ha conectado ningún cliente, cuando el primero intente establecer la conexión, se conectará al último servidor que se haya ejecutado. Tan pronto como se apague ese servidor, el inmediatamente anterior comenzará a procesar las solicitudes de nuevos clientes.

Un detalle: si un cliente está conectado a un servidor y este se desactiva, la conexión se perderá y el cliente no se conectará automáticamente al otro servidor. No es así como funcionan las cosas. Será necesario que el cliente realice una nueva solicitud de conexión. Solo entonces podrá conectarse realmente al servidor que esté escuchando ese puerto con ese protocolo. Esto, claro, si la puerta, el protocolo y el host son los mismos que los del servidor desactivado.


Consideraciones finales

Aunque en este artículo no se haya mostrado la implementación real que permite el intercambio de mensajes entre Excel y MetaTrader 5, he querido aprovechar este momento para explicar algo que considero importante. No quiero que tú, estimado lector, con poca o ninguna experiencia en sockets, llegues a pensar que su uso es la octava maravilla del mundo o que termines decepcionado al descubrir que no resuelve tu problema.

Los sockets son una de las herramientas más complejas y, a la vez, más simples del mundo de la informática. Si los comprendes, podrán ayudarte enormemente. Pero si los consideras simples y crees que puedes utilizarlos de cualquier manera, sin criterio ni comprensión, te causarán serios dolores de cabeza.

Al comenzar esta serie sobre el servicio de repetición/simulador, se consideró la posibilidad de usar sockets para crear todo el sistema de simulación o repetición. En cierto modo, esto sería considerablemente más sencillo en términos generales de construcción, ya que solo habría que enviar los datos de los ticks directamente al puerto que MetaTrader 5 utiliza para conectarse al servidor de trading real. Sin embargo, tras pensarlo con más calma, esta idea se descartó. ¿Por qué? Bueno, el motivo es que sería necesario recurrir a técnicas que no quiero explicar cómo utilizar en la práctica. Sin embargo, quiero que reflexiones un poco sobre ello. Nos vemos en el próximo artículo, donde veremos cómo Excel puede enviar datos a MetaTrader 5 y cómo MetaTrader 5 puede responder a Excel.

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
Scripts\CheckSocket.mq5 Permite realizar una prueba de conexión con un socket externo.
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)

Traducción del portugués realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/pt/articles/12744

Archivos adjuntos |
Anexo.zip (560.03 KB)
Dominando los registros (Parte 4): Guardar registros en archivos Dominando los registros (Parte 4): Guardar registros en archivos
En este artículo, te enseñaré operaciones básicas con archivos y cómo configurar un controlador flexible para personalizarlo. Actualizaremos la clase CLogifyHandlerFile para escribir los registros directamente en un archivo. Realizaremos una prueba de rendimiento simulando una estrategia en el EURUSD durante una semana, generando registros en cada tick, con una duración total de 5 minutos y 11 segundos. El resultado se comparará en un artículo futuro, en el que implementaremos un sistema de almacenamiento en caché para mejorar el rendimiento.
Desarrollo de asesores expertos autooptimizables en MQL5 (Parte 4): Dimensionamiento dinámico de posiciones Desarrollo de asesores expertos autooptimizables en MQL5 (Parte 4): Dimensionamiento dinámico de posiciones
El uso exitoso del trading algorítmico requiere un aprendizaje continuo e interdisciplinario. Sin embargo, la infinita gama de posibilidades puede consumir años de esfuerzo sin producir resultados tangibles. Para abordar esta cuestión, proponemos un marco que introduce gradualmente la complejidad, lo que permite a los operadores perfeccionar sus estrategias de forma iterativa en lugar de dedicar un tiempo indefinido a resultados inciertos.
Simulación de mercado (Parte 12): Sockets (VI) Simulación de mercado (Parte 12): Sockets (VI)
En este artículo, veremos cómo resolver algunos problemas y cuestiones al usar código escrito en Python dentro de otros programas. Más concretamente, mostraré un problema habitual que ocurre al usar Excel junto con MetaTrader 5, aunque para esta comunicación utilizaremos Python. Sin embargo, hay un pequeño inconveniente en esta implementación. No ocurre en todos los casos, sino solo en algunos específicos. Cuando ocurre, es necesario entender la razón. En este artículo, empezaré a explicar cómo resolverlo.
Simulación de mercado (Parte 10): Sockets (IV) Simulación de mercado (Parte 10): Sockets (IV)
En este artículo, te muestro lo que necesitas hacer para empezar a utilizar Excel y controlar MetaTrader 5, pero de una forma muy interesante. Para ello, utilizaremos un complemento de Excel, de modo que no sea necesario utilizar el VBA integrado. Si no sabes de qué complemento se trata, consulta este artículo y aprende a programar en Python directamente en Excel.