MT4TerminalSyn: Sistema para la Sincronización de Terminales MetaTrader 4

Valery V. Chesnokov | 30 marzo, 2016

Introducción

Muchos trades y desarrolladores de sistemas de trading tienen varias copias de terminales MetaTrader 4 con fines técnicos. En ellas se abren diferentes gráficos y cuentas, y se prueban diferentes estrategias. Junto a esto, se lanzan de vez en cuando nuevas versiones de la terminal, aparecen nuevos indicadores y Asesores expertos, y se escribe otro código MQL.

Tarde o temprano, hay que sincronizar las cuentas utilizadas para una operación normal. Para ello se necesita una herramienta técnica que sea capaz de realizar esta tarea. En este artículo veremos e proceso de crear y obtener dicha herramienta.

¿A quién está destinado el artículo?

E artículo analiza la creación de un sistema de ejemplo para la sincronización de varias copias de terminal.

Por ello, el artículo puede ser interesante para dos tipos de lectores:
1. Usuarios-traders que utilizan el sistema resultante de este artículo.
2. Desarrolladores profesionales de sistemas más allá del código MQL, que puede que analicen este sistema con fines educativos personales y, quizás, ofrecer algún comentario constructivo.

Necesidades del sistema de sincronización de terminales

Suponga que tiene ocho copias de una terminal. Descarga una versión nueva. ¿Cómo? ¿Hace clic ocho veces en el archivo descargado https://www.metaquotes.net/files/mt4setup.exe e indica las carpetas con las copias? Bueno, eso no es difícil.

Suponga que ha desarrollado tres nuevos indicadores, dos Asesores expertos y una biblioteca. Ahora tiene que probarlos en diferentes situaciones en las ocho copias de la terminal. Eso quiere decir que tiene que actualizar los archivos fuente de MQL y los archivos binarios ex4. Ha desarrollado lo anteriormente nombrado en una copia fuente de la terminal. Ahora tiene que repetirlo en las otras copias. Abra una por una las subcarpetas de la terminal fuente: expertos, luego expertos\indicadores, y expertos\bibliotecas. Copie los archivos necesarios en cada subcarpeta en Windows Explorer, luego abra en cada copia actualizada de la terminal la misma carpeta y copie los archivos en ella. Y repita este ciclo doble con cada subcarpeta fuente y cada subcarpeta análoga de la terminal actualizada.

¿Le resulta familiar esta situación? Si lo hace a menudo, probablemente ha pensado lo simple que es este trabajo. Para ello se necesita una herramienta que permita automatizar esta tarea. Es decir, es mejor comenzar con la actualización de terminales haciendo clic en un botón. Y sería muy útil tener la posibilidad de establecer los parámetros para este proceso, como la forma en la que la fuente controla la terminal, muchas formas de actualizar las terminales, establecer filtros para los archivos que hay que actualizar. Por ejemplo, la sincronización de sistemas deben mostrar si ha habido algún error en la ruta de la carpeta de la terminal.

Esto significa que la herramienta tiene que ser flexible y eficiente. Intentemos crear una herramienta así.

Prestaciones técnicas

Este artículo está dedicado al tema "Ampliar las posibilidades de los programas MQL4 utilizando funciones de sistemas operativos y otros medios de desarrollo de programas". Es por eso que los recursos utilizados van más allá de la terminal MetaTrader 4 y del lenguaje MQL.

El sistema de sincronización que se crea y se describe aquí para copias de terminales, necesita las siguientes características para su correcto funcionamiento:
1. Sistema operativo: Microsoft Windows 2000 SP4 o superior: Microsoft Windows 2000, Windows XP, Windows Server 2003, Windows Server 2003 R2, Windows Vista.
2. Plataforma Microsoft: .NET Framework 2.0 Se puede descargar de la página web de Microsoft:
2,1. http://www.microsoft.com/downloads/details.aspx?displaylang=ru&FamilyID=0856EACB-4362-4B0D-8EDD-AAB15C5E04F5 : distribuido en ruso (RUS) para procesadores x86, archivo dotnetfx.exe tamaño 22 MB.
2,2. http://www.microsoft.com/downloads/details.aspx?displaylang=ru&FamilyID=0856EACB-4362-4B0D-8EDD-AAB15C5E04F5 : distribuido en inglés (EN) para procesadores x86, archivo dotnetfx.exe tamaño 22 MB.
2,3. http://www.microsoft.com/downloads/details.aspx?displaylang=ru&FamilyID=0856EACB-4362-4B0D-8EDD-AAB15C5E04F5 : distribuido en inglés (EN) para procesadores x86, archivo NetFx64.exe tamaño 22 MB.
3. Base de datos para usuarios de ordenadores de escritorio Microsoft SQL Server 2005 Compact Edition. Esta redacción del servidor SQL consiste en 8 archivos dll. Se puede descargar en: http://www.microsoft.com/downloads/details.aspx?FamilyId=%2085E0C3CE-3FA1-453A-8CE9-AF6CA20946C3&displaylang=en - SQLServerCE31-EN.msi archivo 1,7 MB En el artículo "Instalación en un ordenador de escritorio o PC Tablet (SQL Server Compact Edition)" puede encontrar más información: http://technet.microsoft.com/en-us/library/bb190958.aspx (EN)
http://technet.microsoft.com/en-us/library/bb190958.aspx

