Типы данных и значения

Помимо вызова встроенной функции Symbol, мы могли бы использовать и какую-нибудь свою функцию, определенную нами в исходном коде. Допустим, мы хотим выводить в журнал не просто "Hello", а различное приветствие в зависимости от времени суток. Время суток будем определять с точностью до часа: с 0 до 8 — утро, с 8 до 16 — день, и с 16 до 24 — вечер.

Логично предположить, что определение новой функции должно своей структурой походить на уже знакомое нам определение функции OnStart. Однако имя должно быть уникальным — не дублировать названия других функций и отличаться от зарезервированных слов. Список этих слов мы изучим далее по ходу книги, а пока удачно предположим, что в качестве имени можно использовать слово Greeting.

Функция должна возвращать, как и функция Symbol, строку, но на этот раз строка должна быть одной из фраз "Good morning", "Good day" или "Good evening" в зависимости от часа.

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

В MQL5 этот тип описывается ключевым словом string. Это уже второй тип, который мы знаем, после void. И мы уже даже встречали значение данного типа, но не знали, что это он: речь о литерале "Hello, ". Просто, когда мы вставляем в исходный код константу (в частности, вроде текста в кавычках), описание её типа не требуется — компилятор автоматически определяет правильный тип.

Используя определение функции OnStart как образец, мы можем предположить, как в первом приближении должна выглядеть функция Greeting.

string Greeting()
{
}

Этот текст означает наше намерение создать функцию Greeting, способную вернуть произвольное значение типа string (строка). Но для того, чтобы функция действительно что-то вернула, необходимо воспользоваться специальной инструкцией с оператором return. Это один из множества операторов MQL5: мы изучим их все позднее. Когда функция имеет тип возвращаемого значения отличный от void, в ней обязательно должен быть оператор return.

В частности, для того чтобы вернуть из функции прежнюю строку приветствия "Hello, ", следует написать:

string Greeting()
{
  return "Hello, ";
}

Оператор return прекращает выполнение функции и передает "наружу" в качестве результата то, что справа от него. За словом "наружу" скрывается тот фрагмент исходного кода, откуда функция была вызвана.

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

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

Для целочисленных значений в MQL5 имеется специальный тип int. И поскольку это значение нужно передать в функцию Greeting из другого места в программе, откуда эта функция будет вызываться, мы впервые сталкиваемся с необходимостью описать именованную ячейку памяти, то есть переменную.