Отправка файлов на сервер FTP

MetaTrader 5 поддерживает отправку файлов на FTP-сервер. Для работы этой возможности следует ввести необходимые реквизиты FTP в диалоге настроек на закладке FTP: адрес FTP-сервера, логин, пароль и опционально путь размещения файлов на сервере. Если ваш компьютер находится в сети провайдера, который не выделил для вас публичный IP-адрес, то, вероятно, потребуется включить пассивный режим.

Непосредственно отправку файлов из MQL-программы обеспечивает функция SendFTP.

bool SendFTP(const string filename, const string path = NULL)

Функция посылает файл с указанным именем на FTP-сервер из настроек терминала. При необходимости можно указать другой путь, отличный от настроенного заранее. Если параметр path не указан, используется каталог, описанный в настройках.

Отсылаемый файл должен находиться в папке MQL5/Files или ее подпапках.

Функция возвращает признак успеха (true) или ошибки (false). Потенциальные ошибки в _LastError:

  • 4514 — ERR_FTP_SEND_FAILED — не удалось отправить файл по FTP;
  • 4519 — ERR_FTP_NOSERVER — не указан FTP-сервер;
  • 4520 — ERR_FTP_NOLOGIN — не указан FTP-логин;
  • 4521 — ERR_FTP_FILE_ERROR — не найден заданный файл в директории MQL5/Files;
  • 4522 — ERR_FTP_CONNECT_FAILED — ошибка при подключении к FTP-серверу;
  • 4523 — ERR_FTP_CHANGEDIR — на FTP-сервере не найдена директория для выгрузки файла;
  • 4524 — ERR_FTP_CLOSED — подключение к FTP-серверу было закрыто.

Функция блокирует выполнение MQL-программы до тех пор, пока операция не завершится. В связи с этим функцию запрещено использовать в индикаторах.

Также функция SendFTP не выполняется в тестере стратегий.

Терминал поддерживает только отправку отдельно взятого файла на FTP-сервер — все другие FTP-команды недоступны из MQL5.

Пример скрипта NetFtp.mq5 делает скриншот текущего графика и пытается отправить его по FTP.

void OnStart()
{
   const string filename = _Symbol + "-" + PeriodToString() + "-"
      + (string)(ulong)TimeTradeServer() + ".png";
   PRTF(ChartScreenShot(0filename300200));
   Print("Sending file: " + filename);
   PRTF(SendFTP(filename"/upload")); // 0 (успех) or FTP_CONNECT_FAILED(4522), FTP_CHANGEDIR(4523), и пр.
}