Знакомство с языком MQL5 (Часть 28): Освоение API и функции WebRequest в языке MQL5 (II)
Введение
И снова приветствуем вас в Части 28 серии "Знакомство с языком MQL5"! В предыдущей статье мы рассмотрели концепцию API, обсудили основные параметры функции WebRequest и поговорили о том, как использовать ее для подключения к внешним серверам. Этот урок заложил основу для понимания того, как данные передаются между MetaTrader 5 и другими платформами.
Как я всегда говорю: "В программировании ты хорош настолько, насколько хороши проекты, над которыми ты работал". И это прекрасно передает суть этой части.
Как обычно, мы будем использовать проектный подход, чтобы сделать процесс обучения более практичным и увлекательным. В этой статье вы получите полное представление о том, как работает URL. Хотя это было кратко объяснено в предыдущей части, теперь мы рассмотрим это гораздо глубже. Каждый компонент URL будет разбит на простые и понятные части, включая протокол, домен, путь и запрос. Мы создадим скрипт на языке MQL5 для нашего простого проекта, который использует API внешних сервисов для получения ценовых данных в реальном времени. Кроме того, вы научитесь парсить JSON-ответы и извлекать из них определенную информацию с помощью языка MQL5, что поможет вам минимизировать разрыв между необработанными данными API и полезными торговыми инсайтами.
Знакомство с URL
В последней статье я привел краткое объяснение URL, но в этой статье я предоставлю подробный разбор их компонентов, особенно в контексте работы с API.
Хотя URL-адреса, используемые различными платформами, различаются, они обычно имеют похожий порядок составления. Например, у API Telegram базовый URL следующий:
https://api.telegram.orgУ API Binance базовый URL такой:
https://api.binance.comЭти URL-адреса указывают на сервер, к которому вы подключаетесь. Структура сопоставима, несмотря на различия в платформах: протокол, домен и путь, ведущий к желаемому ресурсу или функции.
Компоненты URL
Компонент – это просто часть или раздел чего-то большего. Компонентом называется каждая из нескольких составляющих частей чего-либо. Аналогичным образом, URL состоит из различных компонентов, каждый из которых выполняет свою функцию, помогая вашей программе находить данные на сервере и обращаться к ним.
Эти части, которые вместе составляют полный адрес, называются компонентами URL. Эти компоненты сообщают вашей программе информацию – от общего расположения до конкретного ресурса, который вы хотите получить. URL подобен автомобилю, который может выглядеть как единое целое, но состоит из различных частей, каждая из которых выполняет свою функцию. Хотя он выглядит как единый длинный адрес, на самом деле он состоит из нескольких частей, каждая из которых имеет отличительную функцию.
Когда эти части объединяются, они направляют вашу программу к точному серверному ресурсу, к которому вы хотите получить доступ. Одни компоненты указывают на конкретную службу или функцию, которую вы хотите вызвать, другие помогают в определении сервера, к которому вы хотите подключиться, а третьи содержат дополнительную информацию, которая сообщает серверу подробности о том, что вы ищете.
Работая вместе, компоненты URL помогают вашей программе эффективно и точно находить и получать информацию в интернете.
Каждый компонент имеет свое особое назначение и работает в связке с другими. Благодаря этим компонентам ваша программа будет точно знать, куда обращаться и какую информацию запрашивать у сервера.
Основные компоненты URL:
- Протокол
- Домен
- Путь
- Строка запроса
Протокол
Теперь, когда мы знаем, что такое URL, и что он обозначает, следующим шагом будет описание каждого компонента по отдельности. Протокол является первой частью любого URL. Эта часть дает вашему браузеру или приложению MQL5 указания о том, как подключиться к серверу. Протокол, если сказать просто, задает указания для потока данных между вашим компьютером и сервером, к которому вы хотите подключиться.
Пример:
https://api.binance.comВ данном случае используется протокол https. Это дает вашей программе указание использовать защищенный протокол передачи гипертекста. Работа с конфиденциальными данными, такими как торговая информация или данные учетной записи, будет безопаснее, поскольку HTTPS шифрует передаваемые и получаемые данные. HTTP и HTTPS отличаются тем, что HTTP не шифрует данные. Он просто передает текстовые данные. Это быстрее, но в итоге менее безопасно. Современные API, такие как Binance, должны использовать https, поскольку они работают с конфиденциальными и финансовыми данными.
Аналогия:
Представьте, что у вас есть важное сообщение, которое нужно передать кому-то. Вы будете использовать обычную почту или безопасную службу доставки? Каждый метод имеет свои собственные стандарты безопасности. Аналогичным образом, протокол определяет, как ваша программа взаимодействует с сервером.
Когда URL начинается с https, это похоже на выбор безопасной службы доставки, которая защищает от перехвата сообщений. Когда URL начинается с http, это похоже на отправку незащищенного письма по традиционной почте. Протокол https необходим для Binance и большинства современных API, поскольку он гарантирует безопасность данных, передаваемых между вашей программой и сервером.
Домен
Домен идет после протокола (https). Домен указывает вашей программе, к какому серверу подключаться для получения необходимых данных. Это можно сравнить с названием структуры, которая содержит данные. Чтобы правильно донести ваше письмо, нужен точный номер дома, даже если вы знакомы с улицей или городом.
Примеры:
https://api.binance.com https://api.coingecko.com
Домен идет после протокола, который указывает вашей программе, что вы хотите подключиться к безопасному серверу. Домен функционирует по аналогии с адресом желаемого сервера.
Домен (api.binance.com) направляет вашу программу на соответствующий сервер, в то время как протокол обеспечивает безопасное соединение. Они служат краеугольным камнем вашего API-запроса, обеспечивая, что программа безопасно дойдет до своего назначенного места.
То же самое справедливо и для api.coingecko.com. Домен – это адрес сервера, а протокол https гарантирует безопасное соединение. Это помогает предотвратить путаницу между данными, которые вы отправляете или запрашиваете с одного сервера, и данными с другого сервера.
Путь
Путь – это следующая часть URL, следующая за протоколом и доменом. Путь указывает вашей программе, к какой конкретной функции сервера или ресурсу вы хотите получить доступ. Путь указывает на точное место или сервис на сервере, в то время как домен указывает вашей программе на соответствующий сервер.
Пример:
https://api.binance.com/api/v3/ticker/priceЗдесь путь – это /api/v3/ticker/price. Этот путь указывает вашей программе на функцию, которая предоставляет самую последнюю цену криптовалютного символа. Без пути у сервера не было бы информации о том, к какой информации или функции вы хотите получить доступ.
Можно рассматривать путь как этаж и номер комнаты в здании, а домен – как само здание. Путь указывает точный этаж и комнату, где находится информация, в то время как домен (например, api.binance.com) указывает, в какое здание нужно прийти.
Еще одна аналогия – это путь к файлу на вашем компьютере:
C:\Users\Israel\Documents\CryptoData\prices.xlsx
Это путь к определенному документу на вашем компьютере, который включает точный адрес, по которому вы должны проследовать. Это означает, что вам нужно открыть несколько папок, чтобы получить доступ к файлу.
API и веб-сайты часто используют разные маршруты (пути) для разных целей. Каждый путь связан с определенной службой или набором данных, например, с получением самых последних цен, исторических свечных данных или информации об аккаунте. У большинства API имеется страница документации с перечнем всех доступных путей, а также объяснением функций каждого пути и необходимых параметров. Такие рекомендации дают понимание того, как правильно подавать запросы и получать необходимые данные.
Давайте воспользуемся этим путем из API Binance: /api/v3/ticker/price. Это можно сравнить с тем, как вы просматриваете файлы на своем компьютере, пытаясь найти определенный файл.
- Сначала вы входите в папку api.
- Внутри нее вы переходите в папку v3, которая может представлять версию API.
- Затем вы открываете папку ticker, которая содержит файлы или функции, связанные с криптовалютными тикерами.
- Наконец, вы достигаете сущности price, которая является точным файлом или ресурсом, предоставляющим вам актуальную цену символа.
Аналогичным образом, когда ваша программа достигает этого пути через домен api.binance.com, она поэтапно проходит по структуре сервера, чтобы получить точную функцию или информацию, которую вы запросили. По этой причине каждый сегмент пути имеет значение. Ваша программа может оказаться не в том месте или получить ошибку, если какой-либо компонент будет пропущен или написан неправильно.
Строка запроса
Мы описали путь как аналог папки на сервере, где хранятся цены. Путь сам по себе может предоставить все содержимое этой папки, но вы можете использовать его для запроса данных из нее. Вы можете точнее указать, какие именно данные вам нужны, с помощью строки запроса.
Это можно сравнить с ситуацией, когда у вас на компьютере есть папка с разными файлами, и вместо того, чтобы самостоятельно искать конкретный файл, вы используете строку запроса, чтобы указать, какой файл компьютер должен найти для вас.
Пример:
https://api.binance.com/api/v3/ticker/price?symbol=BTCUSDThttps://api.binance.com/api/v3/ticker/price?symbol=BTCUSDT – это URL. Мы можем разбить его на составные части. Протокол https:// дает вашему приложению указание установить безопасное соединение с сервером, чтобы все передаваемые и получаемые данные были зашифрованы. Домен api.binance.com указывает вашей программе, куда отправить запрос, и является адресом сервера, к которому вы хотите подключиться. Часть /api/v3/ticker/price нашего URL указывает серверу на конкретную функцию, которая предоставляет самую последнюю цену криптовалюты.
Строка запроса всегда начинается с "?", и это больше похоже на то, что вы сообщаете серверу о наличии у вас дополнительных инструкции, которые вы дадите после добавления пути. В этом примере мы могли бы просто перейти к запросу цен после добавления пути, но чтобы сделать наш запрос конкретнее, мы добавили знак вопроса, который указывает на то, что мы хотим включить дополнительные инструкции. После этого мы добавили инструкцию, указав symbol=BTCUSDT, что означает, что мы хотим получить цену именно для BTCUSDT.
Этот формат можно использовать для запроса различной информации, такой как текущая цена или свечные данные за указанный временной интервал. Следует помнить, что форматы строки запроса у различных платформ схожи, но некоторые ключевые слова чаще всего отличаются. Поэтому важно ознакомиться с документацией API платформы, чтобы использовать весь ее потенциал.
Получение текущих цен с помощью API в языке MQL5
Исходя из приведенного мной описания компонентов URL в предыдущем разделе, вы должны хорошо понимать, как протокол, домен, путь и строка запроса взаимодействуют друг с другом. Вы уже понимаете основы коммуникации языка MQL5 с внешними серверами, поскольку в предыдущей статье мы рассмотрели, как использовать метод WebRequest и его параметры. В этом разделе будет использоваться API Binance для получения текущей цены любого актива. Концепция проста. После того, как вы создадите соответствующий URL и отправите свой запрос с помощью WebRequest, сервер предоставит самую последнюю цену в формате JSON. Поскольку ответ будет в формате JSON, мы разработаем код на MQL5 для поиска по возвращаемому тексту и извлечения только необходимого значения.
Чтобы осуществить это, мы создадим небольшой скрипт на языке MQL5, который будет получать текущие цены различных активов. После того, как пользователь введет символ криптовалюты, скрипт автоматически подключится к Binance и вернет самую последнюю цену. Этот метод универсален, поскольку вы сможете запросить цену BTCUSDT, ETHUSDT, BNBUSDT или любой другой торговой пары, поддерживаемой Binance.
Общая структура этой процедуры будет одинаковой для любого внешнего API. Единственными отличиями будут путь и строка запроса, которые использует каждая платформа. Поэтому важно изучить документацию API платформы, к которой вы хотите подключиться, чтобы знать, как правильно подготовить свои запросы.
Если вы хотите обмениваться веб-запросами с внешним сервером, важно также разрешить внешние запросы в вашем терминале MetaTrader 5. Это строго необходимо, поскольку по соображениям безопасности MetaTrader 5 автоматически блокирует все внешние запросы. Откройте вкладку "Сервис", затем "Настройки" или просто нажмите Ctrl + O для открытия настроек. Затем выберите "Разрешить WebRequest для следующих URL" на вкладке "Советники". Наконец, после добавления https://api.binance.com в список разрешенных URL нажмите "OK". Как только вы завершите эту настройку, ваш скрипт сможет отправлять запросы к Binance без каких-либо проблем.

