Как прочитать JSON из URL-адреса в MQL5?

Как я могу прочитать JSON по URL-адресу в MQL5?

Например, этот простой JSON из: https://api.myjson.com/bins/56z28

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

person fadi    schedule 02.05.2016    source источник
comment
Из-за ограничений, перечисленных ниже, любая производственная система MQL4/MQL5 должна работать с внешним распределенным JSON коммуникатором/процессором, как указано в трейлере ответа на ваш предыдущий вопрос ››› stackoverflow.com/a/36863108/3666197   -  person user3666197    schedule 02.05.2016


Ответы (1)


Просто, но есть ограничения.

MetaTrader Terminal 5 — это среда выполнения кода, которая может взаимодействовать с внешним целевым URL-адресом (если он явно настроен как разрешенный URL-адрес) через оба HTTP/HTTPS протокола через порт 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() необходимо априори добавить адреса всех необходимых URL (серверов) в список разрешенных URL на вкладке "Советники" окна "Параметры". Порт сервера выбирается автоматически на основе указанного протокола - 80 для "http://" и 443 для "https://" (не бесплатная опция...).

Функция WebRequest() является синхронной, что означает прерывание/блокировку(!) выполнения программы и ожидание ответа от запрошенного URL. Так как задержки в получении ответа могут быть большими, для вызовов из индикаторов функция недоступна, т.к. индикаторы работают в общем потоке, общем для всех индикаторов и графиков на одном символе. Задержка работы индикатора на одном из графиков символа может привести к прекращению обновления всех графиков этого символа(!!!!).

Функция может быть вызвана только из Expert Advisors и scripts, так как они работают в своих собственных потоках выполнения. Если вы попытаетесь вызвать функцию из Custom Indicator, GetLastError() вернет ошибку 4060"Function is not allowed for call".

WebRequest() не может выполняться в тестере стратегий.


Плохие новости?

Если все это звучит как плохие новости для вашего Проекта, не сдавайтесь. MQL код может вызывать DLL-функции, поэтому можно интегрировать честный, распределенный, неблокирующий коммуникатор, который плавно взаимодействует с MQL кодом и не включает ни одно из вышеперечисленных ограничений в производственную систему.

person user3666197    schedule 02.05.2016
comment
В предыдущем вопросе уже использовались вызовы DLL ››› stackoverflow.com/a/36863108/3666197, и там также упоминался JSON. - person user3666197; 02.05.2016
comment
Можете ли вы показать мне небольшой пример, как я могу вызвать функцию из файла dll? - person fadi; 03.05.2016
comment
@fadi Добро пожаловать, Фади, опубликуйте небольшой вопрос по интересующей вас теме, и сообщество ответит на эту тему. Вот как работает StackOverflow, и как полезные ответы как из хороших вопросов, так и из интересных, полезных или иным образом вдохновляющих ответов награждаются +1 голосом вверх. - person user3666197; 03.05.2016
comment
Не совсем так, указанный URL-адрес расширен группой параметров, которые не являются частью URL-адреса, но предназначены для передачи удаленному процессу на стороне HttpServer, который может (но не обязательно) ) включить их в обработку ответов (используя их или нет, внутри рецепта удаленной подготовки контента). - person user3666197; 07.09.2016