Обсуждение статьи "За рамками REST и ZeroMQ: Создание моста Protocol Buffers между MetaTrader 5 и Python с выходом на gRPC для инференса в реальном времени"

Опубликована статья За рамками REST и ZeroMQ: Создание моста Protocol Buffers между MetaTrader 5 и Python с выходом на gRPC для инференса в реальном времени:

В этой статье мы определим контракт Protocol Buffers для обмена данными между MetaTrader 5 и Python и реализуем на языке MQL5 клиент Protobuf-over-TCP, передающий сообщения с префиксом длины: MQL5 нативно не поддерживает реальный gRPC. Небольшая прослойка на Python передает эти фреймы в полноценный сервер grpc.aio. Пока через нее выполняются только унарные RPC-вызовы, но на бэкенде уже работают и потоковые вызовы. Вы получите строго типизированные сообщения с контролем соответствия схеме, явные сообщения об ошибках, повторные попытки с задержкой между ними и кэш для тестера стратегий, позволяющий воспроизводить результаты тестирования на истории там, где сокеты недоступны.

При подключении работающего советника MetaTrader 5 к серверу модели на Python обычно проходят одни и те же этапы: сначала опрос файлов (состояния гонки при блокировке файлов в Windows), затем WebRequest/REST (накладные расходы HTTP, разбор JSON, отсутствие схемы), затем ZeroMQ (исправляет проблему транспортного уровня, но разработчики по-прежнему вручную формируют JSON-строки, поэтому проблема отсутствия схемы никуда не исчезает). Ни REST, ни ZeroMQ не решают главную проблему: ничто не обеспечивает соответствие вектора признаков, отправляемого клиентом MQL5, тому, что ожидает модель на Python. Если несоответствие полей остается незамеченным, советник торгует на мусорных данных вместо того, чтобы остановиться с явной ошибкой.

В этой статье мы создадим недостающий контракт — схему Protocol Buffers для обмена данными между MetaTrader 5 и Python. Этот транспортный слой ведет себя подобно gRPC, но язык MQL5 не поддерживает gRPC нативно (нет клиента HTTP/2, мультиплексирования потоков и генерации кода с помощью protoc). Поэтому вместо громкого заявления о "gRPC на MQL5" мы реализуем передачу Protobuf по TCP с префиксом длины для фреймирования сообщений. Небольшая прослойка на Python передает эти сообщения полноценному сервису grpc.aio. На стороне Python используется настоящий gRPC: потоковая передача, health checks и сам протокол без имитации. На стороне клиента MQL5 используется строго типизированный формат сообщений с контролем соответствия схеме — без неоднозначности JSON, собранного вручную из строк.

К статье прилагаются семь основных файлов (а также скрипты для тестирования производительности и создания кэша). Ниже мы разберем код каждого файла: что он реализует, как устроен ключевой механизм и почему выбран именно этот подход, а не альтернативы.


Автор: Olamide Daniel Adebayo