Всем привет!
Не так давно в уроке про открытые позиции трейдеров мы брали данные с сайта, находящегося в сети. То, что мы делали тогда на уроке, можно сделать еще одним способом, не используя dll, следовательно, без зависимости от операционной системы.
Все, что вам понадобится, — это терминал Metatrader 4 и mql редактор кода. А также знания о стандартном mql4 методе WebRequest, с которым мы с вами сегодня и будем знакомиться.
Метод WebRequest
Метод WebRequest может быть вызван двумя способами. Первый подойдет для отправки простых запросов на сервер со стандартными http заголовками. Выглядит он так:
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. Это пригодится в различных сложных ситуациях, когда, например, вам нужно отправить на сервер файлы.
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.
В случае браузера заголовок может выглядеть вот так, например:
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-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