Первым шагом перед отправкой любых запросов является объявление всех переменных, требуемых для функции WebRequest. В этих переменных хранятся URL, заголовки, данные для отправки, буфер ответа и код результата. Объявив эти переменные в начале, мы обеспечим организованность скрипта и сможем убедиться, что все готово, прежде чем отправлять реальный запрос на сервер Binance.
Пример:
const string method = "GET"; const string url = "https://api.binance.com/api/v3/ticker/price"; const string headers = ""; int timeout = 5000; char data[]; char result[]; string result_headers; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- WebRequest(method,url,headers,timeout,data,result,result_headers); Print(CharArrayToString(result)); }
Вывод:

Результат:
[
{"symbol":"ETHBTC","price":"0.03313000"},
{"symbol":"LTCBTC","price":"0.00107100"},
{"symbol":"BNBBTC","price":"0.00974800"},
{"symbol":"NEOBTC","price":"0.00005020"},
{"symbol":"QTUMETH","price":"0.00055350"},
{"symbol":"EOSETH","price":"0.00030670"},
{"symbol":"SNTETH","price":"0.00001700"},
{"symbol":"BNTETH","price":"0.00020260"},
{"symbol":"BCCBTC","price":"0.00000000"},
{"symbol":"GASBTC","price":"0.00002500"},
{"symbol":"BNBETH","price":"0.29410000"},
{"symbol":"BTCUSDT","price":"95566.46000000"},
{"symbol":"E
Пояснение:
const string method = "GET";
Для того, чтобы сообщить серверу, что вы хотите получить данные, используется метод GET.
const string url = "https://api.binance.com/api/v3/ticker/price";
Затем мы определили строковую переменную для хранения URL. URL включает в себя протокол (https://), домен (api.binance.com) и путь (/api/v3/ticker/price). Единственным компонентом URL, который не был указан, была строка запроса, и это связано с тем, что дополнительная команда не требовалась. Это будет важно при заполнении параметров для функции WebRequest.
const string headers = ""; int timeout = 5000; char data[];
В этом блоке кода мы объявили три переменные. Сначала идет заголовок в строке headers, который обычно содержит дополнительную информацию, которую вы хотите отправить на сервер вместе с вашим запросом, но в нашем случае заголовок можно оставить пустым. Единственной причиной включения заголовка было то, что он будет необходим при передаче ввода в функцию WebRequest.
Затем в переменной timeout указывается количество миллисекунд, в течение которых запрос должен ожидать получения ответа от сервера. Если ответ не будет получен в указанный срок, запрос будет отменен. Наконец, массив data используется для включения дополнительной информации, которая будет отправлена с запросом на сервер.
char result[]; string result_headers;
После завершения WebRequest сервер сохраняет тело ответа в массиве result. В нем хранятся необработанные данные, которые обычно представлены в виде байтов, которые сервер возвращает, и которые затем могут быть преобразованы в читаемый текст для дальнейшего использования. Ответом на этот эндпоинт Binance будет строка JSON с различными ценами для каждой торговой пары. Все заголовки HTTP-ответа, которые отправляет сервер, включая метаданные об ответе, такие как тип контента, длина контента, информация о сервере и любые дополнительные инструкции или сведения, которые сервер предоставляет вместе с данными, сохраняются в строке result_headers.
int web_request = WebRequest(method,url,headers,timeout,data,result,result_headers); Print(CharArrayToString(result));
Функция WebRequest использовалась для отправки GET-запроса на сервер. Мы вводим все необходимые параметры функции: метод, URL, заголовки, таймаут, результат и заголовки результата. Функция будет ожидать ответа от сервера. После успешного ответа он будет сохранен в переменной result.
Поскольку массивы символов не могут быть прочитаны напрямую через логи советников, необработанные байты в массиве result преобразуются после получения ответа в читаемую строку, чтобы их можно было легко записывать и интерпретировать. Строка, получаемая в результате этого запроса к Binance, имеет формат JSON и содержит текущие цены нескольких торговых пар.
Сначала мы должны изучить конкретную организацию структуры JSON, чтобы иметь возможность настроить фильтрацию по ней и получать необходимую информацию. JSON-структура может быть организована по-разному на разных платформах или API: различаются структура массивов, вложенность и имена полей. Помимо предотвращения ошибок, которые могут возникнуть, если мы ожидаем структуру, которая не соответствует реальному ответу, точное знание структуры позволит нам с большей точностью извлекать необходимую информацию, такую как определенные торговые пары или значения цен. Результат, когда мы его выводим, будет представлять собой просто повторяющийся паттерн цен для различных символов, что упрощает поиск и извлечение именно той информации, которая нам нужна.
Пример:
[
{"symbol":"ETHBTC","price":"0.03313000"},
{"symbol":"LTCBTC","price":"0.00107100"},
{"symbol":"BNBBTC","price":"0.00974800"},
{"symbol":"NEOBTC","price":"0.00005020"},
{"symbol":"QTUMETH","price":"0.00055350"},
Каждая цена имеет одинаковый формат {"symbol":"INSTRUMENT","price":""}, где INSTRUMENT представляет торговую пару, за которой следует цена. Эта стандартная структура позволяет нам внимательно исследовать JSON-ответ и извлекать соответствующие цены и символы.
Пример:const string method = "GET"; const string url = "https://api.binance.com/api/v3/ticker/price"; const string headers = ""; int timeout = 5000; char data[]; char result[]; string result_headers; string instrument = "BTCUSDT"; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- int web_request = WebRequest(method,url,headers,timeout,data,result,result_headers); // Print(CharArrayToString(result)); string pattern = "{\"symbol\":\"" + instrument + "\",\"price\":\""; string jason = CharArrayToString(result); int pattern_lenght = StringFind(jason,pattern); pattern_lenght += StringLen(pattern); int end = StringFind(jason,"\"",pattern_lenght + 1); string coin_price = StringSubstr(jason,pattern_lenght,end - pattern_lenght); Print(instrument,": ", coin_price); }
Вывод:

Пояснение:
string instrument = "BTCUSDT"; string pattern = "{\"symbol\":\"" + instrument + "\",\"price\":\"";
Мы определили переменную для хранения символа инструмента, с которым хотим работать. Во второй строчке мы объединяем переменную instrument и текст для создания паттерна для поиска по JSON. Чтобы компьютер нашел корректную цену, необходимо воссоздать ту же структуру, которая содержится в JSON-ответе от Binance. Конечный результат соответствует тому, что возвращает API, объединяя переменную с фиксированной частью JSON.
Чтобы начать и закончить строку (string) на языке MQL5, нужно использовать кавычки. Компилятор предположит, что строка завершена, если вы введете действительный символ кавычки внутри строки. Чтобы экранировать кавычку и не допустить этого, используйте обратный слэш. Таким образом, символ " будет давать языку MQL5 указание обрабатывать кавычку как обычный символ в строке, а не как конец строки.
Это необходимо, поскольку название инструмента, цена и символ окружены кавычками в самом формате JSON. Без экранирования они не позволят приложению правильно сопоставить формат JSON, получаемый от API, и паттерн либо сломается, либо приведет к синтаксической ошибке.
string jason = CharArrayToString(result);
В этой строчке создается читаемая строка из необработанного ответа WebRequest, которая сохраняется в новой переменной. Вы не можете искать или извлекать информацию напрямую через метод WebRequest, так как он возвращает свои данные в виде массива символов. Преобразовав массив в строку, вы сможете работать с данными, используя стандартные строковые операции, такие как поиск, нахождение подстроки и сравнение. Этот преобразованный текст будет храниться только в новой переменной, чтобы с ним можно было работать на последующих этапах.
int pattern_lenght = StringFind(jason,pattern);
Эта строчка находит начало паттерна во всей строке JSON, и мы будем использовать это место, чтобы определить, сколько символов предшествует началу паттерна. После анализа всего JSON-ответа функция возвращает индекс первого символа в паттерне. Например, когда вы ищете "BEGINNERS" в тексте "MQL5 FOR BEGINNERS", функция возвращает 9. Индекс в MQL5 – это просто числовое положение символа в строке. Этот возвращаемый индекс точно указывает, где начинается паттерн в JSON, чтобы мы могли впоследствии получить корректное значение цены.
pattern_lenght += StringLen(pattern);Эта строчка увеличивает стартовую позицию путем прибавления длины паттерна. Метод StringLen используется для подсчета количества символов в паттерне после того, как мы нашли индекс первого символа паттерна внутри JSON. Мы не хотим включать текст паттерна в окончательную выборку; таким образом, этот шаг имеет решающее значение. Добавляя длину паттерна к начальному индексу, мы продвигаем указатель, пока он в точности не достигнет первого символа ценового значения. Это позволяет исключить все, что идет до паттерна, но включить сам паттерн. Также это гарантирует, что цена – это единственное, что мы извлекаем.
int end = StringFind(jason,"\"",pattern_lenght + 1);
Функция заработает, как только мы установим точное начало ценового значения, а также длину паттерна. Следующий шаг – определить окончание этого ценового значения. Для достижения этой цели мы воспользуемся функцией StringFind с тремя параметрами. JSON-текст, сохраненный в Jason, является основной строкой, которую мы хотим просмотреть, и он является первым параметром.
Второй параметр – это символ, который мы ищем (в данном случае это кавычка, потому что значение цены в JSON всегда окружено кавычками). Третий параметр указывает функции StringFind, с какого места начинать поиск. Передавая pattern_lenght + 1, мы даем функции указание начинать поиск сразу после окончания паттерна, что как раз соответствует тому месту, где начинаются цифры цены.
Это важно, поскольку в такой структуре JSON, как:
{"symbol":"ETHBTC","price":"0.03313000"},
{"symbol":"LTCBTC","price":"0.00107100"},
часть {"symbol":"ETHBTC","price":" представляет собой паттерн (строку pattern). За ней следует цена (price), а завершающая кавычка появляется сразу после цены. Чтобы получить эту финальную фразу, мы начинаем наш поиск сразу после окончания паттерна. Это позволит нам с точностью извлекать цену, получив точный индекс ее окончания.
string coin_price = StringSubstr(jason,pattern_lenght ,end - pattern_lenght); Print(instrument,": ", coin_price);
Как только мы определим, где начинается паттерн и где появляется закрывающая кавычка, включается этот раздел кода, который отвечает за получение фактического значения цены.
Здесь лишь извлекается цена с помощью функции StringSubstr, которая используется для обрезки указанного участка строки. В качестве первого параметра, который указывает функции, какой текст мы хотим вырезать, используется полный JSON-текст, содержащийся в переменной jason. Поскольку pattern_lenght уже был продвинут до точки, указывающей на первый символ цены, второй аргумент указывает на точное местоположение (индекс, хранящийся в pattern_length), где начинается значение цены.
Третий параметр сообщает функции, сколько символов нужно извлечь. Чтобы вычислить эту длину, мы вычитаем начальную точку из конечной точки – end - pattern_length. Это дает нам точное количество символов, которые составляют ценовое значение, без кавычек или иных посторонних символов.
Когда извлечение будет завершено, результат сохранится в coin_price и будет содержать только чистую цену, например, 0.03313000. Наконец, оператор Print упрощает просмотр результата в читаемом виде, отображая как название инструмента, так и извлеченную цену в логе. Теперь, чтобы найти цену любого актива на платформе, вам нужно лишь ввести символ. Система адаптируемая и может работать с любым активом на ваш выбор, поскольку по той же логике будут производиться автоматический поиск соответствующего паттерна в JSON-тексте, извлечение цены и ее отображение.
Важно помнить, что на каждом сайте есть ограничение на количество запросов, которые вы можете отправить за определенный промежуток времени. Из-за этого использование этого метода непосредственно в функции OnTick советника не рекомендуется, так как это может быстро привести к превышению лимита запросов. Чтобы гарантировать соблюдение лимита платформы на частоту запросов, вы должны включить возможность добавлять временные задержки между запросами, если это действительно необходимо.
Для лучшего понимания мы попробуем получить цены, используя другую платформу; давайте на этот раз воспользуемся CoinGecko. Кроме того, CoinGecko предлагает публичный API, который предоставляет данные в формате JSON для многих криптовалют. Процедура в основном такая же: вы отправляете HTTP-запрос к эндпоинту API, получаете ответ в формате JSON, а затем извлекаете цену интересующего вас актива.
Пример:
const string method = "GET"; //const string url = "https://api.binance.com/api/v3/ticker/price"; const string url = "https://api.coingecko.com/api/v3/simple/price?ids=bitcoin,ethereum&vs_currencies=usd"; const string headers = ""; int timeout = 5000; char data[]; char result[]; string result_headers; string instrument = "ETHUSDT"; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- int web_request = WebRequest(method,url,headers,timeout,data,result,result_headers); Print(CharArrayToString(result)); }
Вывод:

{"bitcoin":{"usd":95566},"ethereum":{"usd":3169.35}}}Пояснение:
Мы заменяем URL на тот, который используется для запроса текущей цены с помощью API CoinGecko. На этот раз мы добавили строку запроса, которая требуется CoinGecko для указания, по каким монетам и в каких валютах мы хотим получить цены. Базовый эндпоинт и параметры отделяются знаком вопроса (?) в начале строки запроса. В данном случае vs_currencies=usd указывает, что мы хотим цены в долларах США, а ?ids=bitcoin,ethereum дает CoinGecko указание, для каких криптовалют мы хотим получить значения. Мы используем амперсанд & для разделения параметров, когда их несколько, как в этом примере. Для каждого аргумента используется формат ключ=значение.
Поэтому общее указание заключается в том, чтобы использовать символ & для разделения нескольких пар ключ-значение в строке запроса и использовать символ ?, чтобы начать строку запроса после базового URL. Это позволяет серверу точно узнать, какую информацию вы запрашиваете. После вывода результата вы увидите, что JSON-паттерн для CoinGecko отличается от такового для Binance. Это подчеркивает важность предварительного изучения ответа и понимания JSON-структуры. Поскольку каждая платформа форматирует свой ответ по-разному, знание точного паттерна позволяет вам с точностью и без ошибок извлекать необходимые данные, такие как цена конкретной монеты.
Чтобы разрешить выполнение WebRequest, вы должны добавить URL-адрес API CoinGecko в настройки MetaTrader 5. Добавление API в список разрешенных URL гарантирует, что ваш скрипт или советник сможет успешно подключиться к CoinGecko и получить данные, так как MetaTrader 5 по умолчанию блокирует обращения к внешним URL.
https://api.coingecko.comПример:
const string method = "GET"; //const string url = "https://api.binance.com/api/v3/ticker/price"; const string url = "https://api.coingecko.com/api/v3/simple/price?ids=bitcoin,ethereum&vs_currencies=usd"; const string headers = ""; int timeout = 5000; char data[]; char result[]; string result_headers; string instrument = "bitcoin"; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- int web_request = WebRequest(method,url,headers,timeout,data,result,result_headers); // Print(CharArrayToString(result)); string pattern = "{\"" + instrument + "\":{\"usd\":"; string jason = CharArrayToString(result); int pattern_lenght = StringFind(jason,pattern); pattern_lenght += StringLen(pattern); int end = StringFind(jason,"}",pattern_lenght + 1); string coin_price = StringSubstr(jason,pattern_lenght,end - pattern_lenght); Print(instrument,": ", coin_price); }
Вывод:

Пояснение:
Было внесено только два изменения. Во-первых, мы убедились, что URL соответствует API платформы. И наконец, поскольку формат JSON для разных платформ может отличаться, мы убедились, что он такой же, как у СoinGecko.
Заключение
В этой статье вы узнали, как использовать функцию WebRequest языка MQL5 и API внешних платформ для получения ценовых данных в реальном времени. Кроме того, теперь у вас есть полное понимание протокола, домена, пути и запроса в URL-адресе. И наконец, вы узнали, как извлекать определенную информацию из JSON-ответов и классифицировать ее, преобразуя необработанные данные от API в полезные знания.
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/20280
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.
Трейдинг с экономическим календарем MQL5 (Часть 7): Подготовка к тестированию стратегий с анализом новостей
Разработка инструментария для анализа движения цен (Часть 20): Внешние библиотеки (IV) — Correlation Pathfinder
Нейросети в трейдинге: Потоковые модели с остаточной высокочастотной адаптацией (Окончание)
Интеграция AI-модели в существующую торговую стратегию на MQL5
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования