返回

如何解决 Linux 服务器上 MetaTrader 4 网络请求问题?

Linux

解决 Linux 服务器上的 MetaTrader 4 网络请求问题

简介

MetaTrader 4(MT4)是一款用于外汇和 CFD 交易的流行交易平台。在 Linux 服务器上部署 MT4 时,有时会遇到网络请求问题。本文将探讨解决此类问题的步骤,并提供详细的代码示例。

问题诊断

在 Linux 服务器上托管的 MT4 无法正常执行网络请求。该问题在本地系统或其他服务器上并不存在。

故障排除步骤

1. 启用网络请求选项

  • 打开 MT4,导航到“工具”>“选项”>“网络请求”。
  • 启用所有网络请求选项。

2. 检查防火墙

  • 确保防火墙允许 MT4 访问外部网络。
  • Ubuntu 系统中,可以使用 UFW(防火墙不复杂)。
  • 使用以下命令允许端口 443:
sudo ufw allow 443

3. 检查 URL 白名单

  • 在 MT4 的“专家”选项卡中,检查目标 URL 是否已添加到白名单。
  • 导航到“工具”>“选项”>“专家”>“网络”。
  • 在“允许 URL”字段中,输入目标 URL。

4. 尝试不同的网络请求方法

  • MT4 中除了使用 Wininet API,还可以使用内置的网络请求函数 WebRequest。
  • 示例代码如下:
int request = WebRequest(method, url, headers, timeout, data, result, result_headers);
if (request == 200) {
    // 成功,将结果复制到内容字符串
    content = CharArrayToString(result);
} else {
    // 出错,处理错误
}

示例代码

Wininet API 代码示例

int InternetGetFile(string url,string &content)
{
    //--- Init
    content=NULL;

    //--- Create connection
    int httpconnect=0;
    int httprequest=0;
    int httpopen=Wininet::InternetOpenW("InternetGetFileMQL",0," "," ",0);
    int e=kernel32::GetLastError();
    if(e==0)
    {
        bool flag=Wininet::DeleteUrlCacheEntryW(url);
        httprequest=Wininet::InternetOpenUrlW(httpopen,url,NULL,0,16|10,0);
        e=kernel32::GetLastError();
        if(e==0)
        {
            //--- Define buffers
            uchar ch[512];
            string temp="";

            //--- Retrieve data from file
            int cnt=0;
            while(Wininet::InternetReadFile(httprequest,ch,512,cnt))
            {
                //e=kernel32::GetLastError();
                if(cnt<=0)
                    break;
                temp=temp+CharArrayToString(ch,0,cnt);
            }
            //--- Store result
            content=temp;
        }
    }

    //--- Close connection
    if(httprequest>0)
        InternetCloseHandle(httprequest);
    if(httpopen>0)
        InternetCloseHandle(httpopen);

    //--- Get out and return error code
    return(e);
}

WebRequest 函数代码示例

int request = WebRequest(method, url, headers, timeout, data, result, result_headers);
if (request == 200) {
    // 成功,将结果复制到内容字符串
    content = CharArrayToString(result);
} else {
    // 出错,处理错误
}

结论

通过遵循这些步骤和使用示例代码,你可以有效解决在 Linux 服务器上使用 MetaTrader 4 执行网络请求时遇到的问题。请确保已启用网络请求选项、检查防火墙、URL 白名单,并尝试不同的网络请求方法。

常见问题解答

1. MT4 仍然无法执行网络请求,我该怎么办?

  • 检查网络连接,并确保 MT4 已添加到防火墙白名单中。
  • 尝试不同的网络请求方法,例如使用 WebRequest 函数。

2. 如何在 MT4 中使用 WebRequest 函数?

  • WebRequest 函数的语法为:
int WebRequest(string method, string url, string headers, int timeout, string data, string &result, string &result_headers);
  • 有关更多信息,请参阅 MT4 文档。

3. 可以在 Windows 和 Linux 上使用相同的解决方案吗?

  • 是的,本文中的步骤和代码示例适用于 Windows 和 Linux 系统。

4. 我的 MT4 在执行网络请求时仍然超时,有什么解决办法吗?

  • 检查防火墙设置,并确保没有阻止 MT4 的网络连接。
  • 增加请求超时时间,例如在 WebRequest 函数中使用 timeout 参数。

5. 如何获取更多有关 MT4 网络请求的帮助?

  • 查阅 MT4 文档。
  • 在 MetaQuotes 官方论坛上寻求支持。