首页 文章

如何从MQL5中的URL读取JSON?

提问于
浏览
0

如何从 MQL5 中的网址读取 JSON

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

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

1 回答

  • 0

    很简单,但限制适用 .

    MetaTrader Terminal 5是一个代码执行环境,可以通过端口 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() 函数,必须在"Options"窗口的"Expert Advisors"选项卡的允许 URL 列表中添加所有必需的 URL (服务器)a-priori的地址 . 服务器端口根据指定的协议自动选择 - 80 表示“ http:// ”, 443 表示“ https:// ”(不是空闲选项...) .

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

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

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


    坏消息?

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

相关问题