MQL4: изучаем метод WebRequest

Всем привет!

Не так давно в уроке про открытые позиции трейдеров мы брали данные с сайта, находящегося в сети. То, что мы делали тогда на уроке, можно сделать еще одним способом, не используя dll, следовательно, без зависимости от операционной системы.

Все, что вам понадобится, — это терминал Metatrader 4 и mql редактор кода. А также знания о стандартном mql4 методе WebRequest, с которым мы с вами сегодня и будем знакомиться.

Метод WebRequest

Метод WebRequest может быть вызван двумя способами. Первый подойдет для отправки простых запросов на сервер со стандартными http заголовками. Выглядит он так:

int  WebRequest(
const string      method,           // метод HTTP
const string      url,              // url-адрес
const string      cookie,           // cookie
const string      referer,          // referer
int               timeout,          // таймаут
const char        &data[],          // массив тела HTTP-сообщения
int               data_size,        // размер массива data[] в байтах
char              &result[],        // массив с данными ответа сервера
string            &result_headers   // заголовки ответа сервера
);

Второй вариант позволяет самому заполнять массив headers. Это пригодится в различных сложных ситуациях, когда, например, вам нужно отправить на сервер файлы.

int  WebRequest(
const string      method,           // метод HTTP
const string      url,              // url-адрес
const string      headers,          // заголовки
int               timeout,          // таймаут
const char        &data[],          // массив тела HTTP-сообщения
char              &result[],        // массив с данными ответа сервера
string            &result_headers   // заголовки ответа сервера
);

method может быть любым методом HTTP. В видео-уроке мы рассмотрим использование метода GET;

url — адрес сервера, к которому вы обращаетесь;

cookie — соответственно, куки, например, для авторизации на сервере;

referer — значение заголовка Referer HTTP-запроса;

timeout — таймаут в миллисекундах, то есть время ожидания ответа от сервера;

headers — ваши кастомные заголовки. При использовании первого варианта вызова метода автоматически по умолчанию запрос будет отправлен с заголовком: Content-Type: application/x-www-form-urlencoded.

В случае браузера заголовок может выглядеть вот так, например:

GET /tutorials/ HTTP/1.1
Host: tlap.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120
Pragma: no-cache
Cache-Control: no-cache

В нашем случае для отправки файла нужен такой заголовок:

Content-Type: multipart/form-data; boundary=—-WebKitFormBoundaryePkpFF7tjBAqx29L
Content-Disposition: form-data; name=»uploadedfile»; filename=»hello.tlap» Content-Type: application/x-object

Но отправка файлов довольно редкая задача, гораздо чаще нам из mql4 программы нужно просто получить какие-либо данные.

Сам же метод WebRequest возвращает int, то есть число. Это число — не что иное, как код ответа от сервера, либо же -1 в случае ошибки выполнения метода. Код ответа — это трехзначное число. В настоящее время есть пять классов кодов:

1xx: Informational — запрос получен и понят, а обработка продолжается;
2xx: Success — запрос был успешно получен, понят и обработан;
3xx: Redirection — для выполнения запроса должны быть предприняты дальнейшие действия;
4xx: Client Error — запрос имеет плохой синтаксис или не может быть выполнен;
5xx: Server Error — сервер не в состоянии выполнить допустимый запрос.

Вот пара самых распространенных примеров:

200 OK — Успешный запрос. Если клиентом были запрошены какие-либо данные, то они находятся в заголовке или теле сообщения. Такой код приходит в случае успеха;

301 Moved Permanently. Запрошенный документ был окончательно перенесен на новый URL, указанный в поле Location заголовка. Этот код означает, что страница была перенесена и теперь доступна по другому адресу;

400 Bad Request. Запрос не понят сервером из-за наличия синтаксической ошибки. Этот код означает, что во время запроса произошла опечатка;

401 Unauthorized. Запрос требует идентификации пользователя. Этот код означает, что сначала нужно авторизоваться — ввести логин и пароль от сайта;

403 Forbidden. Сервер понял запрос, но он отказывается его выполнять из-за каких-то ограничений в доступе;

404 Not Found. Сервер понял запрос, но не нашёл соответствующего ресурса по указанному URL. Чаще всего этот код указывает на то, что страница была просто удалена;

500 Internal Server Error. Любая внутренняя ошибка сервера, которая не входит в рамки остальных ошибок класса 5xx.

На самом деле, конечно, кодов намного больше. В каждом классе их обычно от десятка до нескольких десятков, но все приводить тут нет смысла, тем более, что эту информацию можно самостоятельно найти в сети. Я привел лишь самые распространенные коды ответа.

Не забудьте добавить используемый адрес сайта в список разрешенных url в терминале, иначе ничего работать не будет. Для этого нажмите Ctrl+O или перейдите сервис->настройки->вкладка советники.

Настройки должны быть примерно такими, как изображено на рисунке сверху.

В своей работе стоит учитывать, что метод WebRequest дожидается ответа от сервера, и пока ответ не пришел, дальнейшее выполнение скрипта невозможно. Поэтому в индикаторе этот метод использовать нельзя. Кроме того, учитывайте то, что для выполнения метода нужно время, и в течение этого времени скрипт или советник ничего делать больше не будет. Особенно эту специфику стоит учитывать, если вы отправляете тяжелые запросы или получаете тяжелые ответы, например, объемные файлы с какими-либо данными.

Заключение

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

Возможности данного метода действительно безграничны, особенно если вы не знаете других языков программирования. С его помощью можно решать и вполне не трейдерские задачи, например, смастерить автокликер или эмулировать любую другую полезную работу в сети, приносящую деньги. Забавная идея, но если поднапрячься, вы можете написать свой автосерфер, который будет за вас зарабатывать на кликах в то время, пока ваши основные боты сливают депозит, — мелочь, а приятно.

Скачать исходник скрипта из урока

Тема на форуме

С уважением, Дмитрий аkа Silentspec
Tlap.com

 

Уроки по MQL , , , ,