MQL4-программирование: торговый робот за один вечер
Шрифт:
Блоки комментариев делаются так:
/* это
блок
комментария */
Все, что между символами /* и */ также компилятором игнорируется.
Циклы
В mql4 существуют циклы for и while. Чаще используется for, но, нередко и while.
for (int i=0; i <100; i++)
{
что-то считаем 100 раз.
}
int i = 0 – объявляем переменную, которая будет работать в пределах данного цикла; i < 100 – цикл прокрутится 100 раз, от 0 до 99; i++ (инкремент) означает, что при каждой прокрутке (итерации)
bool x = false; //присваиваем переменной х типа bool значение false
while(x==false) //пока x равен false. Два символа равно “==” означают сравнение
{
/*
здесь будут выполняться какие-то условия.
Как только x станет true, цикл прекратится.
*/
//например
x = true;//после первого же прохода делаем x равным true
//и цикл прекращается
}
В процессе написания советника мы будем использовать оба этих цикла, и вы без труда с ними разберетесь.
ТЕХНИЧЕСКОЕ ЗАДАНИЕ
Опишем, что и когда должен делать наш будущий советник:
Торговые сигналы будут
формировать два
стандартных индикатора
Envelopes
и
ZigZag
. Эти индикаторы встроены в
MetaTrader
4 и дополнительно скачивать их не нужно. Я выбрал два именно этих индикатора, т. к. их значения вызываются разными способами. Для
Envelopes
– с помощью стандартной функции iEnvelopes, а
ZigZag
вызывается функцией
iCustom
– ее вам необходимо изучить (хотя, это громко сказано), чтобы в дальнейшем вы умели вызывать данные почти
любых не стандартных
индикаторов для
MetaTrader
4.
Составим краткое техническое задание:
1) Если верхний пик индикатора
ZigZag
(далее -
ZZ
) сформировался выше верхней линии индикатора
Envelopes
(с параметром
Shift
= 10, остальные – стандартные), выставляем ордер на продажу фиксированным лотом, определенным в настройках советника.
2) Если нижний
пик
ZZ
сформировался ниже нижней
Envelopes
– сигнал на покупку (т. е. наоборот от
buy
–сигнала).
3) Путем модификации (почему модификации, а не сразу при установке ордера – позже, когда будем писать этот код) советник должен устанавливать у ордеров Стоп-Лосс и Тейк-Профит.
4) Добавить возможность закрывать ордера при касании ценой противоположной линии Envelopes. Эту функцию можно выключать в настройках.
Если вы читаете эту книгу, я надеюсь, на вашем компьютере уже установлен торговый терминал MetaTrader4 и вы умеете открывать демо-счет. Если нет, нужно этот терминал установить, предварительно зарегистрировавшись у любого брокера, поддерживающего работу MetaTrader4.
А теперь, переведите свой терминал на английский язык! Если уж вы решили заняться программированием, привыкайте к английскому, без этого
ПОЛУЧАЕМ ДАННЫЕ ИНДИКАТОРОВ
Открываем свой MetaTrader4 и нажимаем кнопку F4 на клавиатуре, или левой кнопкой мыши здесь:
В открывшемся редакторе кода нажимаем
New
(Создать), затем
Expert
Advisor
(
template
), потом Далее, в поле
Name
после
Experts
\ дописываем
MyFirstEA
– это будет названием вашего первого советника. Получится Experts\MyFirstEA. Поля
Autor
,
link
нам в этом учебном советнике не важны. Нажимаем
кнопку
Далее
.
Появится
окошко
Event Handles of the Expert Advisor.
Здесь ничего отмечать не нужно и просто нажмем Далее. В появившемся окошке
Tester
event
handless
of
the
Expert
Advisor
снова ничего не выбираем и жмем Готово. Получаем рабочую область, в которой скоро родится наш торговый робот.
На изображении в комментариях указано, какие блоки за что отвечают.
Чтобы узнать ценовые значения индикаторов нам нужно объявить глобальные переменные типа double для верхней и нижней линии индикатора Envelopes. Назовем их enveUP и enveDW. Эти названия можно придумывать самим. То же самое надо сделать и для получения ценового значения индикатора ZZ. Назовем эту переменную ZZ. Почему именно глобальные переменные? Для того, чтобы эти значения мы могли вызывать в любом месте программы (т. е. советника). Дело в том, что мы будем вызывать значения индикаторов не на каждом приходящем тике, а один раз на одной свече. Это существенно повысит производительность, т. к. терминалу не нужно будет выполнять одну и ту же операцию на каждом тике. Если мы обернем в фигурные скобки вызов наших индикаторов с записью их значений НЕ в глобальные переменные, то эти значения будут видны только в рамках этих же фигурных скобок. И за пределами их мы получим ошибку. Более подробно постараюсь описать на рисунке ниже.
Перепишите этот код в свой редактор:
//+–+
//| MyFirstEA.mq4 |
//| Copyright 2017, |
//+–+
#property copyright "Copyright 2017"
#property link ""
#property version "1.00"
#property strict
//+–+
double enveUP, enveDW, ZZ;
datetime open;
//+–+
int OnInit
{
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
}
void OnTick
{
if(Open[0] != open)