Операторы

Оператор if - else

Слово if в переводе с английского означает «если», else – «иначе». Это слово «если» преследует программистов, потому что программирование построено на сравнении, если выражение верно то что-то делаем одно, если не верно – делаем другое.

if(выражение) действие1;// если выражение верно… выполняется действие1.
 else действие2; // если выражение не верно… выполняется действие2.

Если выражение в скобках верное, например 2>1 (два больше чем один) то выполняется действие1. И наоборот, если выражение будет записано как 1>2 (один больше чем два), выражение не верно то действие1 пропускается и выполняется оператор после else — действие2.

if(выражение) действие1;// если выражение верно… выполняется действие1.

Часть else можно не использовать. Тогда если выражение не верно действие1 не выполняется а выполняется код следующий далее по ходу программы.

Фигурные скобки объединяют действия, которые нужно выполнить, если их больше одного.

if(выражение) // если выражение верно
 {            // делаем
  Действие1;
  Действие2;
  Действие3;
 }
  else           // если выражение не верно
      {          // делаем
       Действие1;
       Действие2;
       Действие3;
      }

Теперь если выражение в скобках верное например 2>1 то выполняются все действия в фигурных скобках после if, а в фигурных скобках после else пропускается. И наоборот, если выражение будет записано как 1>2, выражение не верно потому операторы в фигурных скобках после if пропускаются и выполняются операторы в фигурных скобках после else.

Оператор-переключатель switch

Значение выражения сравнивается с константами case и выполняется оператор того case константа которого равна значению выражения. Каждый вариант case может быть помечен целой константой, символьной константой или константным выражением. Константное выражение не может включать переменные или вызовы функций. Выражение оператора switch должно быть целого типа.

switch(выражение)
  {
   case константа: операторы
   case константа: операторы
     ...
   default: операторы
  }

Операторы, связанные с default, выполняются, если ни одна из констант в операторах case не равна значению выражения. Вариант default обязательно должен быть последним или вообще может отсутствовать.

switch(X)
  {
   case  1: Print("CASE 1.");
            break;
   case  2: Print("CASE 2.");
            break;
   case  3: Print("CASE 3.");
            break;
   default: Print("Ни один не совпал.");
            break;
  }

В зависимости от значения X получим результат:

  • CASE 1.
  • CASE 2.
  • CASE 3.
  • Ни один не совпал.

Оператор break прекращает выполнение оператора switch и управление передается оператору, следующему за switch. Если оператор switch является вложенным, то break прекращает работу только данного оператора switch и передает управление внешнему оператору.

case вместе с константой это лишь метка и если выполняться операторы некоторого варианта case и нет оператора break то будут выполнятся все последующие операторы других вариантов case до тех пор , пока не встретится оператор break.

string s;
switch(X)
  {
   case  1: s = s + "Жить хорошо";
            break;
   case  2: s = s + "А хорошо жить лучше";
            break;
   case  3: s = "Hello";
   case  4: s = s + " world";
   case  5: s = s + " наше Вам с кисточкой";
            break;
   default: s = "На нет и суда нет";
            break;
  }
Print(s);

В зависимости от значения X получим результат:

  • Жить хорошо
  • А хорошо жить лучше
  • Hello world наше Вам с кисточкой
  • world наше Вам с кисточкой
  • наше Вам с кисточкой
  • На нет и суда нет

Оператор цикла while

Часто при создании программ приходится перебирать кучу данных (например, бары или ордера) в поиске нужного, делать какие-то расчеты, повторяя код много раз или бесконечно до наступления определенного условия. Что бы программа была понятней, а ее создание проще для этого есть очень сильная штука в программировании это циклы, в языке MQL4 их два while и for. В этом уроке рассмотрим цикл while.

Цикл состоит из заголовка содержащего «Условие» и тела цикла из операторов обрамленных фигурными скобками.

while(Условие) // Заголовок оператора цикла
 {
  Блок операторов, // Тело цикла может состоять ..
  составляющих тело цикла //.. из нескольких операторов
 }

Работа цикла
В заголовке оператора while проверяется «Условие», если оно истинно управление передается оператору в теле цикла. После выполнения всех операторов в теле цикла управление снова передается в заголовок для проверки «Условия» на истину, и так по колу пока «Условие» не станет ложным.
Когда Условие оператора while станет ложным, работа цикла прерывается и выполняется код программы следующий за оператором while.
Если Условие ложно изначально цикл не исполнится ни разу.

оператор

Пример, найти максимум из пяти свечей.

double max;
int i = 0;
while(i < 5) // Если условие истинно, то выполняется код в фигурных скобках… ложно, цикл пропускается
 {
  if(High[i] > max) max = High[i]; // Если High свечи больше за значение переменной max – обновляем ее.
  i++; // Увеличиваем счетчик цикла на еденицу.
 }

С циклами нужно быть внимательным, что бы он не стал «вечным», это когда «Условие» выхода никогда не сможет стать ложным, тогда цикл никогда не закончится и программа зависнет. Например, если в примере счетчик вместо увеличения (i++) сделать на уменьшение (i- —).

Оператор цикла for

Теперь настала очередь второго цикла for.

Цикл состоит из заголовка содержащего Выражение 1, Условие, Выражение 2 и тела цикла из операторов.
for(Выражение 1; Условие; Выражение 2) // Заголовок оператора цикла
{
Блок операторов, // Тело цикла может состоять ..
составляющих тело цикла //.. из нескольких операторов
}

Если оператор один, то открывающей и закрывающей скобки тела цикла не нужны.
for(Выражение 1; Условие; Выражение 2) Оператор;

В заголовке цикла могут отсутствовать любые из его «Выражений» или «Условие».
for( ; Условие; Выражение 2) Оператор;
for(Выражение 1; ; Выражение 2) Оператор;
for(Выражение 1; Условие; ) Оператор;
Или все.
for( ; ; ) Оператор;

Работа цикла
Выражение 1 выполняется только один раз в самом начале работы цикла, переменной присваивается нужное стартовое значение, например, нам нужно начать с 5-го бара for(int i = 5; Условие; Выражение 2).
Далее проверяется «Условие» на истину, если условие истинно (например, в «Условии» может быть задан конечный бар, до которого нужно делать расчеты for(int i = 5; i < 21; Выражение 2)), то выполняются операторы в теле цикла.
Далее выполняется Выражение 2 (в зависимости от потребности увеличивается или уменьшается счетчик «i», в нашем случае увеличиваем i++) и снова проверяется «Условие» на истину. И это все повторяется до тех пор, пока «Условие» не станет ложно («i» станет равно или больше 21).

Операторы 1

Теперь прошлый пример с циклом for будет выглядеть так:

double max;
int i = 0;
for(int i = 0; i < 5; i++) // Если условие истинно, то выполняется код в фигурных скобках… ложно, цикл прекращается.
 {
  if(High[i] > max) max = High[i]; // Если High свечи больше за значение переменной max – обновляем ее.
 }

Пример перебора и учет ордеров в цикле for:

int BuyOrders, SellOrders, BuyLlimitOrders, SellLlimitOrders , BuyStopOrders, SellStopOrders;
for(int i = OrdersTotal()-1; i >= 0; i--)
 {
  if(OrderSelect(i,SELECT_BY_POS) == true)
   {
    if(OrderType() == OP_BUY) BuyOrders++;               // количество Buy ордеров
    if(OrderType() == OP_SELL) SellOrders ++;            // количество Sell ордеров
    if(OrderType() == OP_BUYLIMIT) BuyLlimitOrders ++;   // количество BuyLlimit ордеров
    if(OrderType() == OP_SELLLIMIT) SellLlimitOrders ++; // количество SellLlimit ордеров
    if(OrderType() == OP_BUYSTOP) BuyStopOrders ++;      // количество BuyStop ордеров
    if(OrderType() == OP_SELLSTOP) SellStopOrders ++;    // количество SellStop ордеров
   }
 }

Оптимизация экспертов — https://forexlab.ru/mql-optimization-expert/

You May Also Like