Найти тему
MQL-программирование

Синтаксис языка программирования MQL. Операторы.

Оглавление

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

Операторы

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

Один оператор может занимать одну или более строк. Два или большее количество операторов могут быть расположены на одной строке. Некоторые операторы могут быть вложены друг в друга.

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

Рис. 1. Оператор присваивания.
Рис. 1. Оператор присваивания.

Оператор, как и предложение в русском языке имеет свой формат (свою структуру). Начинается оператор присваивания с определения типа данных. Это как подлежащие в русском языке. После того, как мы указали компилятору тип данных, под который ему необходимо выделить участок в оперативной памяти компьютера, мы указываем наименование этого участка памяти, его адрес (имя переменной), под которым мы сможем получить значение, хранимое в этом участке памяти. Далее идет знак равенства, который, собственно, и является самым главным — оператором присваивания, который указывает компилятору, что в указанный слева (от знака равенства) участок оперативной памяти необходимо занести значение, указанной с правой стороны.

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

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

Некоторые конструкции языка, которые мы рассмотрим далее в этой статье, предполагают наличия только одного оператора. Но что делать, если логику нашей программы невозможно выразить всего лишь одним оператором?

Составной оператор

Составной оператор — это совокупность операторов языка, объединенная в один логический блок. Составной оператор представляет из себя.... да-да, именно то, что вы привыкли видеть во множестве других языков программирования — те самые пресловутые фигурные скобки!

Рис. 2. Пример составного оператора.
Рис. 2. Пример составного оператора.

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

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

Теперь давайте рассмотрим основу построения логики нашей будущей программы — индикатора, или советника.

Для того, чтобы принимать какие-либо решения в программе, нам постоянно нужно отвечать на массу вопросов. Купить данный актив? Продать его? Или подождать более благоприятной рыночной ситуации?

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

Для ответов на данный тип вопросов нам поможет условный оператор.

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

Рис. 3. Пример принятия решения в русском языке.
Рис. 3. Пример принятия решения в русском языке.

Отступы в приведенном выше примере использованы только для наглядности.

Прежде, чем ответить на вопрос, стоит ли купить тот или иной актив прямо сейчас, нам необходимо проверить, насколько высока цена на него. И, если цена недостаточно высока, лучше подождать того момента, когда она вырастет.

Пример условного оператора на языке программирования MQL можно представить в общем виде так:

Рис. 4. Общий вид условного оператора.
Рис. 4. Общий вид условного оператора.

Ключевое слово if указывает на начало условного оператора, за которым в круглых скобках следует условие, которое требуется проверить.

Рис. 5. Пример условного оператора
Рис. 5. Пример условного оператора

Результат вычисления выражения в скобках (условия) должен иметь логический тип данных (true или false) либо приводимым к такому типу.

Как мы знаем из предыдущих статей, логический оператор > (больше) возвращает нам именно такой тип данных — если операнд слева (переменная startPrice) имеет значение большее, чем операнд справа (переменная stopPrice), то оператор > вернет значение true. В противном случае будет возвращено значение false.

Результат выполнения данного оператора и будет входящим условием для условного оператора if. Если оператор сравнения > вернул значение true, будет выполнен оператор следующий сразу за оператором if. Если же было получено значение false, то управление программе будет передано на оператор else. При этом выполнение оператора, следующего сразу после ключевого слова if будет пропущено (он не будет исполнен).

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

Рис. 6. Пример краткой формы условного оператора.
Рис. 6. Пример краткой формы условного оператора.

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

Но, к счастью, есть решение лучше.

Оператор выбора

Оператор выбора сравнивает значение переменной с различными вариантами, и выбирает тот, который соответствует значению переменной.

Рис. 7. Общий вид оператора выбора.
Рис. 7. Общий вид оператора выбора.

В качестве входного аргумента для оператора выбора служит переменная базового типа. Далее, последовательно производится сравнение значения переданной переменной с различными значениями, указанными после ключевых слов case и выполняются те операторы, которые следуют после символа двоеточия ( : ).

Ключевое слово default: означает, что если ни одного совпадения не было ранее, то будет исполнен именно этот блок операторов. Данный блок также может отсутствовать, если выполнение каких-либо действий при отсутствии совпадения значения переменной с указанными ранее в блоках case значениями не требуется.

Рис. 8. Пример оператора выбора.
Рис. 8. Пример оператора выбора.

Рассмотрим подробнее приведенный выше пример.

Забегая наперед, замечу, что стандартная функция Period() возвращает текущий период графика в числовой формате (int). Для того, чтобы вывести на экран информацию о текущем периоде графика, нам нужно предварительно привести его в удобный для восприятия человеком формат — текстовый.

В качестве входного аргумента для оператора выбора switch мы передаем результат выполнения функции Period(), которая, как мы узнали выше, возвращает значение базового типа целого числа int. Далее, оператор выбора проверяет на соответствие это значение со значениями, указанными после ключевых слов case. Если найдено совпадение, то выполняются операторы, следующие за символов двоеточия — period="..."; break;, которые осуществляют присваивание строковой переменной period значений соответствующего периода.

После выполнения оператора присваивания стоит ключевое слово break, которое прерывает выполнение оператора выбора. Это необходимо для того, что логика оператора выбора заключается в следующем: если найдено соответствие значения проверяемой переменной и значения, указанного после ключевого слова case, выполняются все операторы подряд, включая операторы ниже лежащих блоков. Для того, чтобы избежать этого и используется ключевое слово break;.

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

Зачастую логика программы подразумевает выполнение некоторых операторов многократно. Специально для этого были введены операторы циклов.

В языке программирования MQL существует три разновидности оператора цикла. Давайте рассмотрим их подробнее.

Оператор цикла с счетчиком

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

Рис. 9. Общий вид оператора цикла.
Рис. 9. Общий вид оператора цикла.

Оператор for состоит из трех выражений и выполняемого оператора.

Выражение1 описывает инициализацию цикла. Выражение2 — проверка условия завершения цикла. Если оно истинно, то выполняется оператор тела цикла for. Все повторяется, пока выражение2 не станет ложным. Если оно ложно, цикл заканчивается и управление передается следующему оператору. ВыражениеЗ вычисляется после каждой итерации.

Давайте рассмотрим пример.

Рис. 10. Пример оператора цикла for.
Рис. 10. Пример оператора цикла for.

В качестве инициализации цикла (Выражение1) мы объявляем переменную i, которая будет выступать счетчиком цикла. Данное выражение исполняется только один раз перед началом выполнения цикла.

Далее следует проверка условия завершения цикла (Выражение2). В нашем случае, идет проверка значения переменной i со значением, которое возвращает стандартная функция OrdersTotal(). Забегая наперед, скажу, что данная функция возвращает количество всех открытых рыночных и отложенных ордеров. Данная проверка выполняется всякий раз, после выполнения всех операторов, расположенных в теле оператора цикла.

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

Остальные варианты циклов мы рассмотрим в следующей статье.

Заключение

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