3

我正在尝试在我的 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 服务器上,控制台什么也没有记录。

4

2 回答 2

4

工作计划:

  1. 启用MT4/5 以使用{http:|https:}传输类到选定的目标

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

  3. 实现端到端逻辑被包装+隐藏在愚蠢的http协议交换中


1)终端权限:

使用 Terminal->Tools->Options启用[x]Allow a WebRequest URL ”以使用localhost {http:|https:}您选择的 URL,匹配 nodejs-server 设置,在列表中 在此处输入图像描述

2)WebRequest()事件循环内的代码

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

事件循环主要是您的设计工作:

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
           }
    }
}

有关更多详细信息,请查看我关于WebRequest()用例的其他帖子以及有关其主要限制的警告。

3)端到端逻辑

这是您设计的奶油阿拉奶油。


还有其他方法吗?

就在这里。那将是我的选择之一- 使用ZeroMQnanomsg在双方(MT4/5 终端和 NodeJS),从而能够充分享受全面分布式系统设计的自由(检查主体aMiniRESPONDER()-prototype 示例结构中的[SIG,MSG]工作)完全分布式系统)

于 2017-02-08T10:22:11.373 回答
3

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

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

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

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

该服务还提供复制交易 API https://metaapi.cloud/docs/copyfactory和 API 来计算 MetaTrader 账户上的外汇交易指标https://metaapi.cloud/docs/metastats

于 2020-06-29T00:09:16.623 回答