将文件发送到 FTP 服务器

MetaTrader 5 支持向 FTP 服务器发送文件。要使此功能正常工作,你必须在设置对话框的“FTP”选项卡中输入必要的 FTP 详细信息:FTP 服务器地址、登录名、密码,以及用于在服务器上放置文件的路径(可选)。如果你的计算机位于 ISP 网络中,而 ISP 未为你分配公共 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 服务器发送单个文件。MQL5 不提供所有其他 FTP 命令。

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 (success) or FTP_CONNECT_FAILED(4522), FTP_CHANGEDIR(4523), etc.
}