- Общие принципы работы с локальными проектами
- План проекта веб-сервиса копирования сделок и сигналов
- Веб-сервер на основе nodejs
- Теоретические основы протокола WebSockets
- Серверная часть веб-сервисов на базе WebSocket-протокола
- Протокол WebSocket-ов на MQL5
- Клиентские программы эхо и чат-сервисов на MQL5
- Сервис торговых сигналов и тестовая веб-страница
- Клиентская программа сигнального сервиса на MQL5
Веб-сервер на основе nodejs
Для организации серверной части наших проектов нужен веб-сервер. Выберем в качестве него наиболее легкий и при том технологичный nodejs. Серверные скрипты для него можно писать на JavaScript, то есть на том же языке, что используется в браузерах для интерактивных веб-страниц. Это удобно с точки зрения унифицированного написания клиентской и серверной частей системы, а клиентская часть у любого веб-сервиса, как правило, рано или поздно требуется, например, для администрирования, регистрации и показа красивой статистики использования сервиса.
Тот, кто знает MQL5, почти знает и JavaScript. Основные отличия рассмотрены во врезке.
MQL5 vs JavaScript
JavaScript является интерпретируемым языком, в отличие от компилируемого MQL5. Для нас, как разработчиков это облегчает жизнь, потому что не нужна отдельная фаза компиляции, чтобы получить работающую программу. По поводу эффективности JavaScript не стоит беспокоиться: все среды исполнения JavaScript применяют прием компиляции JavaScript по требованию JIT(just-in-time) — при первом обращении к модулю. Этот процесс происходит автоматически, неявным образом, однократно за сеанс работы, после чего скрипт выполняется в откомпилированном виде.
MQL5 относится к языкам со статической типизацией, то есть при описании переменных мы должны явно задать их тип, и компилятор следит за совместимостью типов. В отличие от этого, JavaScript — язык с динамической типизацией: тип переменной определяется тем, какое значение мы в неё положили, и может изменяться в процессе жизни переменной. С одной стороны это дает гибкость, но и требует осторожности, чтобы избежать непредвиденных ошибок.
JavaScript является, в некотором смысле, более объектным языком, чем MQL5, потому что в нем объектами являются почти все сущности. Например, функция — тоже объект, и класс, как описатель свойств объектов, сам тоже — объект (прототипа).
JavaScript самостоятельно "занимается" "уборкой мусора", то есть освобождает память, выделенную прикладной программой под объекты. В MQL5 мы должны следить за своевременным вызовом delete для динамических объектов.
В синтаксис JavaScript заложено много удобных "сокращений" для записи конструкций, которые в MQL5 приходится реализовывать более длинным способом. Например, чтобы в MQL5 передать в некую функцию параметр, указывающий на другую функцию, нам потребуется описать тип такого указателя с помощью typedef, отдельно определить функцию, подходящую под этот прототип, и только затем передать её идентификатор в качестве параметра. В JavaScript можно определить указываемую функцию (целиком!) непосредственно в списке аргументов вместо параметра-указателя.
Если вы веб-разработчик или уже знакомы с nodejs, можете пропустить этапы установки и настройки.
Скачать nodejs следует с официального сайта nodejs.org. Установка доступна в разных вариантах, например, с помощью инсталлятора или распаковкой архива. В результате установки вы получите в указанном каталоге исполняемый файл node.exe и несколько вспомогательных файлов и папок.
Если nodejs не был прописан в системном пути инсталлятором, это можно сделать для текущего пользователя Windows, выполнив следующую команду в той папке, куда установлен nodejs (где находится файл node.exe):
setx PATH "%CD%" |
Альтернативно вы можете редактировать переменные среды Windows из диалога свойств системы (Компьютер -> Свойства -> Дополнительные параметры -> Переменные среды — конкретный вид диалогов зависит от версии операционной системы). В любом случае, мы таким образом обеспечим возможность запуска nodejs из любой папки на компьютере, что нам пригодится в дальнейшем.
Проверить работоспособность nodejs можно, выполнив команды (в командной строке Windows):
node -v
|
Первая выводит версию nodejs, а вторая — версию важного встроенного сервиса nodejs — менеджера пакетов npm.
Пакет — это готовый к использованию модуль, дополняющий nodejs конкретным функционалом. Сам по себе nodejs — очень небольшой, и без пакетов требовал бы много рутинного кодирования.
Наиболее востребованные пакеты хранятся в централизованном репозитарии в Интернете и могут быть скачаны и установлены в конкретную копию nodejs или глобально (для всех копий nodejs, если их несколько на машине). Установка пакета в конкретную копию выполняется такой командой:
npm install <package name> |
Запускайте её в папке, куда производилась установка nodejs — эта команда разместит пакет локально и не затронет неожиданными правками другие копии nodejs, которые уже есть или, может быть, появятся на компьютере впоследствии.
Нам, в частности, потребуется пакет ws, реализующий протокол WebSocket-ов. То есть необходимо выполнить команду:
npm install ws |
и дождаться завершения процесса. В результате мы должны обнаружить в папке <путь_установки_nodejs>/node_modules/ новую вложенную папку ws с необходимым содержимым (вы можете заглянуть в файл README.md с описанием пакета, чтобы убедиться, что это библиотека WebSocket-протокола).
В принципе, пакет содержит реализации как сервера, так и клиента, но вместо последнего мы напишем свой на MQL5.
Весь функционал сервера nodejs сконцентрирован именно в папке /node_modules. Её можно сравнить по назначению со стандартной папкой MQL5/Include в MetaTrader 5. При написании прикладных программ на JavaScript мы будем особым образом подключать, "импортировать" необходимые модули, по аналогии с включением заголовочных mqh-файлов с помощью директивы #include в MQL5.