A continuación puede encontrar más información para desarrolladores.

Si quiere crear un sistema similar utilizando las tecnologías de las que se han hablado, necesitará Microsoft Visual Studio 2005, por ejemplo, una de las redacciones libres de Visual Studio 2005 Express Edition para el lenguaje C# o VB.NET. Puede descargar Microsoft® Visual Studio® 2005 Express Editions Service Pack 1 en: /go?link=http://www.microsoft.com/en-us/download/details.aspx?id=804 También puede pedir versiones de prueba de Visual Studio 2005 en: http://www.microsoft.com/emea/msdn/visualstudio/ruru/getthetrials/ O puede utilizar una versión más actualizada de Visual Studio 'Orcas', que en el momento en el que se escribió este artículo se encontraba en la versión Beta 1. El nombre preliminar Orcas pasó a ser Visual Studio 2008. Puede obtener más información sobre Visual Studio y su nueva versión en: http://msdn2.microsoft.com/en-us/vstudio/aa700831.aspx

No se tarda más de dos o tres minutos en instalar Microsoft .NET 2.0 y Comptact Edition si ya tiene los dos archivos necesarios(dotnetfx.exe y SQLServerCE31-EN.msi para las versiones x86 de Windows). Sólo tiene que descargar el archivo, hacer clic en "Siguiente" y "Finalizar".

Componentes del sistema

Excepto el software externo que se ha enumerado, el propio sistema de sincronización tiene muchos archivos, descritos a continuación.

Aquí, los archivos .exe y .dll son de código binario ejecutable, el archivo config.xml es un archivo instalador del botón de inicio (más adelante se da más información), el archivo MT4TerminalSync.sdf es la base de datos del sistema, y el archivo Log.txt contiene informes de todos los errores del funcionamiento del sistema.

Nota: dada la ideología del desarrollo del programa de red, especialmente aquellos que trabajan en servidores de terminales, los sistemas pueden no tener derecho a hacer informes de la carpeta actual de la que se ejecutan. Por lo tanto, todos los programas instalados, archivos de registro y otros que hagan referencia a cada usuario por separado, tienen que guardarse en carpetas de Windows de los perfiles de usuario. Sin embargo, en este sistema, que es un ejemplo y un marco de un sistema de red completamente válido, todos los archivos que hagan referencia a ello se almacenan en una carpeta para que sea más fácil para los usuarios.

No hay que instalar el propio sistema de sincronización. Sólo tiene que instalar los programas exteriores enumerados y copiar los archivos del sistema en una carpeta en el disco duro local.

Ideología del sistema desarrollado

Hay varias formas de crear un sistema así. Cada desarrollador encuentra su propia solución. La ventaja de la solución de la que se habla aquí es que existe y funciona.

Todo lo que se necesita para ella también está disponible en lenguaje de script, por ejemplo, archivos VBS, órdenes como xcopy, etc. Quizás puede parecer más fácil que el sistema en sí. Sin embargo, en mi opinión, un acercamiento así tiene varios inconvenientes:

1. Tendrá que incluir ajustes del sistema (rutas a la fuente/destiono de la terminal, extensiones de los archivos) directamente en los textos del script fuente. O tendrá que escribir su propio parser (analizador) de archivo .ini.

2. No tendrá casi ningún control de los errores de copia del archivo. No es tan fácil de averiguar si hubo errores utilizando órdenes como xcopy, ni reunirlos en un solo informe de revisión.

Por lo que decidí desarrollar un sistema compilado almacenando todos los ajustes en una base de datos para mayor flexibilidad de la extensión. Para a creación del sistema, preferí utilizar tecnologías de desarrollo de Microsoft que conocía. Con estos limites se realizó la siguiente selección de herramientas.

Descripción de la base de datos del sistema

Se pueden utilizar diferentes variantes para guardar los parámetros del sistema (rutas, máscaras de archivo, etc.): escriba todo en un código de programa, utilice un archivo de texto .ini, un archivo XML o DBMS. Elegí la última variante para utilizar las posibilidades de DBMS y no inventar mis propios métodos.

¿Qué DBMS elegir? No hay criterios relevantes:
1. Probablemente el sistema se utilizará como herramienta corporativa, es decir, será un sistema de red multiusuario. Esto quiere decir que se puede coger como un archivo de base datos Microsoft Access o servidor SQL. Sin embargo, cualquiera no puede instalar Access, porque está incluido en la versión de Microsoft Office Professional Edition.
2. El sistema también lo pueden utilizar usuarios individuales. Esto quiere decir que el tamaño del sistema debe reducirse y proceso de desenrollo debe simplificarse. Desde este punto de vista el servidor SQL tiene redacciones libres: Express Edition y Compact Edition. Para la reducción del tamaño, elegí la redacción SQL Servir 2005 Compact Edition. Su instalación es de un archivo de 1,7MB.

La redacción del servidor SQL 2005 Compact Edition permite combinar estos criterios: es una versión de escritorio de descarga breve de DBMS, que muestra todas las opciones necesarias cuando se pasa a la versión de la red corporativa del sistema de sincronización. Sólo tiene que recrear la base de datos en una redacción más potente del servidor SQL 2005: empezando por la Express Edition.

Ya hay una base de datos. ¿Cuál vamos a almacenar?

Nota: para comprender bien la siguiente sección, necesitará conocimientos de SQL - Structured Query Languaje, un lenguaje de necesidades estructuradas de la base de datos. Puede obtener más información sobre este lenguaje en Wikipedia: https://en.wikipedia.org/wiki/SQL.

Aquí tiene una captura de pantalla con tablas de la base de datos SQL que se ha utilizado.

Estas tablas almacenan la información sobre los siguientes parámetros del sistema:
1. Tabla CopyExtentiosn: mascaras de archivos copiados, probablemente con rutas relativas. Ejemplos: *.ini, experts\*.mq?, experts\indicators\*.ex4.
2. Tabla DestinationTerminal: rutas absolutas a terminales a actualizar. Estas copias de la terminal se actualizarán desde una plantilla: copia de terminal fuente. Para cada perfil de usuario (vea la tabla UserProfile) hay un cierto número de terminales.
3. Table SourceTerminal: ruta absoluta a una copia de terminal fuente. Esta terminal fuente es una plantilla para actualizar las copias de la terminal desde la tabla DestinationTerminal. Cada usuario tiene su propia terminal fuente.
4. Tabla UserProfile: lista de usuarios de sistema (perfiles de usuario). Este elemento es para diseñar un sistema multiusuario, en el que cada usuario almacena sus configuraciones de rutas de terminal con un enlace a su propio perfil. Un usuario puede almacenar en diferentes sets de terminales logicamente agrupadas. Por ejemplo, puede dividirlos en dos grupos: uno es actualizado a menudo, el otro no se actualiza casi nunca. Cambiar entre los dos grupos, puede elegir qué grupo hay que actualizar. Los perfiles innecesarios se pueden cerrar. Si un sistema sólo tiene un perfil desbloqueado, automáticamente se elegirá como activo en una sección del sistema del cliente.

La imagen de arriba no muestra un esquema detallado de la base de datos de la tabla. Así que vamos a ver más imágenes de tablas SQL con tipos de campos. Por desgracia, Compact Editor no tiene la opción de mostrar el diagrama de la base de datos, por lo que cada tabla se muestra por separado.

Abajo puede ver el esquema de la tabla CopyExtentions:

Aquí puede ver el esquema de la tabla DestinationTerminal:

Aquí puede ver el esquema de la tabla SourceTerminal:

Aquí puede ver el esquema de la tabla UserProfile:

Las imágenes anteriores muestran los esquemas detallados de todas las bases de datos de las tablas.

Ideología de desarrollo de la parte del cliente del sistema

Esta sección con detalles técnicos será probablemente más interesante para desarrolladores de sistemas profesionales que para usuarios comunes.

La parte del cliente es, en realidad, una aplicación .NET del tipo Windows Forms, es decir, el conocido cliente-exe. No tiene que instalar el cliente, simplemente copiar todos sus archivos en una carpeta en el disco duro local.

Aquí tiene una breve descripción de mi ideoogía de desarrollo de estos sistemas.
Creo que estos sistemas deberían crearse según el principio del módulo. Hay al menos dos ventajas:
1. Se obtiene una aplicación final con todas las funciones necesarias montadas, tanto de los módulos como de los bloques. No hay que iniciar docenas de programas diferentes, siempre se inicia un programa que contiene todas las funciones necesarias. Se puede ajustar una lista de módulos a cada usuario del sistema por separado, según la posición.
2. El principio del módulo de desarrollo permite aumentar el proceso de desarollo del sistema, es decir, atraer más desarrolladores en el volumen de aumento de desarrollo.

Entonces, ¿qué es exactamente lo que propongo? He creado un cuadro para módulos iniciales .NET: interfaz de aplicación para la clase Windows Forms para descargar los conjuntos .NET y la activación de los componentes .NET (Control de usuario), es decir, prácticamente de cualquier clase desarrollada desde el .NET 1.1 o 2.0 clase System.Windows.Forms.UserControl.

Los contenidos XML del archivo config.xml que están en la misma carpeta inician la interfaz. A continuación se muestra esta interfaz.

Creo que la ventaja es la gran variedad de elección de lenguaje de programación y de ambientes de desarrollo (IDE). De hecho, no hay ningún IDE compatible con .NET para las versiones .NET Framework 1.1 y 2.0, como Borland Developer Studio 2006 (BDS). NET 1.1, Microsoft Visual Studio .NET 2003 under .NET 1.1, Microsoft Visual Studio 2005 under .NET 2.0, Visual Studio Orcas under .NET 2.0.

Para lenguajes de programación estándar tiene #C y VB.NET, aunque puede utilizar cualquier lenguaje compatible con CLR que cree un proyecto del tipo Windows Control Library y User Control.

A continuación hay un ejemplo del componente de funcionamiento, que se desarrolla en Visual Studio .NET 2003 y se carga en una interfaz.

Y un ejemplo más de un componente creado en Visual Studio Orcas en marzo de 2007 CTP

Se ha analizado el método de desarrollo de la parte del cliente. Ahora vamos a la creación.

Parte del cliente del sistema

Use Microsoft Visual Studio 2005 para el desarrollo de los componentes del sistema de sincronización.
Cree un proyecto del tipo Windows Contro Library.

Todos los componentes del sistema (controles de usuario) estarán en un proyecto. E resultado físico será el archivo MT4TSyncUCLib.dll en la carpeta, que contiene un código binario de los componentes. Vamos a rellenar el proyecto con los componentes de programa apropiados.

Como resultado, obtendremos varios archivos que se muestran en la imagen.

Estos son los recursos del proyecto, así como los componentes de cada entidad del sistema que está almacenada en la base de datos de SQL: terminal fuente, muchas terminales de destino, muchas máscaras de archivos copiados y el componente de ejecución de la sincronización. El proyecto también tiene clases para cada entidad enumerada, para el proceso de pasar los datos y su edición en un componente estándar PropertyGrid (una tabla con propiedades).

Nota: El programa no está destinado a enseñar a desarrollar sistemas programados detalladamente. Por eso, para la parte de cliente verá la descripción de los puntos de control: módulos listos dentro del sistema.

A continuación está la configuración del archivo XML config.xml, que describe todos los componentes visibles del sistema.

Como puede ver en el contenido del archivo config.xml, dividí un menú de usuario en dos partes: el propio inicio de la sincronización y a parte administrativa de la configuración del sistema. Es una división relativay se puede cambiar editando el archivo de texto XML, pero sin cambiar la información clave. Introduzca la etiqueta <menu>, sección <items> y cambie las posición de las etiquetas <item> con el atributo type="folder" y type="control" (último componente personalizado).
El sistema incluye dos perfiles de usuario del menú: uno completo con todos los componentes, llamado "Administrador (todos)", y uno más corto llamado "Inicio de sincronización" sólo con el componente de inicio.

Ha llegado el momento de enseñar el sistema en sí.
A continuación unas imágenes mostrarán todos los componentes visibles del sistema como en el menú desplegable.

Al inicio del sistema, elija el perfil de menú: completo o simplificado.

Aquí está el componente de gestión de los usuarios.

El bloqueo de perfiles de usuario se utiliza para deshabilitar perfiles innecesarios sin tener que borrarlos. Si deja un perfil activo, ahorrará tiempo a la hora de elegirlos porque el propio sistema elegirá el único perfil activo. Pero no tiene por qué bloquear todos los perfiles de usuario, claro. El sistema no permitirá que se ejecuten las operaciones necesarias o mostrará un error en la llamada de los componentes, y requerirá seleccionar un perfil activo.

A continuación se muestra el componente de la edición de máscaras de los archivos copiados.

En mi opinión, la lista de archivos copiados debe tener las siguientes máscaras:

