如何从MQL5中的URL读取JSON?

时间:2016-05-02 08:32:17

标签: algorithmic-trading mql4 metatrader4 mql5

如何从 JSON 的网址中读取 MQL5

例如来自https://api.myjson.com/bins/56z28

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

1 个答案:

答案 0 :(得分:0)

简单,但限制适用。

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

   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()函数,必须在"专家的允许URL列表中添加所有必需URL s(服务器)a-priori的地址顾问" "选项"的标签窗口。服务器端口根据指定的协议自动选择 - 80用于" http://"和443 for" https://" (不是免费选项......)。

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

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

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

坏消息?

如果所有这些对您的项目来说都是一个坏消息,请不要放弃。 MQL代码可以调用DLL函数,因此可以集成一个公平的,分布式的,非阻塞的通信器,它可以顺利地与MQL代码协作,并且不包括生产系统中的任何上面列出的限制