1

如何JSON从 url 中读取MQL5

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

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

1 回答 1

1

很简单,但有限制。

HTTP/HTTPSMetaTrader 终端 5 是一个代码执行环境,可以分别通过端口上的两种协议与外部 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()功能,必须先将所有必需的 s(服务器)的地址添加到“选项”窗口的“专家顾问”选项卡中URL允许的 s 列表中。URL服务器端口是根据指定的协议自动选择的 -80用于“ http://”和443https://”(不是免费选项......)。

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

该函数只能从Expert Advisors和调用scripts,因为它们在自己的执行线程中运行。如果您尝试从 a 调用函数Custom IndicatorGetLastError()将返回错误4060-"Function is not allowed for call".

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


坏消息?

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

于 2016-05-02T14:37:12.863 回答