2016-05-02 3 views
0

Как я могу прочитать 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" 
        } 
       ] 
    } 
+0

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

ответ

0

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

Терминал MetaTrader 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 и не включает какие-либо из перечисленных ограничений в производственной системе.

+0

Ваш предыдущий вопрос уже пробовал DLL-вызовы >>> http://stackoverflow.com/a/36863108/3666197 и JSON также упоминался там. – user3666197

+1

Можете ли вы показать мне небольшой пример того, как я могу вызвать функцию из dll-файла? – fadi

+0

@fadi Добро пожаловать, Фади, напишите небольшой вопрос с темой, которую вы заинтересовали, и сообщество ответит на эту тему. Вот как работает StackOverflow и как полезные входы как из хороших Вопросов, так и интересные, полезные или другие вдохновляющие ответы вознаграждаются +1 upVotes. – user3666197