Содержание статьи: (кликните, чтобы перейти к соответствующей части статьи):


 

Здравствуйте, дорогие друзья. В материале этой статьи мы будем рассматривать циклы в MQL4 под названием for.

 

Описание работы цикла for в MQL4

Несколькими статьями ранее, мы с Вами изучали функции OnTick() и OnTimer(), которые сами по себе являются циклическими.

OnTick() выполняется циклично по тикам, а OnTimer() выполняется циклически по заданному нами таймеру. Но, эти циклы работают на протяжении всей «жизни» нашего советника. Пока советник работает, OnTick() так и будет работать, с OnTimer() аналогичная ситуация.

Бывают такие моменты, когда внутри этих функций необходимо сделать небольшие циклы, которые будут выполняться внутри себя, внутри маленького кода и какое-то небольшое время. Как это сделать?

Есть в MQL4, так называемый цикл for():

for ()
{
}

где в круглых скобках () мы пишем входящие значения, а в фигурных скобках {} мы будем прописывать то, что нам нужно выполнить в рамках этого цикла.

Что такое входящие значения? Это то, как долго должен выполняться цикл, по каким-то условиям. То есть, то, когда цикл должен начаться и когда он должен закончиться.

Прописывается это все следующим образом.

for (int i=0; i<10; i++)
{
}

 

Сначала мы объявляем целочисленную переменную int «i» и присваиваем ей значение ноль int i = 0. Далее, мы прописываем условие, при котором будет выполняться данный цикл: пока «i» меньше 10, то есть, i < 10.

Следующий параметр, i++. Иначе его еще можно записать так i=i+1, то есть, новое значение «i»  равно старое значение «i» плюс один. Но, в программировании очень распространена краткая запись этого процесса как (i++). Этим параметром мы увеличиваем «i» на 1.

Что мы имеем? Объявлена переменная «i», ей присвоено первоначальное значение ноль, дальше, мы спрашиваем: «i<10?». Да, меньше, потому что ноль меньше десяти. Соответственно, цикл запускается, к «i» прибавляется единица (i=1).

После, компьютер идет дальше, выполняет все, что прописано в теле for{}, и вновь возвращается к условию нашего цикла и спрашивает: «i<10?». Да меньше, так как единица меньше десяти. For будет работать дальше, к «i» снова прибавляется единица (i=2).

Далее, компьютер вновь переходит к телу for {}, выполняет все, что там прописано, возвращается к циклу и спрашивает: «i<10?». Да, меньше, так как два меньше десяти. Запускается новая итерация цикла, к «i» прибавляется единица, (i=3) и так далее, пока «i» не станет равно десяти.

Когда это произойдет, for выполнится, вернется к условию и спросит: «i<10?». Нет, i уже не меньше, а равно 10. После чего, цикл просто закончит свою работу.

 

Работа с циклом for на практике

Давайте посмотрим, как это все работает на практике в коде MQL4.

Пишем следующий программный код:

#property copyright "Copyright (с) Антон SanGReal Invest"
#property link      "https://sgr-tradeinvest.ru"
#property version   "1.00"
#property strict

int y = 0;

void OnTick()
  {
  for (int i=0; i<10; i++)
   {
   y=y+1;
   }
  Comment(y); 
  }

 

Что у нас должно получиться? В «шапке» мы объявили целочисленную глобальную переменную «y», которая равна нулю.

 

Далее, в блоке OnTick() у нас запускается цикл, при первом прохождении цикла переменная «y» получит значение 1. Потом for() пойдет работать второй раз, при котором переменная «y» получит значение 2 и т.д.

То есть, «y» у нас будет получать новые значения, пока выполняется цикл. Как for() выполнится, так Comment() выведет «y», с конечным значением, которое в итоге у нас получится в течение 10 итераций цикла.

Давайте проверим. Компилируем код, открываем наш терминал, переносим советник на график, нажимаем «OK».

Циклы в MQL4 - for()

 

На графике в левом верхнем углу мы видим меняющиеся числа (10, 20, 30, 40 и т.д.).

Что у нас с Вами получилось? Блок OnTick() у нас работает циклично с приходом каждого нового тика. Как новый тик пришел, наш цикл for() выполнился 10 раз, поэтому итого выведенное значение «y» на экран у нас получилось изначально 10.

Пришел второй тик, OnTick() снова запустилась, запустился и наш цикл for(). После того, как он вновь выполнился 10 раз, «y» стала уже равна 20 и так далее. В общем, с приходом каждого тика у нас будет запускаться цикл, который будет выполняться 10 итераций и, получается, что «y» на каждом тике будет увеличиваться на 10.

Если у Вас появились какие-то вопросы по материалу данной статьи, задавайте их в комментариях ниже. Я Вам обязательно отвечу. Да и вообще, просто оставляйте там Вашу обратную связь, я буду очень рад.

 

Также, делитесь данной статьей со своими знакомыми в социальных сетях, возможно, этот материал кому-то будет очень полезен.

 

Вот, собственно, и вся работа циклов. Она достаточно простая и понятная. Далее, в реальной практике программирования советников Вам станет все еще понятнее и как само собой разумеющееся.

 

Переходите к следующей статье. Где мы с Вами рассмотрим то, без чего точно не обойдется ни один Форекс советник — операторы условия в MQL4 «если, иначе»: if else.

 

Благодарю за внимание.
 
Другие статьи по теме Программирование на MQL4 Вы можете просмотреть в данном содержании практических уроков по MQL.

 

Понравился материал статьи?
Избранные закладкиДобавьте эту статью в закладки Вашего браузера, чтобы вернуться к ней еще раз. Для этого, прямо сейчас нажмите на клавиатуре комбинацию клавиш Ctrl+D

 

С уважением, Антон.

Обучающий Форекс портал SanGReal Invest
 


 


Вам это может быть интересно. Другие статьи нашего обучающего портала:


  • Антон — SanGReal Invest (Сангрил Инвест)

    Если у Вас появились вопросы по статье, пишите их здесь. Я Вам обязательно отвечу.
    Также, буду рад Вашей обратной связи

  • Абдул

    Корректно ли закрывать часть позиции через while? Если, например, брокер реквотит на каждом шагу, ошибки 136, 138.

    • SanGReal Invest: Антон

      Абдул, да корректно…конечно нужно смотреть правильность MQL4 кода. Но, лично я использую while для проверки реквоты брокера, ну и соответственно, это все также используется и при закрытии части позиции. Все это мы рассмотрим в ближайшие 1-3 месяца в статьях на блоге. С конкретными примерами и кодами MQL4

      • Абдул

        Спасибо.