Советник FOREX: от идеи до результата — Страница 5 — Тирметод

Операторы MQL4

Операторы языка MQL4 описывают некоторые алгоритмические действия, которые необходимо выполнить для решения задачи. Тело программы – это последовательность таких операторов. Идущие друг за другом операторы разделяются точкой с запятой.

Условный оператор if-else

В любом программном языке много условностей.

Фактически любой код программ состоит из инструкций, которые требуется выполнить при определённом условии (или нескольких условий).

Оператор IF — ELSE используется при необходимости сделать выбор. Формально синтаксис имеет вид:

if (выражение)
  оператор1
else
  оператор2

Если выражение истинно, то выполняется оператор1 и управление передаётся на оператор, следующий за оператором2 (т.е. оператор2 не выполняется). Если выражение ложно, то выполняется оператор2.

Часть else оператора if может опускаться.

Напишем код проверки на возможность торговать:

В строке 46 – условное выражение – это то, что находится внутри условного оператора if, то есть внутри его круглых скобок ().

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

В строке 47оператор, которой должен выполниться при истинности условного выражения.

Оператор return прекращает выполнение текущей функции и возвращает управление вызвавшей программе. Завершаем выражение точкой с запятой (;).

Любое выражение, заканчивающееся точкой с запятой (;), является оператором.

В целом строки 46 и 47 читаем так:

Если if
  (
возможность торговать IsTradeAllowed
  ()
соответствует ==
лжи false
, )
вернуть управление вызвавшей программе return
. ;

И, наоборот, если возможность торговать соответствует истине, то оператор возврата return НЕ выполняется; тогда управление переходит дальше по коду. То есть при истинности выражения «возможность торговать соответствует лжи», если бы в коде, например, в строке 49 (см. рис. выше), были бы какие-то инструкции, то до них «ход не дошёл» бы.

Так как вся условная конструкция (строки 46-47) находится внутри функции OnTick(), то проверка на возможность торговать будет производиться при каждом новом тике.

Условное выражение (внутри круглых скобок) можно записать иначе, см. ниже сокращённый способ с помощью операции логического отрицания НЕ (!).

А также добавим действие: напечатать некоторое сообщение в журнал экспертов с помощью функции Print().

Строковая константа представляет собой последовательность символов Unicode, заключённую в двойные кавычки: «Торговля запрещена!»

Теперь строки 46-48 читаются так:

Если if
  (
нет !
возможности торговать IsTradeAllowed
  ()
, )
напечатать Print
  (
«Торговля запрещена!» «Торговля запрещена!»
  )
и ;
вернуть управление вызвавшей программе return
. ;

См. ниже пример отображения в торговом терминале Metatrader 4 сообщения, составленное с помощью функции Print().

Примечание. При работе в тестере стратегий в режиме оптимизации функция Print() не выполняется.

Добавим ещё одно действие: отобразить диалоговое окно, содержащее пользовательские данные (некоторое сообщение) с помощью функции Alert().

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

После закрывающейся фигурной скобки не должно быть точки с запятой (;).

Сейчас строки 46-51 читаются так:

Если if
  (
нет !
возможности торговать IsTradeAllowed
  ()
, )
  {
напечатать Print
  (
«Торговля запрещена!» «Торговля запрещена!»
  )
, затем ;
вывести алерт Alert
  (
«Торговля запрещена!» «Торговля запрещена!»
  )
и ;
вернуть управление вызвавшей программе return
. ;
  }

Примечание. При работе в тестере стратегий функция Alert() не выполняется.

Добавим альтернативное условное выражение (строка 46), см. ниже.

Предопределённая переменная Bars возвращает количество баров на текущем графике

С добавочным условным выражением строка 46 читается так:

Если if
  (
нет !
возможности торговать IsTradeAllowed
  ()
или ||
баров на текущем графике Bars
меньше <
100 100
  )

Так как пользователь (заказчик) может переходить с одного таймфрейма на другой, мы сделаем «защиту от дураков», указав количество баров для рабочего графика с помощью функции iBars(), где аргументы (внутри круглых скобок) это:

  • NULL – предопределённая константная переменная – означает текущий символ;
  • InpTimeFrame – объявленная внешняя переменная – означает период рабочего графика.

То есть функция iBars() возвращает количество баров в истории по соответствующему символу и периоду.

Так как логическая операция ИЛИ (||) подразумевает истинность при одном из условных выражений, то их можно поменять местами, см. в строке 46 выше.

Заметьте, что если ни одно из условий (строка 46) не выполняется, то функции Alert() и Print(), а также оператор возврата return НЕ выполняются. Происходит «переход» к строке 53, см. ниже.

«Торговать только по первым тикам нового бара», так называется следующая конструкция.

Volume[] – массив-таймсерия, содержащий тиковые объёмы каждого бара текущего графика. Индексом массива [] может быть только целое число.

Индексация элементов таймсерий производится задом наперёд, от последнего к первому. Текущий бар, самый последний в массиве, имеет индекс 0. Самый старый бар, первый на графике, имеет индекс Bars-1.

Строка 53 читается так:

Если if
  (
тиковый объём Volume
  [
нулевого бара 0
  ]
больше >
1 1
  )
,  
вернуть управление вызвавшей программе return
. ;

Также «защищаясь от дураков», укажем объём рабочего графика.

iVolume() возвращает значение тикового объёма бара с указанными параметрами, см. пример ниже с аргументами (внутри круглых скобок):

  • NULL – предопределённая константная переменная – означает текущий символ;
  • InpTimeFrame – объявленная внешняя переменная – означает период рабочего графика;
  • 0 – индекс получаемого значения из таймсерии – последний справа, или текущий, бар.

Данная конструкция (строка 53) позволяет «притормозить» с исполнением дальнейшего кода программы, которую, кстати, продолжим писать позже.

А пока приступим к знакомству оператора цикла for. Но это будет в следующий раз.

{Продолжение следует}