MQL4: чтение одного значения из CSV

Я пытаюсь получить одно значение с веб-сайта источника данных Quandl для использования в MetaTrader4 скрипт. Сайт источника данных предоставляет метод для экспорта данных через API formats в том числе .csv, .json или же .xml, Я выбрал .csv формат, который веб-сайт источника данных обеспечивает API call для меня, чтобы использовать в следующем формате:

https://www.quandl.com/api/v3/datasets/ADB/LAB_UNEMP_JPN.csv?rows=1&api_key=my_api_key

Используя rows=1 параметр в приведенном выше API call Я могу выбрать, чтобы просто экспортировать одно значение (которое является latest value).

Q1. Могу ли я получить значение прямо из Quandl или мне нужно сохранить набор данных в виде файла.csv?

Так как Quandl обеспечивает API call (как видно выше), я был бы прав, предполагая, что я могу просто получить value с их сайта и не нужно будет сохранять набор данных на моем компьютере как .csv файл, который я тогда должен был бы получить latest value от? Я бы предпочел получить value прямо из Quandl без сохранения каких-либо файлов.

Q2. Как я могу получить значение, которое будет использоваться в моем скрипте MT4?

Я безуспешно пытался использовать метод FileOpen() для доступа к данным на сайте, а затем попытались print так что я могу сравнить value другим. Является FileOpen() только для .csv файлы сохраняются только на моем компьютере? Я хотел бы иметь возможность print value в моем сценарии однажды получен, чтобы я мог его использовать. Вот что у меня так далеко:

int start() {
  while (!IsStopped()) {
    Sleep(2000);

  int handle;
  int value;
  handle=FileOpen("https://www.quandl.com/api/v3/datasets/ADB/LAB_UNEMP_JPN.csv?rows=1&api_key=my_api_key", FILE_CSV, ';');
  if(handle>0)
    {
     value=FileReadNumber(handle);
     Print(handle);
     FileClose(handle);
    }
}

Если бы кто-нибудь мог помочь мне в моем стремлении извлечь это значение и напечатать его в моем сценарии, это было бы огромной помощью.

1 ответ

A1: Нет, вам не нужно использовать прокси-файл для этого API

Если вы попробуете вызов API, используя опубликованный синтаксис Quandl:
<pragma>://<URL.ip>/<relative.URL>[?<par.i>=<val.i>[&<par.j>=<val.j>[&...]]]
серверная часть будет выдвигать вам содержимое:

Date,Value
2013-12-31,4.0

Итак, ваш код может использовать Quandl API с таким образом:

void OnStart()
{    
     string cookie = NULL,
            headers; 
     char   post[],
            result[]; 
     int    res; 

/*   TODO:                                                                             *
 *   Must allow MT4 to access the server URL,                                          *
 *   you should add URL "https://www.quandl.com/api/v3/datasets/ADB/LAB_UNEMP_JPN.csv" *
 *   in the list of allowed URLs                                                       *
 *   ( MT4 -> Tools -> Options -> [Tab]: "Expert Advisors" ):                          */

     string aDataSOURCE_URL = "https://www.quandl.com/api/v3/datasets/ADB/LAB_UNEMP_JPN.csv";
     string aDataSOURCE_API = "rows = 1&api_key=<My_API_Key>";

     //-- Create the body of the POST request for API specifications and API-authorization
     ArrayResize( post,
                  StringToCharArray( aDataSOURCE_API, // string   text             |--> [in]  String to copy.
                                     post,            // uchar   &array[]       <--|    [out] Array of uchar type.
                                     0,               // int      start =  0       |--> [in]  Position from which copying starts. Default - 0. 
                                     WHOLE_ARRAY,     // int      count = -1       |--> [in]  Number of array elements to copy. Defines length of a resulting string. Default value is -1, which means copying up to the array end, or till terminating '\0'. Terminating zero will also be copied to the recipient array, in this case the size of a dynamic array can be increased if necessary to the size of the string. If the size of the dynamic array exceeds the length of the string, the size of the array will not be reduced.
                                     CP_UTF8          // uint     cp    = CP_ACP   |--> [in]  The value of the code page. For the most-used code pages provide appropriate constants.
                                     )
                  - 1
                  );

//-- Reset the last error code
     ResetLastError();

//-- Loading a html page from Quandl
     int timeout = 5000;                                                //-- Timeout below 1000 (1 sec.) is not enough for slow Internet connection

     res = WebRequest( "POST",              // const string  method            |--> [in]  HTTP method.
                        aDataSOURCE_URL,    // const string  URL               |--> [in]  URL.
                        cookie,             // const string  cookie            |--> [in]  Cookie value.
                        NULL,               // const string  referrer          |--> [in]  Value of the Referer header of the HTTP request.
                        timeout,            //       int     timeout           |--> [in]  Timeout in milliseconds.
                        post,               // const char   &data              |--> [in]  Data array of the HTTP message body
                        ArraySize( post ),  //       int     data_size         |--> [in]  Size of the data[] array.
                        result,             //       char   &result         <--|    [out] An array containing server response data.
                        headers             //       string &result_headers <--|    [out] Server response headers.
                        );
//-- Check errors
     if ( res == -1 )
     {    Print( "WebRequest Error. Error code  = ", GetLastError() );  //-- Perhaps the URL is not listed, display a message about the necessity to add the address
          MessageBox( "Add the address '" + aDataSOURCE_URL + "' in the list of allowed URLs on tab 'Expert Advisors'", "Error", MB_ICONINFORMATION );
          }
     else //-- Load was successfull
     {    
          PrintFormat( "The data has been successfully loaded, size = %d bytes.", ArraySize( result ) );

          //-- parse the content ---------------------------------------
          /*
              "Date,Value
               2013-12-31,4.0"

          */
          //-- consume the content -------------------------------------
          //...


          }
     }

Есть 4 основных пункта, чтобы позаботиться о:

0: MT4 разрешение на использование данного URL
1: API URL настроить - <pragma>://<URL.ip>/<relative.URL>
2: API const char &data[] в сборе. [?<par.i>=<val.i>[&<par.j>=<val.j>[&...]]]
3: API int data_size расчет длины


Приложение: Это скорее список причин, почему следует избегать использования Нового - MQL4.56789WebRequest() варианты функций:

В то время как MQL4 документация обещает простое использование WebRequest() варианты функций, (цит.:) "1. Отправка простых запросов типа" key=value "используя заголовок Content-Type: application/x-www-form-urlencoded ", реальность далека от обещанного простого варианта использования:

0: СОВЕРШЕНО: административный шаг MT4 (слабость: невозможно заставить MT4 взаимодействовать { http | https } протокол (ы) через другие порты по умолчанию ~ { :80 | :443 }

1:URL состоит из двух (трех, если используется :port спецификатор, который не работает в MT4 (ссылка 0: справа вверху)) части. <URL.ip_address> является первым и может быть выражен в канонической форме IPv4 (10.38.221.136) или в переводимой DNS форме (MT4_APAC_PRIMARY.broker.com). Вторая часть, <relative.URL>, указывает сам HttpServer, где находится файл (это HttpServer- относительное местоположение файла). Опубликованный веб-запрос разрешает использовать обе части, соединенные вместе, исх. aDataSOURCE_URL,

3: API WebServer, если он сконструирован так, может позволить добавить некоторые дополнительные параметры, которые могут быть указаны и представлены в WebServer. Презентация зависит от того, { HTTP GET | HTTP POST } опция протокола выбрана на стороне вызывающего абонента.

4: каждый звонок на МТ4 WebRequest() также требует, чтобы вызывающая сторона указала длину data параметр содержимого (ссылка на использование ArraySize( post ), // int data_size)

Другие вопросы по тегам