如何从 MetaTrader 终端 5 MQL 5 post 向我的 nodejs 服务器发出请求,该服务器在我的 MT5 主机上本地 运行?

How to post from MetaTrader Terminal 5 MQL 5 a request to my nodejs server, which is running locally on my MT5 host?

我正在尝试在我的 nodejs 服务器中获取外汇汇率,然后 socke.io 将它们发送给客户端,同时 运行 正在使用 MetaTrader 终端 5 或 4。

所以我想我必须使用 MQL4/5。我知道如何处理我的 nodejs 服务器中的请求。我不知道在哪里编写 MQL4 代码,在我的 MetaTrader 终端中配置什么。

假设我想在每次更改时将 EUR/USD 出价发送到我的 nodejs 服务器。我该如何实现,使用 MT4/5 和 MQL4/5?

我的nodejs代码:

app.post('/fxroute', (req, res) => {
   console.log(req);
   let fxRates = req.body // dont know if the payload will be in body
   socket.emit('fxRates', fxRates);
});

MQL5 脚本:

#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart(){
     string  headers;
     char    data[],
             result[];
     string             str = "data=value";        // POST-data, variables to send    
     StringToCharArray( str,                data );
     string          b = CharArrayToString( data );
     Print( "Test:", b ); // just a test of data, if good ... OK, data was setup correctly.

     WebRequest( "POST",
                 "http://localhost:3000/fxroute",
                 NULL,
                 NULL,
                 3000,
                 data,
                 ArraySize( data ),
                 result,
                 headers
                 );
     Print( CharArrayToString( result ) );   // see the results
                                             // it returns
                                             // "Results:" No posted data.
  }

当我编译和 运行 时,我看到它是在 MT Experts 选项卡中执行的,但是在我的 nodejs 服务器上,控制台没有任何记录。

工作计划:

  1. 启用MT4/5使用{http:|https:}transport-class选择目标

  2. 创建 MT4/5 代码以执行某种基于 {http:|https:} 的服务

  3. 实现end-to-end逻辑被包裹+隐藏在哑巴http-protocol交换


1) 终端权限:

使用终端->工具->选项启用[x] "允许WebRequestURL" 以使用您选择的 localhost {http:|https:} URL,匹配 nodejs-server 设置,在列表中

2) WebRequest() 里面的代码 event-loop

根据您的意图,创建一个 MQL4 脚本,使用 built-in IDE F4 或使用您选择的外部编辑器并将生成的 .mq4 脚本文件保存在 ~an_MT4_Terminal_Home_Directory/MQL4/Scripts目录

event-loop 主要是你的设计工作:

int start() {
    while !isStopped() {                            // ACK LOOP
           if ( RefreshRates() ) {                  // NEW QUOTE has arrived
                ...                                 // JOB PROCESS Bid
                int aHttpRetCODE = WebRequest(...); // SIG-> NodeJS Server
                ...                                 // JOB PROCESS Response ( if a bi-directional service )
           }
           else {
                Sleep(...);                         // NOP on NACK, Terminal has nothing to do
           }
    }
}

For further details, may like to check my other posts on WebRequest() use-cases and warnings about it's principal limitations.

3) end-to-end 逻辑

你的设计 creme-ala-creme 来了。


还有其他方法吗?

是的,有。 That would be the one of my choice - using ZeroMQ or nanomsg on both sides ( MT4/5 Terminal & NodeJS ), thus being able to fully .

您也可以尝试 MetaApi https://metaapi.cloud 云服务,它提供 REST API 和 WebSocket API 访问 MetaTrader 4 和 MetaTrader 5 账户。

官方 REST API 文档:https://metaapi.cloud/docs/client

SDK:https://metaapi.cloud/sdks(javascript、python 和 Java SDK 于 2021 年 4 月提供)

支持读取账户信息、持仓、订单、交易历史、接收报价、访问市场数据。

该服务还提供跟单交易API https://metaapi.cloud/docs/copyfactory and API to calculate forex trading metrics on a MetaTrader account https://metaapi.cloud/docs/metastats.