
Введение в Connexus (Часть 1): Как использовать функцию WebRequest?
Введение
В мире финансового программирования, особенно в контексте MetaTrader 5, возможность взаимодействия с удаленными серверами по протоколу HTTP имеет жизненно важное значение. Будь то получение рыночных данных в режиме реального времени, отправка торговых ордеров в API или даже запрос к сторонним сервисам, HTTP-запросы играют решающую роль. В MQL5 функция WebRequest является встроенным инструментом, предоставляемым для таких коммуникаций, но ее ограничения делают ее непрактичной во многих сценариях.
HTTP (протокол передачи гипертекста) является основой веб-коммуникации, и освоение его использования позволяет разработчикам создавать разнообразные и динамичные типы интеграции между MetaTrader 5 и другими сервисами. Например, советнику (EA) может потребоваться доступ к новостному API для корректировки своих торговых стратегий на основе глобальных событий. Другим распространенным типом применения является запрос цен на криптовалюты на биржах, которые предлагают HTTP API, что позволяет советнику торговать синхронно с этими рынками.
Несмотря на важность HTTP-запросов, реализация функции WebRequest в MQL5 - это не совсем то, чего можно было бы ожидать от современного и гибкого инструмента. Это ставит разработчиков в сложное положение: либо приспосабливаться к ограничениям, либо искать обходные пути. Серия статей, которую мы начинаем здесь, направлена именно на это — изучение слабых мест функции WebRequest и создание библиотеки Connexus, которая преодолевает эти ограничения и упрощает работу разработчиков на MQL5.
Функция WebRequest открывает широкий спектр возможностей для интеграции с внешними сервисами. Эта функция позволяет экспертам напрямую взаимодействовать с Интернетом - от сбора финансовых данных, которые могут быть необходимы для принятия автоматических торговых решений, до полной автоматизации процессов. Это позволяет, например, вашему торговому роботу получать информацию в режиме реального времени из внешних источников, такую как экономические новости или рыночные данные с других платформ. Такие данные можно обработать и использовать для автоматической корректировки ваших торговых стратегий, что повышает как точность, так и эффективность ваших операций.
Однако, как будет продемонстрировано в представленных примерах, использование функции WebRequest может оказаться нетривиальным. Отправка HTTP-запроса может показаться простой, но вы быстро столкнетесь с техническими проблемами, такими как отправка корректных заголовков, форматирование данных в формате JSON, правильная обработка ответов сервера и даже устранение ошибок и исключений, которые могут возникнуть во время коммуникации. Такие проблемы покажут, что, несмотря на свою мощность, функция требует глубокого понимания протоколов и взаимодействия между системами, что может стать серьезным препятствием для разработчиков, которые только начинают осваивать эту область.
Именно здесь возникнет необходимость в более доступном и эффективном инструменте. Библиотека Connexus , которая будет разработана и усовершенствована в следующих статьях данной серии, призвана преодолеть эти ограничения и сделать процесс интеграции через WebRequest более удобным для пользователя и интуитивно понятным. Идея Connexus заключается в том, что разработчики смогут сосредоточиться на том, что действительно важно: на логике своих приложений и советников, без необходимости непосредственно разбираться с техническими деталями нижних уровней сетевого программирования. Вместо того, чтобы тратить время на устранение ошибок в форматировании или заголовках, вы сможете сосредоточиться на эффективной интеграции ваших систем с понятным и функциональным интерфейсом.
Данная серия статей будет посвящена тщательному изучению слабых сторон функции WebRequest, ее ограничений и тому, как мы будем их обходить при разработке надежного решения. В дополнение к продолжению обсуждения протокола HTTP, мы рассмотрим такие аспекты, как аутентификация в API, обработка больших объемов данных и реализация расширенных функций, таких как контроль времени отклика и обработка множества одновременных запросов.
Итак, если вы заинтересованы в совершенствовании своих навыков разработки на MQL5, получении дополнительной информации о системной интеграции и оптимизации процессов HTTP-взаимодействия, следите за нашими предстоящими публикациями. Мы продолжим расширять рамки данного проекта, помогая вам в разработке библиотеки Connexus, чтобы она стала незаменимым инструментом в вашем арсенале разработки. Полученные здесь знания будут полезны не только тем, кто работает с MetaTrader, но и любому разработчику, которому необходимо интегрировать API и веб-сервисы в свои приложения.
Знакомство с функцией «WebRequest»
Функция WebRequest - это основной инструмент, предоставляемый MQL5 для выполнения HTTP-запросов. Проще говоря, она позволяет программе на MQL5 отправлять запрос на сервер и получать ответ. Хотя это может показаться простым, практическое использование функции WebRequest выявляет ряд подводных камней и сложностей, которые могут усложнить разработку.
Базовый синтаксис функции имеет две версии:
int WebRequest( const string method, // HTTP method const string url, // URL const string cookie, // cookie const string referer, // referer int timeout, // timeout const char &data[], // the array of the HTTP message body int data_size, // data[] array size in bytes char &result[], // an array containing server response data string &result_headers // headers of server response );
int WebRequest( const string method, // HTTP method const string url, // URL const string headers, // headers int timeout, // timeout const char &data[], // the array of the HTTP message body char &result[], // an array containing server response data string &result_headers // headers of server response );
Параметры функции WebRequest жизненно важны для ее надлежащего функционирования, а их детальное понимание необходимо любому разработчику, который хочет эффективно ее использовать. Давайте рассмотрим каждый из этих параметров:
Название параметра | Тип | Ввод-Вывод | Описание |
---|---|---|---|
method | строка | ввод | Данный параметр определяет тип HTTP-запроса, который вы хотите отправить. Наиболее распространенными типами являются GET и POST. Тип GET используется для запроса данных с сервера, в то время как тип POST используется для отправки данных на сервер. |
url | строка | ввод | Это адрес сервера, на который будет отправлен запрос. URL-адрес должен быть полным, включая протокол (http или https). |
headers | строка | ввод | Дополнительные HTTP-заголовки могут передаваться в виде массива строк. Каждая строка должна быть в формате "Key: Value". Эти заголовки используются для передачи дополнительной информации, такой как токены аутентификации или тип контента, разделенные новой строкой "\r\n". |
cookie | строка | ввод | Значение cookie. |
referer | строка | ввод | Значение заголовка Referer HTTP-запроса. |
timeout | int | ввод | Устанавливает максимальное время ожидания ответа от сервера, в миллисекундах. Надлежащий тайм-аут имеет решающее значение для того, чтобы советник не застрял в ожидании ответа, который может так и не прийти. |
data | char[] | ввод | Для POST-запросов этот параметр используется для отправки данных на сервер. Эти данные должны быть представлены в виде массива байт, что может оказаться сложной задачей для разработчиков, которые не знакомы с обработкой двоичных данных. |
data_size | int | ввод | Это размер данных, которые будут отправлены. Для корректной работы запроса он должен соответствовать размеру массива данных. |
result | char[] | вывод | Этот параметр получает ответ от сервера, также в виде массива байт. После вызова функции массив необходимо декодировать, чтобы извлечь полезную информацию. |
result_headers | строка | вывод | Данный массив строк получает заголовки ответов от сервера, которые могут содержать важную информацию, такую как тип содержимого и статус аутентификации. |
Каждый из этих параметров должен быть тщательно настроен, чтобы гарантировать правильность выполнения запроса. Ошибка в любом из этих параметров может привести к неправильному формированию запроса или полному сбою коммуникации с сервером.
Функция возвращает код состояния HTTP, который указывает на успешное или неудачное выполнение операции. В то время как WebRequest охватывает основные концепции, его реализация оставляет желать лучшего. Это требует от разработчика ручного управления созданием заголовков, обработкой различных типов данных и проверкой ошибок, что делает процесс утомительным и подверженным ошибкам. Одним из преимуществ функции WebRequest является то, что она поддерживает как запросы GET, так и POST, что позволяет ей взаимодействовать с широким спектром API.
Практический пример функции WebRequest
Для иллюстрации использования функции WebRequest приведем простой пример. Для этого будем использовать httpbin.org, который представляет собой бесплатный онлайн-сервис, позволяющий создавать и тестировать HTTP-запросы. Его создал kennethreitz, это проект OpenSource (ссылка). Этот сервис работает очень простым и незамысловатым способом. По сути, это «зеркало». Вы встаете перед зеркалом и принимаете позу или задаете вопрос. Это похоже на отправку запроса в HTTP Bin. Зеркало в точности отражает то, что вы делаете. Это похоже на то, как HTTP Bin получает и отражает то, что вы отправили. Это полезный инструмент для разработчиков, которые хотят точно проверить, что отправляется в их HTTP-запросах, или которым необходимо смоделировать различные типы запросов и ответов. Некоторые общие функции httpbin включают в себя:
- Отправка запросов: Вы можете отправлять HTTP-запросы различных типов, такие как GET, POST, PUT, DELETE и т.д., чтобы увидеть, как реагирует сервер.
- Тестирование HTTP-заголовков: Вы можете отправлять пользовательские заголовки и просматривать ответ сервера, что полезно для устранения проблем, связанных с заголовками.
- Отправка данных в теле запроса: Можно протестировать отправку данных в теле запроса и посмотреть, как сервер обрабатывает их.
- Моделирование статуса HTTP: Вы можете запросить у сервера возврат определенных кодов состояния, таких как 200, 404, 500 и т.д., чтобы проверить, как ваше приложение обрабатывает различные ответы о состоянии.
- Моделирование задержек и перенаправлений: httpbin.org позволяет моделировать задержки ответа или перенаправления, помогая тестировать поведение системы в более сложных сценариях.
- Тестирование файлов cookie: Вы можете манипулировать файлами cookie, наблюдая за тем, как они устанавливаются и возвращаются сервером.
Это практичный инструмент для интеграции систем, использующих протокол HTTP. Выполним максимально простой запрос GET с помощью функции WebRequest.
Шаг 1: Добавим URL-адрес в терминал
Согласно документации: Чтобы воспользоваться функцией WebRequest(), добавим необходимые адреса серверов в список разрешенных URL-адресов на вкладке "Tools" окна "Options". Порт сервера выбирается автоматически на основе указанного протокола - 80 для "http://" и 443 для "https://".
Шаг 2: Практический код
В каталоге <data_folder>/MQL5/Experts создайте папку с именем Connexus. В эту папку поместим наши тестовые файлы. Чтобы найти папку с данными, в главном меню MetaTrader или MetaEditor выберите File > Open Data Folder. Внутри этой папки создадим файл с именем “WebRequest.mq5”, и получится что-то вроде этого:
//+------------------------------------------------------------------+ //| WebRequest.mq5 | //| Copyright 2023, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2023, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- } //+------------------------------------------------------------------+
На данный момент мы будем использовать только событие OnInit() для тестирования. Давайте определим некоторые переменные для выполнения запроса и передадим их в функцию WebRequest.
int OnInit() { //--- Defining variables string method = "GET"; // HTTP verb in string (GET, POST, etc...) string url = "https://httpbin.org/get"; // Destination URL string headers = ""; // Request header int timeout = 5000; // Maximum waiting time 5 seconds char data[]; // Data we will send (body) array of type char char result[]; // Data received as an array of type char string result_headers; // String with response headers //--- Calling the function and getting the status_code int status_code = WebRequest(method,url,headers,timeout,data,result,result_headers); //--- Print the data Print("Status code: ",status_code); Print("Response: ",CharArrayToString(result)); // We use CharArrayToString to display the response in string form. //--- return(INIT_SUCCEEDED); }
Когда мы вставим робота на график, терминал выдаст следующий ответ:
WebRequest (WINV24,M1) Status code: 200 WebRequest (WINV24,M1) Resposta: { WebRequest (WINV24,M1) "args": {}, WebRequest (WINV24,M1) "headers": { WebRequest (WINV24,M1) "Accept": "*/*", WebRequest (WINV24,M1) "Accept-Encoding": "gzip, deflate", WebRequest (WINV24,M1) "Accept-Language": "pt,en;q=0.5", WebRequest (WINV24,M1) "Host": "httpbin.org", WebRequest (WINV24,M1) "User-Agent": "MetaTrader 5 Terminal/5.4476 (Windows NT 11.0.22631; x64)", WebRequest (WINV24,M1) "X-Amzn-Trace-Id": "Root=1-66d8cd53-0d6cd16368aa22e455db461c" WebRequest (WINV24,M1) }, WebRequest (WINV24,M1) "origin": "XXX.XXX.XX.XXX", WebRequest (WINV24,M1) "url": "https://httpbin.org/get" WebRequest (WINV24,M1) } WebRequest (WINV24,M1)
Обратите внимание, что полученный код состояния был равен 200, что означает, что запрос был выполнен успешно, и в ответ мы получили JSON с некоторыми данными. В следующей статье мы более подробно рассмотрим, как работает коммуникация по протоколу HTTP. Теперь мы изменим HTTP-операцию на POST и отправим данные в теле запроса.
int OnInit() { //--- Defining variables string method = "POST"; // HTTP verb in string (GET, POST, etc...) string url = "https://httpbin.org/post"; // Destination URL string headers = ""; // Request header int timeout = 5000; // Maximum waiting time 5 seconds char data[]; // Data we will send (body) array of type char char result[]; // Data received as an array of type char string result_headers; // String with response headers //--- Treating body string body = "{\"key1\":\"value1\",\"key2\":\"value2\"}"; StringToCharArray(body,data,0,WHOLE_ARRAY,CP_UTF8); // Converts a string to a byte array //--- Calling the function and getting the status_code int status_code = WebRequest(method,url,headers,timeout,data,result,result_headers); //--- Print the data Print("Status code: ",status_code); Print("Response: ",CharArrayToString(result)); // We use CharArrayToString to display the response in string form. //--- return(INIT_SUCCEEDED); }
Итак, теперь у нас все работает, учитывая, что httpbin возвращает все, что мы отправляем, он должен возвращать текстовую часть, которую мы отправили, верно? Выполнение кода POST вернет:
WebRequest (WINV24,M1) Status code: 200 WebRequest (WINV24,M1) Resposta: { WebRequest (WINV24,M1) "args": {}, WebRequest (WINV24,M1) "data": "", WebRequest (WINV24,M1) "files": {}, WebRequest (WINV24,M1) "form": { WebRequest (WINV24,M1) "{\"key1\":\"value1\",\"key2\":\"value2\"}\u0000": "" WebRequest (WINV24,M1) }, WebRequest (WINV24,M1) "headers": { WebRequest (WINV24,M1) "Accept": "*/*", WebRequest (WINV24,M1) "Accept-Encoding": "gzip, deflate", WebRequest (WINV24,M1) "Accept-Language": "pt,en;q=0.5", WebRequest (WINV24,M1) "Content-Length": "34", WebRequest (WINV24,M1) "Content-Type": "application/x-www-form-urlencoded", WebRequest (WINV24,M1) "Host": "httpbin.org", WebRequest (WINV24,M1) "User-Agent": "MetaTrader 5 Terminal/5.4476 (Windows NT 11.0.22631; x64)", WebRequest (WINV24,M1) "X-Amzn-Trace-Id": "Root=1-66d9bc77-314c004a607c383b3197c15a" WebRequest (WINV24,M1) }, WebRequest (WINV24,M1) "json": null, WebRequest (WINV24,M1) "origin": "200.103.20.126", WebRequest (WINV24,M1) "url": "https://httpbin.org/post" WebRequest (WINV24,M1) } WebRequest (WINV24,M1)
Обратите внимание, что у нас есть несколько дополнительных полей, таких как “json” и “data”. Разберемся по каждому из них. В поле “data” должен отображаться текст, который мы отправили в строковом формате, в то время как в поле “json” должен отображаться текст, который мы отправили в формате json. Но почему оба они пусты, если в запросе мы отправили текст? Да потому что мы должны сообщить серверу, что типом содержимого будет json. Для этого мы настраиваем заголовок запроса следующим образом:
int OnInit() { //--- Defining variables string method = "POST"; // HTTP verb in string (GET, POST, etc...) string url = "https://httpbin.org/post"; // Destination URL string headers = "Content-Type: application/json";// Request header int timeout = 5000; // Maximum waiting time 5 seconds char data[]; // Data we will send (body) array of type char char result[]; // Data received as an array of type char string result_headers; // String with response headers //--- Treating body string body = "{\"key1\":\"value1\",\"key2\":\"value2\"}"; StringToCharArray(body,data,0,WHOLE_ARRAY,CP_UTF8); //--- Calling the function and getting the status_code int status_code = WebRequest(method,url,headers,timeout,data,result,result_headers); //--- Print the data Print("Status code: ",status_code); Print("Response: ",CharArrayToString(result)); // We use CharArrayToString to display the response in string form. //--- return(INIT_SUCCEEDED); }
WebRequest (WINV24,M1) Status code: 200 WebRequest (WINV24,M1) Resposta: { WebRequest (WINV24,M1) "args": {}, WebRequest (WINV24,M1) "data": "{\"key1\":\"value1\",\"key2\":\"value2\"}\u0000", WebRequest (WINV24,M1) "files": {}, WebRequest (WINV24,M1) "form": {}, WebRequest (WINV24,M1) "headers": { WebRequest (WINV24,M1) "Accept": "*/*", WebRequest (WINV24,M1) "Accept-Encoding": "gzip, deflate", WebRequest (WINV24,M1) "Accept-Language": "pt,en;q=0.5", WebRequest (WINV24,M1) "Content-Length": "34", WebRequest (WINV24,M1) "Content-Type": "application/json", WebRequest (WINV24,M1) "Host": "httpbin.org", WebRequest (WINV24,M1) "User-Agent": "MetaTrader 5 Terminal/5.4476 (Windows NT 11.0.22631; x64)", WebRequest (WINV24,M1) "X-Amzn-Trace-Id": "Root=1-66d9be03-59060f042f7090092787855e" WebRequest (WINV24,M1) }, WebRequest (WINV24,M1) "json": null, WebRequest (WINV24,M1) "origin": "200.103.20.126", WebRequest (WINV24,M1) "url": "https://httpbin.org/post" WebRequest (WINV24,M1) } WebRequest (WINV24,M1)
Обратите внимание, что теперь отправленные нами данные находятся в поле “data”, что указывает на то, что мы на правильном пути; но обратите внимание, что символ \u0000 появляется потому, что метод StringToCharArray включает в себя нулевой ограничитель при преобразовании строки в массив байтов. Чтобы избежать этого, мы можем настроить размер массива. Распечатаем отправляемый нами текст, чтобы увидеть, откуда берется этот символ “\u0000”.
int OnInit() { //--- Defining variables string method = "POST"; // HTTP verb in string (GET, POST, etc...) string url = "https://httpbin.org/post"; // Destination URL string headers = "Content-Type: application/json";// Request header int timeout = 5000; // Maximum waiting time 5 seconds char data[]; // Data we will send (body) array of type char char result[]; // Data received as an array of type char string result_headers; // String with response headers //--- Tratando body string body = "{\"key1\":\"value1\",\"key2\":\"value2\"}"; StringToCharArray(body,data,0,WHOLE_ARRAY,CP_UTF8); Print("Body: ",body); Print("Body Size: ",StringLen(body)); ArrayPrint(data); Print("Array Size: ",ArraySize(data)); //--- Calling the function and getting the status_code int status_code = WebRequest(method,url,headers,timeout,data,result,result_headers); //--- Print the data Print("Status code: ",status_code); Print("Response: ",CharArrayToString(result)); // We use CharArrayToString to display the response in string form. //--- return(INIT_SUCCEEDED); }
WebRequest (WINV24,M1) Body: {"key1":"value1","key2":"value2"} WebRequest (WINV24,M1) Body Size: 33 WebRequest (WINV24,M1) 123 34 107 101 121 49 34 58 34 118 97 108 117 101 49 34 44 34 107 101 121 50 34 58 34 118 97 108 117 101 50 34 125 0 WebRequest (WINV24,M1) Array Size: 34 WebRequest (WINV24,M1) Status code: 200 WebRequest (WINV24,M1) Resposta: { WebRequest (WINV24,M1) "args": {}, WebRequest (WINV24,M1) "data": "{\"key1\":\"value1\",\"key2\":\"value2\"}\u0000", WebRequest (WINV24,M1) "files": {}, WebRequest (WINV24,M1) "form": {}, WebRequest (WINV24,M1) "headers": { WebRequest (WINV24,M1) "Accept": "*/*", WebRequest (WINV24,M1) "Accept-Encoding": "gzip, deflate", WebRequest (WINV24,M1) "Accept-Language": "pt,en;q=0.5", WebRequest (WINV24,M1) "Content-Length": "34", WebRequest (WINV24,M1) "Content-Type": "application/json", WebRequest (WINV24,M1) "Host": "httpbin.org", WebRequest (WINV24,M1) "User-Agent": "MetaTrader 5 Terminal/5.4476 (Windows NT 11.0.22631; x64)", WebRequest (WINV24,M1) "X-Amzn-Trace-Id": "Root=1-66d9bed3-2ebfcda024f637f436fc1d82" WebRequest (WINV24,M1) }, WebRequest (WINV24,M1) "json": null, WebRequest (WINV24,M1) "origin": "200.103.20.126", WebRequest (WINV24,M1) "url": "https://httpbin.org/post" WebRequest (WINV24,M1) } WebRequest (WINV24,M1)
Обратите внимание, что строка с текстом является допустимой в формате JSON, то есть в ней открываются и закрываются квадратные скобки, значения разделяются запятыми и соблюдается правило "ключ:значение» (key:value). Давайте посмотрим на массив байтов, который генерируется функцией StringToCharArray. Обратите внимание, что он выводит размер строки и массива, но они разные. Массив байтов на одну позицию больше, чем строка. Также обратите внимание, что в списке значений последним значением является "0", где оно должно быть равно 125, что является символом "}". Итак, чтобы решить эту проблему, мы удалим последнюю позицию массива с помощью ArrayRemove().
int OnInit() { //--- Defining variables string method = "POST"; // HTTP verb in string (GET, POST, etc...) string url = "https://httpbin.org/post"; // Destination URL string headers = "Content-Type: application/json";// Request header int timeout = 5000; // Maximum waiting time 5 seconds char data[]; // Data we will send (body) array of type char char result[]; // Data received as an array of type char string result_headers; // String with response headers //--- Tratando body string body = "{\"key1\":\"value1\",\"key2\":\"value2\"}"; StringToCharArray(body,data,0,WHOLE_ARRAY,CP_UTF8); ArrayRemove(data,ArraySize(data)-1); Print("Body: ",body); Print("Body Size: ",StringLen(body)); ArrayPrint(data); Print("Array Size: ",ArraySize(data)); //--- Calling the function and getting the status_code int status_code = WebRequest(method,url,headers,timeout,data,result,result_headers); //--- Print the data Print("Status code: ",status_code); Print("Response: ",CharArrayToString(result)); // We use CharArrayToString to display the response in string form. //--- return(INIT_SUCCEEDED); }
WebRequest (WINV24,M1) Body: {"key1":"value1","key2":"value2"} WebRequest (WINV24,M1) Body Size: 33 WebRequest (WINV24,M1) 123 34 107 101 121 49 34 58 34 118 97 108 117 101 49 34 44 34 107 101 121 50 34 58 34 118 97 108 117 101 50 34 125 WebRequest (WINV24,M1) Array Size: 33 WebRequest (WINV24,M1) Status code: 200 WebRequest (WINV24,M1) Resposta: { WebRequest (WINV24,M1) "args": {}, WebRequest (WINV24,M1) "data": "{\"key1\":\"value1\",\"key2\":\"value2\"}", WebRequest (WINV24,M1) "files": {}, WebRequest (WINV24,M1) "form": {}, WebRequest (WINV24,M1) "headers": { WebRequest (WINV24,M1) "Accept": "*/*", WebRequest (WINV24,M1) "Accept-Encoding": "gzip, deflate", WebRequest (WINV24,M1) "Accept-Language": "pt,en;q=0.5", WebRequest (WINV24,M1) "Content-Length": "33", WebRequest (WINV24,M1) "Content-Type": "application/json", WebRequest (WINV24,M1) "Host": "httpbin.org", WebRequest (WINV24,M1) "User-Agent": "MetaTrader 5 Terminal/5.4476 (Windows NT 11.0.22631; x64)", WebRequest (WINV24,M1) "X-Amzn-Trace-Id": "Root=1-66d9c017-5985f48331dba63439d8192d" WebRequest (WINV24,M1) }, WebRequest (WINV24,M1) "json": { WebRequest (WINV24,M1) "key1": "value1", WebRequest (WINV24,M1) "key2": "value2" WebRequest (WINV24,M1) }, WebRequest (WINV24,M1) "origin": "200.103.20.126", WebRequest (WINV24,M1) "url": "https://httpbin.org/post" WebRequest (WINV24,M1) } WebRequest (WINV24,M1)
Теперь размер строки и массива выровнен, и сервер верно определил содержимое как допустимый формат JSON. Это может быть указано в возвращаемом ответе, где сервер возвращает JSON, отправленный в полях "json" и "data". После некоторой настройки мы смогли выполнить простой HTTP POST-запрос, корректно отправив данные. Однако использование функции WebRequest не является тривиальным; оно требует хорошего понимания того, каким образом работает протокол и структуры, которыми мы манипулируем. Часто даже небольшие недостатки могут усложнить работу, как мы видели при корректировке кода для получения корректного ответа. Цель библиотеки Connexus как раз и состоит в том, чтобы упростить этот процесс, позволяя конечному пользователю не иметь дело с этими низшими и более абстрактными уровнями программирования, избегая сложных проблем, подобных той, с которой мы сталкиваемся сейчас, делая использование функции WebRequest более доступным и эффективным.
Заключение
В настоящей статье мы подробно рассмотрели использование функции WebRequest в MetaTrader 5, которая является необходимым инструментом для разработчиков, стремящихся расширить возможности своих советников (EAs) за счет взаимодействия с внешними серверами и API. Мы использовали сервис httpbin.org в качестве практического примера для выполнения запросов GET и POST, отправки и получения данных в формате JSON и понимания ответов сервера. Это введение - только начало пути системной интеграции через HTTP, обеспечивающей основу для гораздо более сложных проектов в будущем.
Путешествие только начинается. Давайте вместе превратим функцию WebRequest в упрощенный, мощный и доступный инструмент, который упростит разработку советников и откроет двери для новых возможностей автоматизации и интеграции в MetaTrader 5.
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/15795
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.





- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте, инженер joaopedrodev!
В любом случае, большое спасибо за эту очень интересную статью.
Но есть одна небольшая проблема. Дело в том, что когда я пытаюсь протестировать в реальных условиях код, который вы предоставили, а именно функцию "WebRequest" с методом POST, то запрос приходит без проблем на мой сервер. Только вот данные, переданные в параметрах (
"{\"key1\":\"value1\",\"key2\":\"value2\"}"
), они не поступают на сервер. Возможно ли у вас есть идея, чтобы решить это? Спасибо
Здравствуйте, инженер joaopedrodev!
В любом случае, большое спасибо за эту очень интересную статью.
Но есть одна небольшая проблема. Дело в том, что когда я пытаюсь протестировать в реальных условиях код, который вы предоставили, а именно функцию "WebRequest" с методом POST, то запрос приходит без проблем на мой сервер. Только вот данные, передаваемые в параметрах (
), они не поступают на сервер. Возможно ли у вас есть идея, чтобы решить это? Спасибо
Привет @J M
Убедитесь, что вы отправляете эти данные в теле запроса, так что сервер будет правильно получать данные, которые вы хотите отправить. Я также прошу вас использовать последнюю версию библиотеки, которая прилагается в последней статье Connexus Observer (часть 8): Добавление наблюдателя запросов
Но дело не в этом, а в том, что нам нужен символ в обзоре рынка, который мог бы грузить котировки из внешнего источника (SQL, например).
Я для этой цели создал пользовательский символ и сервис, который в фоновом режиме занимается обновлением его истории посредством функций CustomRatesUpdate (через WebRequest) и CustomTicksAdd (через вебсокет).
Через советник это громоздко и требует подключения к левому брокеру.
Через советник действительно громоздко. Используйте сервис. Подключение к "левому" брокеру не требуется, получайте котировки сразу от того провайдера, где планируете торговать.
Так что свободное использование MT5 пока под вопросом, а WebRequest() - утопия.
Я использую МТ5 свободно, никаких вопросов не возникает. WebRequest хорошо справляется с нечастым обновлением истории и отправкой торговых запросов. Для обновления данных в реальном времени используйте вебсокеты.