如何在 MQL5 中从 URL 读取 JSON?

How to read a JSON from a URL in MQL5?

如何从 MQL5 中的 url 读取 JSON

例如这个简单的 JSON 来自:https://api.myjson.com/bins/56z28

{ "employees": [ { "firstName": "John",
                   "lastName":  "Doe"
                   },
                 { "firstName": "Anna",
                   "lastName":  "Smith"
                   },
                 { "firstName": "Peter",
                   "lastName":  "Jones"
                   }
                 ]
  }

简单,但有限制。

MetaTrader Terminal 5 是一个代码执行环境,可以通过端口上的两个 HTTP/HTTPS 协议与外部 URL 目标(如果明确配置为允许的 URL)通信80/443分别

   string aCookieHOLDER = NULL,
          aHttpHEADERs;

   char   postBYTEs[],
          replBYTEs[];    
   int    aRetCODE;
   string aTargetURL = "https://api.myjson.com/bins/56z28";

                    /*  to enable access to the URL-> pointed server,
                        you should append "https://api.myjson.com/bins/56z28"
                        to the list of allowed URLs in
                        ( Main Menu -> Tools -> Options, tab "Expert Advisors" ):
                        */
   ResetLastError();                     // Reset the last error code
   int    aTIMEOUT = 5000;               // less than 1 sec. is NOT
                                         // enough for slow Internet connection
   aRetCODE = WebRequest( "GET",
                          aTargetURL,
                          aCookieHOLDER,
                          NULL,
                          aTIMEOUT,
                          postBYTEs,
                          0,
                          replBYTEs,
                          aHttpHEADERs
                          );
   if ( aRetCODE == EMPTY )             // Check errors
   {    Print( "Error in WebRequest(). Error code  = ", GetLastError() );    
     }
   else
   {    // Load was successfull, PROCESS THE STRING ... assumed to be a JSON
   }

如代码中所述, 要使用 WebRequest() 功能,必须先在 "Expert Advisors" 中允许的 URL 列表中添加所有必需的 URL(服务器)的地址"Options" window 的选项卡。服务器端口根据指定的协议自动选择 - 80 代表“http://”,443 代表“https://”(不是免费选项...)。

WebRequest() 函数 是同步的,这意味着它 breaks/blocks(!) 程序执行并等待请求的响应 URL.由于接收响应的延迟可能很大,该函数不适用于来自指标的调用,因为指标 运行 在一个由一个交易品种上的所有指标和图表共享的公共线程中。某个交易品种的其中一张图表上的指标性能延迟可能会停止更新同一交易品种的所有图表 (!!!!)。

该函数只能从 Expert Advisorsscripts 调用,因为它们 运行 在它们自己的执行线程中。如果您尝试从 Custom Indicator 调用函数,GetLastError() 将 return 错误 4060"Function is not allowed for call".

WebRequest() 无法 在策略测试器中执行。


坏消息?

如果这一切听起来对您的项目来说是个坏消息,请不要放弃。 MQL 代码可以调用 DLL 函数,因此可以集成公平、分布式、非阻塞的通信器,它与 MQL 代码顺利协作,并且在生产系统中不包含上述任何限制.