【问题标题】:How to read a JSON from a URL in MQL5?如何从 MQL5 中的 URL 读取 JSON?
【发布时间】:2016-08-26 23:13:38
【问题描述】:

如何从 MQL5 中的网址读取 JSON

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

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

【问题讨论】:

  • 由于下面列出的限制,任何生产级MQL4/MQL5 系统都应与外部分布式JSON 通信器/处理器一起使用,如在回答您上一个问题的预告片部分中所述 > >> stackoverflow.com/a/36863108/3666197

标签: algorithmic-trading mql4 metatrader4 mql5


【解决方案1】:

简单,但有限制。

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

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

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

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


坏消息?

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

【讨论】:

  • 你之前的问题已经尝试过 DLL 调用 >>> stackoverflow.com/a/36863108/3666197 并且那里也提到了 JSON。
  • 你能给我看一个小例子,我如何从 dll 文件中调用函数吗?
  • @fadi 欢迎您,Fadi,发布一个小问题,并附上您感兴趣的主题,社区将回复该主题。这就是 StackOverflow 的工作原理,以及来自好问题和有趣、有用或其他鼓舞人心的答案的有用输入如何通过 +1 upVotes 获得奖励。
  • 不完全是,所提到的 URL 由一组参数扩展,这些参数不是 URL 的一部分,但旨在移交给远程 HttpServer 端过程,可以(但不必)将它们包含在响应处理中(在远程内容烹饪配方中使用或不使用它们)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多