Главная Контакты

КОТИРОВКИ

Котировки от Forex4You

ОПРОС

Как Вы торгуете на форекс?

Самостоятельно анализирую рынок и торгую
Пользуюсь индикаторами/советниками
Пользуюсь/копирую советы других трейдеров
Использую роботы-советники

Официальный представитель Forex4you - форекс для Вас

Программирование MQL4: Урок 5 – Циклы и Условия (часть 1)

26-04-2014, 18:16 | Раздел: publ, Курс программирования MQL4 | Просмотров: 1365

Добро пожаловать на пятый урок моего курса по MQL4.

Программа, которую Вы пишите на MQL4 (или на любых других языках) выполняется сверху вниз (я имею ввиду откомпилированный файл). Оператор за оператором.
Оператор – это строчка кода, которая говорит компьютеру что-либо сделать.
Например:

Print("Hello World");
return 0;

Точка с запятой является очень важной частью оператора, но обычно очень легко забывается, потому является причиной 90% всех ощибок.

Принцип выполнение кода сверху вниз имеет исключения – это циклы и условия.
Программа, которую Вы пишите, может, как человек, принимать решения в ответ на изменение обстоятельств. В таких случаях управление перепрыгивает из одной части программы в другую её часть.
Операторы, которые вызывают такие прыжки называются Операторами Контроля (контроллерами).
Контроллеры состоят из циклов и условий.

Циклы

Циклы заставляют раздел программы выполнятся определённое число раз.
Такое повторение продолжается пока какое-то условие явлется истинным (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);

Выражение инкремента выполняется самым последним в списке шагов цикла.

post-798-0-37484000-1346244944

Схема 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");
}

В этом коде в теле цикла содержится два оператора. Программа будет выполнять 1й оператор, а за ним 2й при каждом прохождении цикла.
Не забывайте ставить точку с запятой в конце каждого оператора.

Оператор Break

Если при выполнении цикла for (или цикла while, или оператора switch) встречается оператор break;, то цикл терминируется, а контроль переходит оператору, следующему за циклом. PS: break – это ключевое слово.

Например:

for(int i=0;i<15;i++)
{
if((i==10)
break;
Print(i);
}

В этом примере цикл будет нормально выполняться пока i не достигнет значения 10. Как только это произойдёт, оператор break; остановит цикл. В результате, на экран распечатаются: 0,1,2,3,4,5,6,7,8,9.

Оператор Continue

Оператор break; останавливает цикл, а оператор continue; переводит цикл на следующий шаг, игнорируя оставшиеся операторы тела цикла.
Например:

for(int i=0;i<15; i++)
{
if(i==10) continue;
Print(i)
}

В этом примере цикл будет нормально выполняться пока i не достигнет значения 10. Как только это произойдёт, оператор continue; переведёт цикл на следующий шаг, и i=10 НЕ распечатается. В результате, на экран распечатаются: 0,1,2,3,4,5,6,7,8,9,11,12,13,14.

Важно!

Часть или даже все управляющие выражения цикла for можно опускать.
Например:

for(;;)

Этот цикл равносилен циклу while, в котором выражение проверки всегда истинно.

Мы Вам представим цикл 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).


Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь. Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.


Форекс каталогФорекс каталог Форекс рейтинг