Главное меню
Язык MQL4 - первое знакомство
Циклы
Допустим Вы решили посчитать среднее значение максимальных цен всех баров на графике. Для этого Вы поочерёдно добавляете каждый элемент к какой-то переменной, например, так:
01. | double AveragePrice = 0.0;
02. | AveragePrice += High[0];
03. | AveragePrice += High[1];
04. | AveragePrice += High[2];
05. | AveragePrice += High[3];
06. | AveragePrice += High[4]; // ... и так далее
07. | AveragePrice /= Bars;
Скажу Вам одно: это может сработать, но это - очень глупо. Для таких целей существуют циклы. Обратите внимание, что все операции абсолютно одинаковы, лишь индекс изменяется от 0 до значения переменной Bars-1. Было бы намного удобнее каким-то образом определить счётчик и с его помошью обращаться к элементам массива. Вот как можно решить эту же задачу, используя циклы:
01. | double AveragePrice = 0.0;
02. | for(int a = 0; a < Bars; a++)
03. | {
04. | AveragePrice += High[a];
05. | }
Рассмотрим каждую строку:
01. | double AveragePrice = 0.0; // тут всё и так понятно
02. | // а это самый настоящий цикл.
03. | for(int a = 0; a < Bars; a++)
Как видите, цикл начинается с ключевого слова for. (Существуют и другие типы циклов, например, while, но их мы пока не будем рассматривать.) Далее следуют кавычки, в которых размещаются последовательно через точку с запятой счётчик, условие выполнения цикла и операция увеличения счётчика. В общем случае это может быть представлено в виде:
01. | for(объявление счетчика; условие выполнения цикла;
02. | изменение счетчика)
03. | {
04. | // между фигурными скобками размещается исходный код,
05. | // который будет повторяться
06. | }
Рассмотрим каждую стадию объявления цикла более детально.
Объявление счетчика: используется тип int для счётчика. Название переменной-счётчика не имеет никакого значения. Также обязательно производите инициализацию начального значения, например, нулём.
Условие выполнения цикла: тут всё очень просто. Здесь определяется условие, и если оно истинно, то цикл продолжается. Иначе - цикл заканчивается. Например, в нашем случае:
01. | a < Bars
Видно, что пока переменная-счётчик а будет меньше, чем переменная Bars, то цикл будет выполняться дальше. Допустим, переменная Bars=10, тогда с каждым проходом по телу цикла переменная а будет увеличиваться на 1, пока не достигнет 10, после чего цикл прекратится.
Изменение счетчика: если мы не будем изменять счётчик каким-то образом (в нашем случае не будем его увеличивать), то цикл никогда не закончится, так как условие никогда не будет выполнено. Чтобы лучше понять суть цикла, я написал код, который будет выполнять цикл с поясняющими комментариями:
01. | // этот цикл:
02. | // double AveragePrice=0.0;
03. | //
04. | // for(int a=0;a>
05. | // {
06. | // AveragePrice+=High[a];
07. | // }
08. | //
09. | // будет будет выполнен следующим образом:
10. | //
11. |
12. | double AveragePrice=0.0;
13. | int a=0;
14. |
15. | AveragePrice+=High[a];
16. | a++; // теперь а=1, предположим, что Bars=3.
17. | // Тогда, так как Bars больше чем а,
18. | // то цикл продолжается
19.
20. | AveragePrice+=High[a];
21. | a++; // а=2
22. |
23. | AveragePrice+=High[a];
24. | а++; // a=3
25. |
26. | // но так как условие уже не выполняется, то цикл
27. | // прекращается, ведь теперь и а, и Bars равны трём.
Теперь Вы должны понимать, как работает цикл. Но нужно знать ещё несколько моментов.
Условие выполнения цикла может быть другим. Например, таким:
01. | a>10 // цикл выполняется, пока a больше 10
02. | a!=10 // цикл выполняется, пока а не равно 10
03. | a==20 // пока а равно 20
04. | a>=2 // пока а больше или равно 2
05. | a<=30 // пока а меньше или равно 30
Изменение счётчика может производиться и по-другому. Например, Вам необязательно увеличивать его каждый раз на 1. Вы можете поступить иначе:
01. | a-- // счётчик будет каждый раз уменьшаться на 1
02. | a += 2 // счётчик будет каждый раз увеличиваться на 2
Кроме того, Вы можете разместить изменение счётчика внутри тела цикла. Например, так:
01. | for(int a=0; a
03. | AveragePrice+=High[a];
04. |
05. | a++; // счётчик изменяется внутри тела цикла
06. | }
Аналогично - необязательно объявлять переменную-счётчик в цикле. Можно сделать иначе:
01. | int a = 0;
02. |
03. | for(;a < Bars;)
04. | {
05. | AveragePrice += High[a];
06. |
07. | a++; // счётчик изменяется внутри тела цикла
08. | }
Если тело цикла содержит всего один оператор, например, вот так:
01. | for(int a = 0; a < Bars; a++)
02. | {
03. | AveragePrice += High[a];
04. | }
то фигурные скобки писать необязательно:
01. | for(int a = 0; a < Bars; a++)
02. | AveragePrice += High[a];
Пока это - всё, что касается циклов. Есть и другие виды циклов, но о них мы поговорим на следующем уроке. Сейчас Вы должны уяснить, когда нужно использовать циклы, и запомнить их синтаксис. Попробуйте самостоятельно написать несколько циклов, которые бы выводили значения счётчика функцией MessageBox(). Попробуйте написать бесконечный цикл и посмотрите, что произойдет, если его запустить.