Por favor, preste atención al campo Subcarpetas incluidas, que he creado para simplificar el proceso de la configuración del sistema. De hecho, por ejemplo, los archivos *.mq4 y *.ex4, en la terminal se encuentran en diferentes subcarpetas: expertos, expertos\indicadores etc. Para no añadir cada subcarpeta, puede indicar un registro del origen de la carpeta de la terminal, es decir, sin una ruta relativa, y que habilitar la búsqueda de características en las subcarpetas. Entonces el sistema comprobará todas las subcarpetas de la terminal fuente y copiará los archivos con la misma máscara en la subcarpeta de destino adecuada.

Y un secreo más: Mire as máscaras. La terminal incluye archivos con la extensión mq4, mqh y mqt. Para no tener que indicarlos todos, indicará un registro con la máscara *.mq?, que incuye tres tipos de archivos anteriores: "?" reemplaza un símbolo en la máscara; * reemplaza un número libre de símbolos. Lo mismo pasa con la máscara *.ex? : es una máscara para los archivos *.exe (archivos ejecutables de la terminal) y *.ex4: archivos MQL binarios. ¿Es cómodo, verdad?

Lo que sigue es la gestión de los componentes de las terminales de destino sincronizadas.

Cuando selecciona Ruta a la terminal en el extremo derecho de la carpeta, verá un botón con tres puntos. Haciendo clic en él, se abrirá una ventana estándar de Windows para seleccionar archivo de un disco (Abrir diálogo). Debe indicar el archivo terminal.exe en una carpeta necesaria.

El componente de la terminal fuente es principalmente análogo para seleccionar las terminales de destino.

Puede que se pregunte por qué he separado en la base de datos las tablas de fuente y las terminales de destino. Tenga en cuenta que, para las terminales de destino, como diferencia de las de fuente, debe indicar características adicionales. Por ejemplo, hay un campo en la base para ellas llamado Iniciar tras actualizar. Puede verlo en los componentes de la terminal de destino. No está procesada en el sistema, aunque para crearla necesita escribir dos códigos de línea: cree un proceso para una ruta completa al archivo terminal.exe, y ejecútelo por la segunda línea.

Como resultado de una extensión así, el sistema adquirirá características y funciones adicionales.

Y finalmente, el último componente y el más importante del inicio de la sincronizaciópn, por el que se creó el sistema.

Todos los componentes anteriores se utilizaron para la configuración de los parámetros del sistema, haciéndolo todo lo flexible posible. En este componente, al hacer clic en el botón Inicio, se inicia el proceso de sincronización, es decir, la copia de los archivos necesarios. En la lista Operaciones registradas, verá los puntos de control de la sincronización que se ha realizado, es decir, las rutas a las carpetas y los números de archivos copiados.

Si hay algún error en el proceso de copia, se mostrará en el grupo Registro de errores, señalado en color rojo. También se grabarán en el archivo Log.txt en la misma carpeta. Un método así se utiliza para separar los mensajes de información de los mensajes de errores críticos. El motivo del error puede ser, por ejemplo, una ruta errónea a una terminar fuente o de destino (se ha introducido en la base, pero la carpeta se ha borrado de disco duro), o un error en el bloqueo de un archivo monopolístico sin acceso ni para lectura.

Había una elección para este bloque: o destacar la copia en una corriente separada; o dejarlo dentro de las barreras de la corriente principal del proceso del sistema. La primera variante proporcionará una mejor reacción de sistema en las acciones de un usuario en el proceso de copia, es decir, sin que el sistema se "desvanezca". Sin embargo, la corriente funcionará con prioridad más baja, y probablemente la velocidad de la copia sea más baja. Por eso decidí dejar la copia dentro de la corriente principal, manipulándola en un programador dentro del componente. Por eso, el sistema debe responder a los clics del ratón sólo en los periodos de procesamiento de un evento programado. Sin embargo, puede parar el proceso de sincronización haciendo clic en Stop: el sistema procesará el clic cuando se mueva hacia la lista de terminales de destino.

Conclusión

Hemos conseguido resolver la tarea y conseguir la herramienta técnica: el sistema de sincronización con sus parámetros de sincronización, registro y muestra de posibles errores, etc. He cogido la máscara para los archivos copiados del archivo INSTALL.LOG de la carpeta raíz de la terminal, sección [CopyFiles]. Es probable que durante el funcionamiento, encuentre más archivos con otras extensiones que tienen que sincronizarse. Sería muy útil e interesante para otros usuarios si compartiera su punto de vista en los comentarios del artículo.

El proyecto binario terminado y el código de ejemplo del módulo del sistema están adjuntos en el artículo.