配置说明

WebCrawling 价格数据采集工具 - MT4/MT5 配置指南

MT4 配置步骤 MetaTrader 4

  1. 完成MT4软件安装后,请按以下步骤依次操作
  2. 将源目录中的 MQL4.zip 解压,把其中三个文件夹复制至MT4的“安装目录”下的 MQL4 文件夹中。若遇重名文件,请选择复制并替换
  3. 打开“MT4”软件,依次点击上方选项卡 工具 → 选项,在弹出页面中选择 EA交易
  4. 勾选 允许DLL导入(潜在的危险,只为受信任的应用程序启用),勾选 允许WebRequest用于所列URL
  5. 在下方URL输入框中添加如下链接:http://127.0.0.1
  6. 点击 确定 按钮,配置完成
  7. 在MT4平台上添加拟抓取的交易品种
  8. 将交易品种拖动至右侧以生成独立的折线图,在左侧导航的“EA交易”中找到 TCPSocket 文件,拖动至折线图上,点击“确定”即可

MT5 配置步骤 MetaTrader 5

  1. 完成MT5软件安装后,请按以下步骤依次操作
  2. 打开“MT5”软件,依次点击上方选项卡 工具 → 选项,在弹出页面中选择 EA交易
  3. 勾选 允许DLL导入(潜在的危险,只为受信任的应用程序启用),勾选 允许WebRequest用于所列URL
  4. 在下方URL输入框中添加如下链接:http://127.0.0.1
  5. 打开软件左侧“导航栏”,找到“EA交易”,右键“EA交易”,点击“用MetaEditor创建”
  6. 选择EA交易(模板),点击“下一页”;名称后边输入 TCPSocket,然后一直点击“下一页”,直至“完成”即可
  7. 在弹出的MetaEditor编辑器中,删除默认生成的代码
  8. 从下方代码模块复制全部代码,粘贴进上一步弹出的弹窗
  9. 点击编写按钮,关闭当前窗口即可
  10. 在MT5平台上添加拟抓取的交易品种
重要提示:若出现错误4014,需要在MT5终端中添加允许访问的地址:
  1. 打开MT5终端
  2. 点击 工具 -> 选项 -> 专家顾问
  3. 在"允许WebRequest对下列URL的访问"中添加:http://127.0.0.1:8087
  4. 点击确定保存设置
  5. 重新启动MT5终端

MT5 EA 代码

WebRequest.mq5
//+------------------------------------------------------------------+
//|                                                   WebRequest.mq5 |
//|                                  版权所有 2026, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026, MetaQuotes Ltd."
#property link      "http://127.0.0.1:8087"
#property version   "1.00"
#property description "价格上传功能:将当前品种的价格信息实时推送到服务器。\n错误4014表示需要在MT5选项中添加允许访问的地址。"
#property script_show_inputs

//--- 输入参数
input string   Address="127.0.0.1";
input int      Port=8087;
bool           ExtTLS = false;
datetime       lastPriceUpdate = 0;
const int      priceUpdateInterval = 200;

//+------------------------------------------------------------------+
//| 向服务器发送命令                                                 |
//+------------------------------------------------------------------+
bool HTTPSend(int socket, string request)
{
    uchar req[];
    int len = StringToCharArray(request, req) - 1;
    if(len < 0)
    {
        Print("发送失败: 数据转换失败");
        return(false);
    }
    if(ExtTLS)
        return(SocketTlsSend(socket, req, len) == len);
    else
        return(SocketSend(socket, req, len) == len);
}

//+------------------------------------------------------------------+
//| 获取当前品种的价格信息                                           |
//+------------------------------------------------------------------+
string GetPriceInfo(string symbol)
{
    double bid = SymbolInfoDouble(symbol, SYMBOL_BID);
    double ask = SymbolInfoDouble(symbol, SYMBOL_ASK);
    datetime time = TimeLocal();
    long accountLogin = AccountInfoInteger(ACCOUNT_LOGIN);
    string accountServer = AccountInfoString(ACCOUNT_SERVER);
    
    string result = StringFormat("PRICE_INFO|%s|%f|%f|%s|%d|%s",
                                symbol, bid, ask,
                                TimeToString(time, TIME_DATE|TIME_MINUTES|TIME_SECONDS),
                                accountLogin, accountServer);
    return result;
}

//+------------------------------------------------------------------+
//| 脚本程序开始函数                                                 |
//+------------------------------------------------------------------+
void OnStart()
{
    Print("WebRequest脚本开始执行(仅价格上传功能)");
    
    int socket = INVALID_HANDLE;
    bool connected = false;
    
    while(!IsStopped())
    {
        if(!connected || socket == INVALID_HANDLE)
        {
            Print("尝试连接服务器...");
            socket = SocketCreate();
            if(socket != INVALID_HANDLE)
            {
                if(SocketConnect(socket, Address, Port, 1000))
                {
                    Print("成功连接到 ", Address, ":", Port);
                    connected = true;
                    
                    string subject, issuer, serial, thumbprint;
                    datetime expiration;
                    if(SocketTlsCertificate(socket, subject, issuer, serial, thumbprint, expiration))
                    {
                        ExtTLS = true;
                    }
                    Print("初始化完成,开始推送价格信息...");
                }
                else
                {
                    Print("连接失败, 错误 ", GetLastError());
                    connected = false;
                }
            }
            else
            {
                Print("创建套接字失败, 错误 ", GetLastError());
                connected = false;
            }
            
            if(!connected)
            {
                Print("5秒后重新尝试连接...");
                Sleep(5000);
                continue;
            }
        }
        
        if(connected && socket != INVALID_HANDLE)
        {
            if(GetTickCount() - lastPriceUpdate > priceUpdateInterval)
            {
                string priceInfo = GetPriceInfo(Symbol());
                if(HTTPSend(socket, priceInfo + "\r\n"))
                {
                    Print("价格信息已发送: ", priceInfo);
                    lastPriceUpdate = GetTickCount();
                }
                else
                {
                    Print("发送价格信息失败,连接可能已断开");
                    connected = false;
                    SocketClose(socket);
                    socket = INVALID_HANDLE;
                }
            }
            else
            {
                Sleep(50);
            }
        }
    }
    
    if(socket != INVALID_HANDLE)
    {
        SocketClose(socket);
    }
    Print("WebRequest脚本执行结束");
}
//+------------------------------------------------------------------+