MT4 配置步骤 MetaTrader 4
- 完成MT4软件安装后,请按以下步骤依次操作
- 将源目录中的 MQL4.zip 解压,把其中三个文件夹复制至MT4的“安装目录”下的 MQL4 文件夹中。若遇重名文件,请选择复制并替换
- 打开“MT4”软件,依次点击上方选项卡 工具 → 选项,在弹出页面中选择 EA交易
- 勾选 允许DLL导入(潜在的危险,只为受信任的应用程序启用),勾选 允许WebRequest用于所列URL
- 在下方URL输入框中添加如下链接:http://127.0.0.1
- 点击 确定 按钮,配置完成
- 在MT4平台上添加拟抓取的交易品种
- 将交易品种拖动至右侧以生成独立的折线图,在左侧导航的“EA交易”中找到 TCPSocket 文件,拖动至折线图上,点击“确定”即可
MT5 配置步骤 MetaTrader 5
- 完成MT5软件安装后,请按以下步骤依次操作
- 打开“MT5”软件,依次点击上方选项卡 工具 → 选项,在弹出页面中选择 EA交易
- 勾选 允许DLL导入(潜在的危险,只为受信任的应用程序启用),勾选 允许WebRequest用于所列URL
- 在下方URL输入框中添加如下链接:http://127.0.0.1
- 打开软件左侧“导航栏”,找到“EA交易”,右键“EA交易”,点击“用MetaEditor创建”
- 选择EA交易(模板),点击“下一页”;名称后边输入 TCPSocket,然后一直点击“下一页”,直至“完成”即可
- 在弹出的MetaEditor编辑器中,删除默认生成的代码
- 从下方代码模块复制全部代码,粘贴进上一步弹出的弹窗
- 点击编写按钮,关闭当前窗口即可
- 在MT5平台上添加拟抓取的交易品种
重要提示:若出现错误4014,需要在MT5终端中添加允许访问的地址:
- 打开MT5终端
- 点击 工具 -> 选项 -> 专家顾问
- 在"允许WebRequest对下列URL的访问"中添加:http://127.0.0.1:8087
- 点击确定保存设置
- 重新启动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脚本执行结束");
}
//+------------------------------------------------------------------+