Урок 5. Основы программирования MQL4. Часть 3 | Automated Trading Systems
На этом уроке мы закончим с основами программирования. Если конкретнее — то разберемся с условиями и циклами — что это такое, зачем нужны, как их использовать в своих программах.

Урок 5. Основы программирования MQL4. Часть 3

Ну что, мы уже знаем как работать с переменными и внешними функциями. Осталось разобраться с условиями и циклами – что это такое и зачем они нужны. Приступим.
Условия – неотъемлемая часть любой программы, в которой есть хоть маломальский анализ данных. Например: если две скользящие средние пересеклись – открыть сделку, если индикатор в зоне перекупленности – продавать, если на часах больше 19:00 – не торговать, и так далее. Все эти «если» записываются в виде условий.
Теперь разберем более конкретно. Условие записывается в виде:

if(/*условие*/)
{
   ; //что сделать, если условие верно
}
else
{
   ; //что сделать, если условие неверно
}

В буквальном смысле, if переводится как «если», else – «в противном случае». То есть условие читается: «Если условие ‘такое-то’ верно, то выполним код, находящийся в первых фигурных скобках. В противном случае (если условие неверно), выполним код, находящийся во вторых фигурных скобках.
Теперь пример. Создадим скрипт. Введем две переменные, которые пользователь задает во входных параметрах при запуске программы. Назовем их first и second и присвоим им тип int. А далее создадим условие как показано ниже в коде готового скрипта:

#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property show_inputs

input int first=0;
input int second=0;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   if(first > second)
     {
      Alert("Первый параметр больше, чем второй");
     }
   else
     {
      Alert("Первый параметр не больше, чем второй");
     }
  }
//+------------------------------------------------------------------+

Теперь, если при запуске скрипта вы введете первый параметр больший, чем второй – сработает первая ситуация и этот код — Alert(«Первый параметр больше, чем второй»);
Если первый параметр будет меньше либо равен второму, сработает вторая ситуация и код Alert(«Первый параметр не больше, чем второй»);
Усложним наш скрипт, разбив одно условие на два и отказавшись от else:

void OnStart()
  {
   if(first > second)
     {
      Alert("Первый параметр больше, чем второй");
      return;
     }
   if(first < second)
     {
      Alert("Первый параметр меньше, чем второй");
      return;
     }
   Alert("Первый параметр равен второму");
  }

Как видите, мы также добавили return’ы внутрь условий. Это значит, что если одно из условий окажется верным, то появится строка Алерта, после чего скрипт отключится. Например мы ввели первое значение большее, чем второе. Тогда первое условие окажется верным, сработает код:

Alert("Первый параметр больше, чем второй");
return;

return отключит скрипт и больше ничего выполняться не будет. То же самое будет, если ввести первое значение меньшее, только на этот раз сработает уже второе условие. Если же мы введем равные значения у первого и второго параметра, но ни одно условие не окажется верным и сработает лишь код, который идет уже после условий, а именно:

Alert("Первый параметр равен второму");

Надеюсь, что в целом с условиями теперь все понятно. Также важно знать, что условия внутри скобок после if можно объединять логическими операторами. Для этого используются операторы && (подразумевается как «И»), а также || (подразумевается как «ИЛИ»).
Например:

if(first > second && first < 100) //то есть нужно, чтобы переменная first была больше, чем second, а также меньше, чем 100; 
if(first < second || first < 0) // здесь требуется, чтобы либо переменная first была меньше, чем second, 
                                // либо меньше нуля, тогда условие будет выполнено. 

Также все можно усложнить еще больше, если внутри условия сделать целую группу условий, расставляя скобки, например:

 if(first > second && (first < 100 || second > 0))

Это условие значит, что во первых first должен быть больше, чем second, а во вторых, либо first должен быть меньше ста, либо second должен быть больше нуля. Это простейший пример, как можно использовать логические операции и при этом группировать различные условия внутри одного if’а. На деле в реальной программе можно использовать сколько угодно таких условий, главное не запутаться в такой логике. Иногда лучше все-таки разбить код на несколько условий, написав всего на пару строчек больше, но при этом значительно повысив читабельность кода.
На этом мы заканчиваем с условиями и переходим к циклам.

Как нетрудно догадаться, циклы служат для того, чтобы какую-то часть кода можно было повторять столько раз, сколько это потребуется.
Пример простого цикла внутри скрипта, в котором, как и в примере выше, есть две входные переменные – first и second:

void OnStart()
  {
   int f=first;
   int count=0;
   while(f < second)
     {
      count++;
      Alert("Цикл повторился уже ",count," раз");
      f++;
     }
  }

Сначала создаем локальную переменную f, которой присваиваем значение переменной first, которое мы ввели при старте скрипта. Также создаем локальную переменную count и присваиваем ей значение ноль – это будет наш счетчик, который покажет, сколько раз цикл «прогонял» код. Теперь переходим к самому циклу – while. Внутри скобок указывается условие, которое если верно – то выполнится код, идущий в фигурных скобках. Если это условие будет верно всегда – то и код будет выполняться всегда, что приведет к зависанию терминала, поэтому обращайте особое внимание на правильность условия внутри скобок после while. В нашем случае мы поставили задачу таким образом: «пока переменная f будет меньше, чем переменная second – выполнять код в скобках. Как только она станет равна или больше – выйти из цикла и идти дальше по коду программы». Внутри фигурных скобок мы увеличиваем наш счетчик на единицу, показываем с помощью Alert’а наш счетчик пользователю, после чего увеличиваем переменную f на единицу. Код внутри скобок кончился, снова проверяется условие. Если переменная f по прежнему меньше, чем second – повторяем снова те же действия. И так до тех пор, пока f не увеличится настолько, что станет наконец равна переменной second. Тогда условие цикла станет невыполненным и цикл прекратит свою работу, перейдя к дальнейшему коду программы (в нашей программе дальнейшего кода нет, а значит скрипт просто завершает свою работу).
Условия внутри скобок после while можно группировать абсолютно также, как и в случае с if’ами, поэтому повторяться не будем.
Теперь немного более сложный тип цикла, но и зачастую более удобный. Это цикл, с уже встроенным счетчиком. Он используется, когда программист точно знает, сколько итераций ему нужно (т.е. сколько раз цикл должен пройтись по кругу). Пример:

void OnStart()
  {
   for(int i=0;i < 10;i++)
     {
      Alert("Цикл повторился уже ",i+1," раз");
     }
  }

Расшифруем эту запись: for(int i=0;i<10;i++) for – «название» цикла. В скобках на первом месте идет объявление переменной (или можно несколько переменных объявить если нужно), которая будет работать только внутри цикла. На втором месте идет условие, которое работает также, как и в случае с while – если оно выполнено, цикл идет на новую итерацию, если нет – работа цикла прекращается. На третьем месте – работа с переменными, которая происходит каждый раз после того, как итерация окончена и весь код внутри цикла выполнен. В нашем случае переменная i увеличивается на единицу. Конкретно в нашем примере происходит следующее: при входе в цикл объявляется переменная i и ей присваивается ноль. Проверяется, меньше ли переменная i, чем десять. Меньше, значит выполняем код внутри цикла. Весь наш код – это Алерт, выполнили его и итерация окончена, i увеличивается на единицу. Проверяем снова, меньше ли переменная i, чем десять? Она сейчас равна единице, так что да, меньше. Выполняем код внутри цикла снова, а также потом снова увеличиваем i на единицу. Теперь i равна двойке, это снова меньше десяти, снова выполняем код внутри цикла.. И так далее до того момента, когда i будет равна девятке, итерация будет окончена, i увеличится на единицу, произойдет проверка, меньше ли она чем десять? Не меньше, ведь она уже равна десяти. Значит выходим из цикла.

Теперь что касается команд, которые можно использовать внутри циклов:

  • break – допустим, мы хотим выйти из цикла раньше времени, например если будет выполнено какое-то условие по ходу его работы. Это не проблема, если выполнить команду break; работа цикла будет тут же прекращена и продолжится выполнение кода программы.
  • continue – если нужно прервать текущую итерацию, не доходя до ее конца, и начать следующую – можно воспользоваться командой continue;. При ее срабатывании, текущая итерация будет сразу же прекращена, независимо от того, сколько кода внутри цикла еще осталось невыполненным, цикл начнет итерацию с первой строчки своего тела.

 

На этом мы заканчиваем разбираться с основами программирования. Это был очень краткий и сжатый мини-курс, поэтому я все же очень рекомендую поизучать основы того же C++, особенно если вы чувствуете, что «плаваете». Освоив же основы C++, который кстати очень похож на MQL4, вы наберетесь опыта в программировании, не будете «тупить» на элементарных вещах и сможете все свое внимание уделить непосредственно изучению нюансов программирования советников.
В любом случае, это только лишь совет, и только вам решать как поступить. Желаю вам удачи на этом нелегком пути и поскорее суметь самостоятельно разработать свой первый советник!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *