MQL для чайников, программирование на MQL4, MQL5
23 Фев
Для того чтобы написать программу на языке MQL — необходимо знать как в ней хранятся данные, ведь программа должна их где-то хранить.
Константа в MQL - это составная часть программы; объект, имеющий значение. Понятие «константа» в программе аналогично тому же понятию, используемому в математических уравнениях. Это — неизменная величина.
Встретив в программе 2+2 мы понимаем что происходит сложение двух чисел. Так как их в процессе работы программы изменить нельзя, то они являются константами. Встретив другой пример 2+x уже нельзя сказать однозначно: с чем складывается число (с константой или переменной)? Дело в том, что константам можно присвоить имя и использовать ее не по значению, а по имени. Для присвоения имени константе используется #define.
Например:
#define x 2
2+x
Переменная в MQL — это составная часть программы, имеющая значение и название. Понятие переменной в языке MQL4 аналогично понятию переменной, принятому в математике.
Переменные очень похожи на константы, но их значение можно изменять. Например сложим 2+2 и сохраним значение в переменной:
x=2+2
Так как переменная может изменять свои значения в процессе работы программы, то необходимо указывать ее тип. Иначе компилятор MT4 не будет знать что в ней хранить (число, строку и т.д.). Поэтому при описании переменной указывают ее тип.
В языке MQL4 различают следующие типы данных:
int — целые числа (например: 1).
double — действительные числа (например: 0.1).
bool — значения логического типа (например: true).
string — значения строкового типа (например: «Super Expert»).
color — значения цветового типа (например: White).
datetime — значение даты и времени (например: 01.01.2010 12:00).
Наш пример для сложения чисел приобретет свой окончательный вид:
int x=2+2;
Мы сложили два числа (константы) и поместили результат в переменную x целого типа.
Какие еще операции существуют в языке MQL4?
В языке MQL4 различают следующие виды операций:
• арифметические операции;
• операции присваивания;
• операции отношения;
• логические операции;
19 Фев
Размер каталога в который установлен MetaTrader постоянно растет. Что можно почистить для уменьшения размера?
Эта проблема не только терминала MetaTrader, но и многих других программ. Дело в том, что терминал MT4 сохраняет поступающие котировки валют, журналы работы и другие служебные данные. Объемы современных жестких дисков позволяют хранить эту информацию особо не переживая за ее размер. Но если для Вас размер является критическим, то можно почистить следующие папки:
C:\Program Files\<каталог терминала>\history\*.* — история котировок
C:\Program Files\<каталог терминала>\logs\*.* — журналы работы терминала
C:\Program Files\<каталог терминала>\mailbox\*.* — почтовый ящик
C:\Program Files\<каталог терминала>\deleted\*.* — история открытых и в последствии удаленных графиков
C:\Program Files\<каталог терминала>\experts\logs\*.* — журналы работы экспертов
C:\Program Files\<каталог терминала>\tester\history\*.* — история работы тестера
C:\Program Files\<каталог терминала>\tester\logs\*.* — журналы работы тестера
Для себя я сделал командный файл для очистки этих папок: clear.bat
И один раз в неделю запускаю его. Так как я много пишу советников для Metatrader 4 и разумеется приходится их постоянно тестировать и оптимизировать, соответственно за неделю каталог с установленным у меня терминалом МТ4 вырастает от десятка Мегабайт до одного Гигабайта — на помощь мне и приходит командный файл clear.bat.
15 Фев
В прошлых уроках «Первые шаги по MQL», мы разобрались как работает терминал MetaTrader: что и где находится, как в терминале MT4 запускаются советники. Теперь можно переходить собственно к изучению языка MQL.
Давайте взглянем на типичную программу написанную на MQL4:
//±-----------------------------------------------------------------+
//| Tester.mq4 |
//| Copyright c 2010. |
//| http://mql4you.ru |
//±-----------------------------------------------------------------+
#property copyright "Copyright c 2010."
#property link "http://mql4you.ru"
//±-----------------------------------------------------------------+
int init() {return(0);}
//±-----------------------------------------------------------------+
int deinit() {return(0);}
//±-----------------------------------------------------------------+
int start() {return(0);}
//±-----------------------------------------------------------------+
Как видно из примера, программа представляет собой обычный текст состоящий из ключевых слов. Давайте разберемся что они означают:
Давайте удалим комментарии и посмотрим что получиться:
#property copyright "Copyright c 2010."
#property link "http://mql4you.ru"
int init() {return(0);}
int deinit() {return(0);}
int start() {return(0);}
У нас осталось всего 5 строк. Что же еще можно удалить из программы, написанной на MQL, не нарушая ее работоспособности?
У каждой MQL4 программы можно указать дополнительные специфические параметры #property, которые помогают клиентскому терминалу Metatrader 4 правильно обслуживать программы без необходимости их явного запуска.
(далее…)
9 Фев
Мне поступил интересный ворос: Как установить ордер на закрытии минутного бара?
Первая мысль отлавливать последнюю котировку по времени. Допустим пропускаем все котировки до 59 секунды, а на последней секунде выставляем ордер. Решение кажется простым. Но давайте разберемся так ли это?
Для этого нам надо знать как поступают котировки в терминал Metatrader. Ситуация на рынке форекс постоянно меняется. Но изменения носят не постоянный характер, а скорее скачкообразный. Вы же не сидите и не открываете ордера постоянно. Так же поступают и другие участники рынка форекс.
А если учесть крупных «Игроков», таких как банки, то может показаться вообще хаотичной. То сотни сделок проидут за минуту, а может и не одной. Вы наверное замечали такой эффект на своих графиках. Кстати на минутном графике это прекрасно видно:
Горизонтальная черточка означает что за минуту прошла всего одна сделка. Поэтому поступающие котировки принято называть ТИКами.
Поставщиком тиков для каждого клиентского терминала является сервер, установленный у брокера форекс. А для брокера котировки поставляет вышестоящий брокер, и так далее. Все это связано в единую сеть и поэтому котировки у всех одинаковые.
Возникает закономерный вопрос: Почему тогда у некоторых брокеров forex 5 значные котировки, а у других 4 значные?
Я не знаю точно сколько знаков после запятой используется на самом верхнем уровне, но прекрасно представляю что для уменьшения количества знаков их просто округляют.
Хорошо. А что тогда такое "тиковый объем"? Логично предположить что это величина совершенной сделки, но я вас разочарую. Величина совершенной сделки — это определение объема а, "тиковый объем" это — сколько раз за бар приходили ТИКи. Поэтому и ведутся споры насчет полезности его на рынке Forex.
Теперь мы знаем откуда и как поступают котировки форекс. И первоначальное решение уже не кажется таким простым. Ведь если мы откроем ордер на последней секунде, то нет ни каких гарантий что он откроется по текущей цене. Даже скорее всего он откроется по новой цене (цене открытия нового бара). А можем получить ошибку от сервера брокера форекс о том, что цена изменилась.
Поэтому в ответ я посоветовал сразу использовать цену открытия бара. Точнее первый поступивший ТИК. Ведь деление на бары получается условным. И новый бар может открыться не в 00 секунд.
Теперь мы знаем как поступают котировки. А как тогда работают советники forex в терминале Metatrader 4?
Очень просто. При поступлении нового ТИКа управление передается советнику. Когда советник закончит работу — он возвращает управление терминалу и ожидает пока терминал опять не передаст ему управление. Как же я собирался отлавливать 59 секунд? Ведь за это время котировка может не прийти и советник не получит управление. Здесь тоже нет ничего сложного. Можно зациклить управление в советнике. И тогда он будет работать постоянно, пока его не отключат. Но как я уже писал выше — это безсмысленно. Хотя для решения других задач можно использовать этот метод.
7 Фев
Добрый день, Уважаемые читатели!
Мне поступает много вопросов от людей, которые хотят научиться программировать на языке MQL. И я понял что немного не с того начал вести свой блог «MQL для тебя». Многие читатели не понимают таких простых вещей, которые я использую «на автомате».
Поэтому сегодняшней публикацией я открываю новый раздел: «Первые шаги в MQL».
Для начала давайте познакомимся с торговым терминалом, для которого мы будем писать наши скрипты, советники и т.п. на языке MQL4 — Metatrader 4. Я понимаю, что многие уже его используют. А кто еще не пользуется данной торговой платформой — можете скачать и установить его, например отсюда: Forex4you.
Мы привыкли запускать терминал MT4 через иконку на рабочем столе компьютера. И даже не задумываемся: из чего он состоит? В начале работы с терминалом нам вполне достаточно тех инструментов, что в нем встроены. Но со временем появляется желание испробовать новые индикаторы или советники форекс. Допустим, мы нашли на просторах интернета интересный индикатор. Скачали его. А как быть дальше? Что надо сделать, что бы его можно было установить на график выбранной валютной пары? Вроде бы понятно, что его надо куда-то положить. Но вопрос: "Куда?"
Вот структура папок установленного терминала Metatrader 4:
В основном нас будет интересовать папка experts:
Как видно из рисунка, в папке experts есть еще несколько папок.
(далее…)
3 Фев
Что значит 2010.02.01 17:00 MyExpert GBPUSD,M15: OrderModify error 130
почему обычно эта ошибка возникает?
Очень много подобных вопросов мне приходит. Поэтому публикую таблицу кодов ошибок. Например посмотрев вышеописанную ошибку error 130 становится понятно, что функция OrderModify пытается изменить стоп-лосс или тейк-профит слишком близко к текущей цене.
GetLastError() — функция, возвращающая коды ошибок. Кодовые константы ошибок определены в файле stderror.mqh. Для вывода текстовых сообщений следует использовать функцию ErrorDescription(), определенную в файле stdlib.mqh.
Коды ошибок, возвращаемые торговым сервером или клиентским терминалом:
Значение | Описание |
---|---|
0 | Нет ошибки |
1 | Нет ошибки, но результат неизвестен |
2 | Общая ошибка |
3 | Неправильные параметры |
4 | Торговый сервер занят |
5 | Старая версия клиентского терминала |
6 | Нет связи с торговым сервером |
7 | Недостаточно прав |
8 | Слишком частые запросы |
9 | Недопустимая операция нарушающая функционирование сервера |
64 | Счет заблокирован |
65 | Неправильный номер счета |
128 | Истек срок ожидания совершения сделки |
129 | Неправильная цена |
130 | Неправильные стопы |
131 | Неправильный объем |
132 | Рынок закрыт |
133 | Торговля запрещена |
134 | Недостаточно денег для совершения операции |
135 | Цена изменилась |
136 | Нет цен |
137 | Брокер занят |
138 | Новые цены |
139 | Ордер заблокирован и уже обрабатывается |
140 | Разрешена только покупка |
141 | Слишком много запросов |
145 | Модификация запрещена, так как ордер слишком близок к рынку |
146 | Подсистема торговли занята |
147 | Использование даты истечения ордера запрещено брокером |
148 | Количество открытых и отложенных ордеров достигло предела, установленного брокером. |
Коды ошибок выполнения MQL4 программы:
Значение | Описание |
---|---|
4000 | Нет ошибки |
4001 | Неправильный указатель функции |
4002 | Индекс массива — вне диапазона |
4003 | Нет памяти для стека функций |
4004 | Переполнение стека после рекурсивного вызова |
4005 | На стеке нет памяти для передачи параметров |
4006 | Нет памяти для строкового параметра |
4007 | Нет памяти для временной строки |
4008 | Неинициализированная строка |
4009 | Неинициализированная строка в массиве |
4010 | Нет памяти для строкового массива |
4011 | Слишком длинная строка |
4012 | Остаток от деления на ноль |
4013 | Деление на ноль |
4014 | Неизвестная команда |
4015 | Неправильный переход |
4016 | Неинициализированный массив |
4017 | Вызовы DLL не разрешены |
4018 | Невозможно загрузить библиотеку |
4019 | Невозможно вызвать функцию |
4020 | Вызовы внешних библиотечных функций не разрешены |
4021 | Недостаточно памяти для строки, возвращаемой из функции |
4022 | Система занята |
4050 | Неправильное количество параметров функции |
4051 | Недопустимое значение параметра функции |
4052 | Внутренняя ошибка строковой функции |
4053 | Ошибка массива |
4054 | Неправильное использование массива-таймсерии |
4055 | Ошибка пользовательского индикатора |
4056 | Массивы несовместимы |
4057 | Ошибка обработки глобальныех переменных |
4058 | Глобальная переменная не обнаружена |
4059 | Функция не разрешена в тестовом режиме |
4060 | Функция не подтверждена |
4061 | Ошибка отправки почты |
4062 | Ожидается параметр типа string |
4063 | Ожидается параметр типа integer |
4064 | Ожидается параметр типа double |
4065 | В качестве параметра ожидается массив |
4066 | Запрошенные исторические данные в состоянии обновления |
4067 | Ошибка при выполнении торговой операции |
4099 | Конец файла |
4100 | Ошибка при работе с файлом |
4101 | Неправильное имя файла |
4102 | Слишком много открытых файлов |
4103 | Невозможно открыть файл |
4104 | Несовместимый режим доступа к файлу |
4105 | Ни один ордер не выбран |
4106 | Неизвестный символ |
4107 | Неправильный параметр цены для торговой функции |
4108 | Неверный номер тикета |
4109 | Торговля не разрешена |
4110 | Длинные позиции не разрешены |
4111 | Короткие позиции не разрешены |
4200 | Объект уже существует |
4201 | Запрошено неизвестное свойство объекта |
4202 | Объект не существует |
4203 | Неизвестный тип объекта |
4204 | Нет имени объекта |
4205 | Ошибка координат объекта |
4206 | Не найдено указанное подокно |
4207 | Ошибка при работе с объектом |
1 Фев
Добрый день!
Подскажите как выключить компьютер из MQL? Мой советник выставляет ордер в определенное время и хотелось бы выключать компьютер после этого.
В заголовочном файле WinUser32.mqh описана функция ExitWindowsEx() из системной библиотеки user32.dll. Она предназначена для завершения работы Windows. Эта функция прекрасно работает в старых версиях Windows, но в связи с ужесточившейся безопасностью в современных версиях не все так просто. Поэтому предлагаю воспользоваться другим способом. В Windows есть программа shutdown.exe Она предназначена для завершения работы. Для запуска программ из MQL необходимо импортировать из системной библиотеки kernel32.dll функцию WinExec():
#import "kernel32.dll"
int WinExec(string lpCmdLine,int uCmdShow);
После этого в любом месте советника ее можно будет вызвать:
WinExec("shutdown.exe -s -f",1);
Скачать пример: скрипт Shutdown