Добро пожаловать на пятый урок моего курса по MQL4.
Программа, которую Вы пишите на MQL4 (или на любых других языках) выполняется сверху вниз (я имею ввиду откомплированный файл). Оператор за оператором.
Оператор - это строчка кода, которая говорит компьютеру что-либо сделать.
Например:
Код:
Print("Hello World");
return 0;
Принцип выполнение кода сверху вниз имеет исключения - это циклы и условия.
Программа, которую Вы пишите, может, как человек, принимать решения в ответ на изменение обстоятельств. В таких случаях управление перепрыгивает из одной части программы в другую её часть.
Операторы, которые вызывают такие прыжки называются Операторами Контроля (контроллерами).
Контроллеры состоят из циклов и условий.
Циклы
Циклы заставляют раздел программы выполнятся определённое число раз.
Такое повторение продолжается пока какое-то условие явлется истинным (true) и прекращается как только условие становится ложным (false).
Когда цикл завершается контроль переходит следующему за циклом оператору.
В MQL4 существует два вида циклов:
1 - цикл for
Цикл for считается самым простым циклом, поскольку все его параметры собраны в одном месте.
Цикл for выполняет определённый раздел кода фиксированное число раз.
Например:
Код:
int j;
for(j=0; j<15; j++)
Print(j);
Оператор состоит из ключевого слова for, за этим следуют круглые скобки, в которых указаны 3 выражения, разделённые точками с запятыми:
for(j=0; j<15; j++)
Эти три выражения - это: выражение инициализации, выражение проверки и выражение инкремента.
j = 0 - выражение инициализации
j < 15 - выражение проверки
j++ - выражение инкремента
Тело цикла - это код, который будет выполняться:
Print(j); - тело цикла.
В нашем примере тело цикла выполняется 15 раз.
Замечание: сразу после выражения for(...;...;...) точка с запятой НЕ ставится, т.к. это выражение + идущее после него тело цикла считаются единым оператором.
Кстати, в этом заключается очень распространённая ошибка - оператор ; (просто точка с запятой) называется пустым оператором (он не говорит компьютеру что-либо делать), поэтому цикл for(...;...;...); имеет пустое тело. В основном это не то, чего мы хотим.
Выражение инициализации
Выражение инициализации выполняется только один раз - когда цикл запускается. И его задача - снабдить переменную цикла начальным значением (в нашем случае - нулём).
Вы можете объявить переменную цикла вне самого цикла, как в нашем примере:
Код:
int j;
for(j=0; j<15; j++)
Код:
for(int j=0; j<15; j++)
В цикл for можно вставить больше одного выражения инициализации, разделив их запятой:
Код:
int i;
int j;
for(i=0 ,j=0;i<15;i++)
Print(i);
Выражение проверки
Выражение проверки - это выражение, которое построено на операциях сравнения и логических операциях (см. пред. урок).
Проверка истинности выражения происходит после каждого прохождения цикла. Цикл продолжается, если выражение истинно, цикл завершается, если выражение ложно.
В нашем примере тело цикла будет продолжать печатать i ( Print(i); ), пока условие j<15 верно. j пробежит значения 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14, затем j станет = 15 и цикл остановится. Контроль перейдёт оператору, следующему за циклом.
Выражение инкремента
Выражение инкремента только так называется. Его задача - изменять переменную цикла. В нашем случае оно увеличивает j на 1.
Например, в следующем примере распечатаются числа 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1:
Код:
int i;
for(i=15;i>0,i<;i--)
Print(i);

Схема 1. Цикл for.
Как и в выражении инициализации, в выражении инкремента можно использовать более одного выражения, разделив их запятой:
Код:
int i;
int j;
for(i=0 ,j=0;i<15,i<;i++,j++)
Print(i);
Тело цикла
Во всех предыдущих примерах в качестве тела цикла мы использовали толко один оператор. В большенстве случаев этого недостаточно.
В тело цикла можно записывать много операторов, если их все взять в фигурные скобки:
Код:
for(int i=1;i<=15;i++)
{
Print(i);
PlaySound("alert.wav");
}
Не забывайте ставить точку с запятой в конце каждого оператора.
Оператор Break
Если при выполнении цикла for (или цикла while, или оператора switch) встречается оператор break;, то цикл терминируется, а контроль переходит оператору, следующему за циклом. PS: break - это ключевое слово.
Например:
Код:
for(int i=0;i<15;i++)
{
if((i==10)
break;
Print(i);
}
Оператор Continue
Оператор break; останавливает цикл, а оператор continue; переводит цикл на следующий шаг, игнорируя оставшиеся операторы тела цикла.
Например:
Код:
for(int i=0;i<15; i++)
{
if(i==10) continue;
Print(i)
}
Важно!
Часть или даже все управляющие выражения цикла for можно опускать.
Например:
Код:
for(;;)
Мы Вам представим цикл while прямо сейчас:
2 - цикл while
Цикл for обычно используется, когда Вы знаете, сколько раз цикл должен быть пройден. А что делать, если это не так?
Для этого есть цикл while.
В цикле while, как и в цыкле for есть выражение проверки, но в нём нет выражений инициализации и инкремента.
Пример:
Код:
int i=0;
while(i<15)
{
Print(i);
i++;
}
- Переменная цикла была объявлена и проинициализирована ДО цикла. В отличии от цикла for, внутри скобок этого делать нельзя.
- Формально i++ НЕ является выражением инкремента, но нам нужно чтобы что-то в цикле менялось, чтобы мы когда-нибудь из него выбрались.
Как же приведённый пример работает?
Оператор while содержит только выражение проверки, и он его проверяет после каждого прохождения цикла. Если оно истинно, цикл продолжится. Если оно ложно, цикл завершится и контроль перейдёт оператору, следующему за циклом.
В приведённом примере цикл будет выполняться пока i не станет равным 16. Как только это произойдёт, проверка условия i<15 вернёт false, и цикл завершится.

Схема 2. Цикл while.
Я уже говорил, что цикл while похож на цикл for. Вот их сходства:
1. В обоих можно использовать операторы break; и continue; .
2. В обоих тело цикла может быть одиночным или составным. Во вотром случае операторы тела цикла нужно брать в фигурные скобки.
3. Аналогом for(;;) является while(true).