В процессе разработки пользовательского индикатора или торгового советника часто приходится писать одни и те же команды в различных участках программы. Например, для анализа всех открытых ордеров приходится писать один и тот же код. Более того, тот же самый код постоянно приходится писать в других советниках и пользовательских индикаторах. Для того, чтобы ускорить и оптимизировать данный процесс, было введено понятие функций.
Функции
Функция - это обособленная часть программы, которая один раз написана, отлажена и вызывается из различных участков программы (или из различных программ) на исполнение однотипных операций.
Кроме того, функции используются для разбиения одной большой сложной задачи, управление которой бывает довольно затруднительно, на несколько более простых и лучше управляемых подзадач.
Такой подход к программированию получил название функциональное программирование. Некоторые называют данный подход методом "Разделяй и властвуй", подчеркивая тем самым тот факт, что управлять программой, разбитой на самостоятельные блоки удобнее и процесс разработки программы не выходит из-под контроля разработчика.
При разработке макета программы, как правило, ставится общая задача, которую должна выполнять программа, и предварительное пошаговое выполнение этой задачи. Далее выделяют части программы, которые можно оформить в виде отдельных подзадач. Такой подход к разработке программ называют пошаговым уточнением.
Итак, давайте подробнее рассмотрим объявление и реализацию функций.
В общем виде, объявление функции сводится к указанию заголовка функции и реализации внутри фигурных скобок.
Все, что находится перед первой фигурной скобкой, составляет заголовок определения функции, а то, что находится между фигурными скобками, является телом определения функции. Заголовок функции включает в себя описание типа возвращаемого значения, имени (идентификатора) и формальных параметров. Количество параметров, передаваемых в функцию, ограничено и не может превышать 64.
Функция может вызываться из других частей программы столько раз, сколько необходимо. По сути, возвращаемый тип, идентификатор функции и типы параметров составляют прототип функции.
Прототип функции – это объявление функции, но не ее определение. Благодаря явному объявлению возвращаемого типа и списка типов аргументов, при обращении к функциям возможны строгая проверка типов и неявные преобразования типов. Особенно часто объявления функций используются в классах для улучшения читаемости кода.
Определение функции должно точно соответствовать ее объявлению. Каждая объявленная функция должна быть определена.
Давайте построчно разберем пример функции, приведенной выше.
Перед объявлением заголовка функции использован однострочный комментарий, начинающийся с двух символов косой черты // в котором кратко указано назначении самой функции.
Далее следует описание заголовка функции. Вначале указывается тип возвращаемого функций значения. В нашем случае это тип datatime, позволяющий хранить в программе дату и время. После типа возвращаемого значения указано само название функции, под которым она будет доступна в программе - getTime. Имена функциям и переменным лучше всего выбирать таким образом, чтобы по названию можно было судить о том, что выполняет функция. Из названия нашей функции можно понять, что она позволяет получить значение времени.
В качестве входящего аргумента функции передается также переменная типа datetime, которая внутри функции будет доступна под именем dtime. Инструкция const говорит о том, что значение переменной dtime (входного параметра) нам доступно только для чтения. Если внутри функции мы попытаемся изменить значение этой переменной, то получим соответствующее сообщение на этапе компиляции программы.
Далее, за объявлением заголовка функции следует описание тела функции (реализация функция), где последовательно, инструкция за инструкцией, следуют действия, которая выполняет функция.
Начало блока реализации обозначает открывающая фигурная скобка {, а окончание - закрывающая - }.
Первой инструкцией внутри блока реализации функции мы объявляем переменную result типа datetime, значение которой функция будет возвращать в вызывающую программу. Имя переменной может быть любым и эта переменная будет доступна только внутри блока реализации функции. За пределами фигурных скобок имя этой переменной будет недоступно.
Затем мы объявляем еще одну переменную строкового типа string, в которой будем хранить текстовое представление времени, полученное в результате вызова стандартной библиотечной функции TimeToString, которая в качестве входящих аргументов получает значение переменной типа datetime (мы ей передаем значение входящего аргумента нашей функции - переменную dtime) и предопределенную стандартную константу TIME_MINUTES, которая сообщает функции TimeToString, что мы хотим получить значение времени (без даты) и включающее только часы и минуты в формате "hh:mm", где hh - значение часов, а mm - значение минут. Если нам требуется также и значение секунд, то мы должны вместо этого указать константу TIME_SECONDS. Тогда в строковой переменной str будет храниться текстовое значение времени в формате "hh:mm:ss", включающее также и значение секунд.
Следующим оператором мы производим обратное преобразование - переводим значение времени из текстового представление в формат datetime, вызвав стандартную библиотечную функцию StringToTime, которая в качестве входящего аргумента принимает одно значение - текстовое представление времени, и возвращает значение в формате типа данных datetime, которое присваивается переменной result.
Последняя инструкция: return result; возвращает значение переменной result в вызывающую программу и завершает работу нашей функции.
Заключение
Мы познакомились с таким понятием, как функция, узнали для чего применяются функции, как их объявлять. Также мы познакомились с тем, как можно вызывать функции из программы.