- Normas generales para trabajar con proyectos locales
- Plan de proyecto de un servicio web de copia de operaciones y señales
- Servidor web basado en Nodejs
- Fundamentos teóricos del protocolo WebSockets
- Componente servidor de servicios web basados en el protocolo WebSocket
- Protocolo WebSocket en MQL5
- Programas cliente para servicios echo y chat en MQL5
- Servicio de señales de trading y página web de prueba
- Programa cliente de servicios de señales en MQL5
Servidor web basado en Nodejs
Para organizar la parte del servidor de nuestros proyectos, necesitamos un servidor web. Utilizaremos el nodejs más ligero y tecnológicamente avanzado. Los scripts del lado del servidor pueden escribirse en JavaScript, que es el mismo lenguaje utilizado en los navegadores para las páginas web interactivas. Esto es práctico desde el punto de vista de la escritura unificada de las partes cliente y servidor del sistema; la parte cliente de cualquier servicio web, por regla general, se requiere tarde o temprano, por ejemplo, para la administración, el registro y la visualización de hermosas estadísticas sobre el uso del servicio.
Quienes conocen MQL5 prácticamente conocen JavaScript, así que tengan fe en sí mismos. Las principales diferencias se comentan en la barra lateral.
MQL5 vs JavaScript
JavaScript es un lenguaje interpretado, a diferencia del MQL5 compilado. Para nosotros, como desarrolladores, esto nos facilita la vida porque no necesitamos una fase de compilación separada para obtener un programa que funcione. No hay que preocuparse por la eficacia de JavaScript: todos los tiempos de ejecución de JavaScript utilizan la compilación JIT (just-in-time) de JavaScript bajo demanda, es decir, la primera vez que se accede a un módulo. Este proceso se produce automáticamente, de forma implícita, una vez por sesión, tras lo cual el script se ejecuta de forma compilada.
MQL5 se refiere a lenguajes con tipado estático, es decir, cuando describimos variables, debemos especificar explícitamente su tipo, y el compilador controla la compatibilidad de tipos. Por el contrario, JavaScript es un lenguaje de tipado dinámico: el tipo de una variable viene determinado por el valor que pongamos en ella y puede cambiar durante la vida de la variable. Esto proporciona flexibilidad, pero exige cautela para evitar errores imprevistos.
JavaScript es, en cierto sentido, un lenguaje más orientado a objetos que MQL5, porque casi todas las entidades en él son objetos. Por ejemplo, una función también es un objeto, y una clase, como un descriptor de las propiedades de los objetos, también es un objeto (de un prototipo).
El propio JavaScript «recoge basura», es decir, libera la memoria asignada por el programa de aplicación para los objetos. En MQL5 tenemos que proporcionar la llamada oportuna de delete para objetos dinámicos.
La sintaxis de JavaScript contiene muchas «abreviaturas» prácticas para escribir construcciones que en MQL5 tienen que implementarse de una manera más larga. Por ejemplo, para pasar un parámetro que apunta a otra función a una determinada función en MQL5, necesitamos describir el tipo de dicho puntero utilizando typedef, definir por separado una función que coincida con este prototipo y, solo entonces, pasar su identificador como parámetro. En JavaScript, puede definir la función a la que apunta (¡en su totalidad!) directamente en la lista de argumentos en lugar de un parámetro puntero.
Si es desarrollador web o ya está familiarizado con nodejs, puede saltarse los pasos de instalación y configuración.
Puede descargar nodejs desde el sitio oficial nodejs.org. La instalación está disponible en diferentes versiones, por ejemplo, utilizando un instalador o descomprimiendo un archivo. Como resultado de la instalación, recibirá un archivo ejecutable en el directorio especificado node.exe y varios archivos y carpetas de apoyo.
Si el instalador no añadió nodejs a la ruta del sistema, esto se puede hacer para el usuario actual de Windows ejecutando el siguiente comando en la carpeta donde nodejs está instalado (donde se encuentra el archivo node.exe):
setx PATH "%CD%" |
Otra alternativa es editar las variables de entorno de Windows desde el cuadro de diálogo de propiedades del sistema (Computer -> Properties -> Extra options -> Environment Variables; el tipo de cuadro de diálogo específico depende de la versión del sistema operativo). En cualquier caso, de esta forma nos aseguraremos la capacidad de ejecutar nodejs desde cualquier carpeta del ordenador, lo que nos será útil en el futuro.
Puede comprobar la salud de nodejs ejecutando los siguientes comandos (en la línea de comandos de Windows):
node -v
|
El primer comando muestra la versión de nodejs, y el segundo muestra la versión de un importante servicio integrado en nodejs: el administrador de paquetes npm.
Un paquete es un módulo listo para usar que añade una funcionalidad específica a nodejs. Por sí mismo, nodejs es muy pequeño, y sin paquetes, requeriría mucha codificación rutinaria.
Los paquetes más solicitados se almacenan en un repositorio centralizado en la web y pueden descargarse e instalarse en una copia específica de nodejs o globalmente (para todas las copias de nodejs si hay varias en la máquina). La instalación de un paquete en una copia específica se realiza con el siguiente comando:
npm install <package name> |
Ejecútelo en la carpeta donde se instaló nodejs. Este comando colocará el paquete localmente y no afectará a otras copias de nodejs que ya existan o que puedan aparecer en el ordenador más adelante, con ediciones inesperadas.
Nosotros, en concreto, necesitamos el paquete ws, que implementa el protocolo WebSocket. Es decir, hay que ejecutar el comando:
npm install ws |
y espere a que se complete el proceso. Como resultado, la carpeta <nodejs_install_path>/node_modules/ debería contener una nueva subcarpeta ws con el contenido necesario (puede consultar el archivo README.md con la descripción del paquete para asegurarse de que se trata de una librería de protocolo WebSocket).
El paquete contiene implementaciones tanto del servidor como del cliente. Pero en lugar de este último, escribiremos el nuestro propio en MQL5.
Toda la funcionalidad del servidor nodejs se concentra en la carpeta /node_modules. Se puede comparar en cuanto a propósito con una carpeta estándar MQL5/Include de MetaTrader 5. Al escribir programas de aplicación en JavaScript, incluiremos o «importaremos» los módulos necesarios de una manera especial, por analogía con la inclusión de archivos de encabezado mqh utilizando la directiva #include en MQL5.