Циклы - Forex.Советники форекс.Торговые системы forex.MetaTrader4.MQL4.

Content on this page requires a newer version of Adobe Flash Player.

Get Adobe Flash player

Перейти к содержимому

Главное меню

Циклы

 
<a href="http://instaforex.com/ru/?x=QES">InstaForex</a>
 

Язык 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; a02. | {
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(). Попробуйте написать бесконечный цикл и посмотрите, что произойдет, если его запустить.

Содержание

 
 
Назад к содержимому | Назад к главному меню