Проверка сетевых подключений

Как известно, платформа MetaTrader 5 является распределенной системой, включающей несколько звеньев. Помимо клиентского терминала и сервера брокера, в неё входит сообщество MQL5, Маркет, облачные сервисы и многое другое. По сути распределенной является и клиентская часть, состоящая из терминала и агентов тестирования, которые могут быть развернуты на множестве компьютеров локальной сети. При этом связь между любыми звеньями может, потенциально, нарушаться по тем или иным причинам. И хотя инфраструктура MetaTrader 5 пытается автоматически восстановить свою работоспособность, не всегда это удается сделать быстро.

Поэтому в MQL-программах следует учитывать возможность отсутствия связи. MQL5 API позволяет контролировать наиболее важные связи: с торговым сервером и сообществом MQL5. Следующие свойства доступны в TerminalInfoInteger.

Идентификатор

Описание

TERMINAL_CONNECTED

наличие подключения к торговому серверу

TERMINAL_PING_LAST

последнее известное значение скорости связи с торговым сервером в микросекундах

TERMINAL_COMMUNITY_ACCOUNT

наличие авторизационных данных MQL5.community в терминале

TERMINAL_COMMUNITY_CONNECTION

наличие подключения к MQL5.community

TERMINAL_MQID

наличие MetaQuotes ID для отправки push-уведомлений

Все свойства кроме TERMINAL_PING_LAST являются булевыми флагами. TERMINAL_PING_LAST содержит значение типа int.

Помимо самого соединения, MQL-программа часто должна убедиться в актуальности имеющихся данных. В частности, взведенный флаг TERMINAL_CONNECTED еще не означает, что интересующие вас котировки синхронизированы с сервером. Для этого нужно дополнительно делать проверки с помощью SymbolIsSynchronized или SeriesInfoInteger(..., SERIES_SYNCHRONIZED) — об этих функциях мы поговорим в главе о таймсериях.

Кроме того функция TerminalInfoDouble поддерживает еще одно интересное свойство: TERMINAL_RETRANSMISSION. Это процент повторно отправляемых сетевых пакетов в TCP/IP протоколе для всех запущенных приложений и служб на данном компьютере. Даже в самой быстрой и правильно настроенной сети иногда происходят потери пакетов и, как следствие, отсутствие подтверждений о доставке пакетов между получателем и отправителем. В таких случаях производится повторная отправка "потерянного" пакета. Сам терминал не считает показатель TERMINAL_RETRANSMISSION, а запрашивает его раз в минуту в операционной системе.

Высокое значение данного показателя может говорить о проблемах внешнего, по отношению к MetaTrader 5, характера (на магистральном канале в Интернет, у вашего провайдера, в локальной сети или на компьютере), что способно ухудшить качество подключения терминала.

Если есть подтвержденное соединение с сообществом (TERMINAL_COMMUNITY_CONNECTION), MQL-программа может запросить текущий баланс пользователя, вызвав TerminalInfoDouble(TERMINAL_COMMUNITY_BALANCE). Это позволяет пользоваться автоматизированной подпиской на платные торговые сигналы (документация API доступна на сайте mql5.com).

Проверим перечисленные свойства с помощью скрипта EnvConnection.mq5.

void OnStart()
{
   PRTF(TerminalInfoInteger(TERMINAL_CONNECTED));
   PRTF(TerminalInfoInteger(TERMINAL_PING_LAST));
   PRTF(TerminalInfoInteger(TERMINAL_COMMUNITY_ACCOUNT));
   PRTF(TerminalInfoInteger(TERMINAL_COMMUNITY_CONNECTION));
   PRTF(TerminalInfoInteger(TERMINAL_MQID));
   PRTF(TerminalInfoDouble(TERMINAL_RETRANSMISSION));
   PRTF(TerminalInfoDouble(TERMINAL_COMMUNITY_BALANCE));
}

Вот пример лога (значения будут соответствовать вашим настройкам).

TerminalInfoInteger(TERMINAL_CONNECTED)=1 / ok
TerminalInfoInteger(TERMINAL_PING_LAST)=49082 / ok
TerminalInfoInteger(TERMINAL_COMMUNITY_ACCOUNT)=0 / ok
TerminalInfoInteger(TERMINAL_COMMUNITY_CONNECTION)=0 / ok
TerminalInfoInteger(TERMINAL_MQID)=0 / ok
TerminalInfoDouble(TERMINAL_RETRANSMISSION)=0.0 / ok
TerminalInfoDouble(TERMINAL_COMMUNITY_BALANCE)=0.0 / ok