Текущие котировки


<a href="https://instaforex.com/ru/">ИнстаФорекс портал</a>

<a href="https://www.instaforex.com/ru/">Форекс Portal</a>

Наши преимущества

ForexCopy
Бонус 250%
ПАММ-Система
Форекс аналитика

Язык MQL4 – просто о сложном

Пишем собственные функции

Да, но зачем они нужны? Дело в том, что частенько в вашем коде вы будете находить повторы. То есть один и тот же набор инструкций вы будете использовать то здесь, то там. Что бы сэкономить ваше время и силы, вы можете вынести этот повторяющийся код в отдельную функцию. А когда нужно, просто вписать название этой функции и она сделает все за вас. Давайте посмотрим как это работает. Представьте, что вам нужно узнать цвет свечи. Всем известно, что "белой" считается свеча, которая закрылась выше открытия, "черной" - наоборот. Напишем код для определения цвета свечи:

Вот и все, теперь в переменной color хранится цвет последней свечи. Что бы узнать цвет какой-то другой свечи, например, предпоследней, нужно изменить индекс с 0 на 1. Но не будете же вы вставлять этот код в любом месте, где понадобиться узнать цвет свечи! А если таких мест будет несколько десятков? Именно поэтому нужно использовать функции. Давайте подумаем, как она должна работать. Подобная функция должна принимать один аргумент - индекс свечи, цвет которой нужно определить, и возвращать цвет - переменную типа bool. Представим, что функция уже написана и мы вызываем ее:

Как вы догадались, наша функция будет называться GetColor. В этом вызове мы захотели узнать цвет последней свечи, поэтому единственный аргумент равен нулю. Функция возвращает цвет свечи, поэтому мы сразу выполняем присваивание. Это очень важный момент! Внутри функции создается переменная, а потом ее значение подставляется вместо самого вызова функции. В конечном итоге вызов функции и код определения функции, тот, что мы писали выше, дадут одинаковый результат - в переменной color будет записан цвет последней свечи, но используя функции мы затрачиваем меньше усилий. А теперь давайте неожиданно остановимся на коде пустого скрипта. Создайте новый скрипт. Дело в том, что там уже включено полное описание функции start(). Самое интересное то, что все это время вы писали скрипты в этой функции! Когда вы запускаете ваш скрипт, то терминал просто вызывает функцию start(). Рассмотрим подробнее код пустого скрипта:

Эта строка очень важна! Она включает название функции, то есть ключевое слово, которое вы будете писать, когда захотите вызвать эту функцию. В нашем случае это - start. Также указывается тип возвращаемого значения - int. Это значит, что после выполнения функции, она возвратит нам какое-то значение типа int. В скобках размещается перечень аргументов, но в нашем случае функция не принимает никаких параметров.

После этого в фигурных скобках следует описание самой функции, то есть тот код, который будет выполняться при вызове:

Как видно, все это время мы писали код в теле функции start(). В самом конце функции находится оператор return, который возвращает значение функции. В нашем случае возвращается нуль.
Теперь посмотрите на общую форму написания функций:

А теперь давайте вернемся к нашим свечам и функции GetColor. Посмотрите на код этой функции:

Рассмотрим первую строку детально:

Здесь имеем: bool - тип возвращаемого значения; GetColor - название функции; int - тип аргумента; index - название аргумента. Обратите внимание, что мы используем index для обращения в теле функции, но при непосредственном вызове функции это названия никогда не упоминается, например:

Смотрим дальше:

Это тело функции - основной код, который будет выполняться при каждом вызове. Смотрим дальше:

Оператор return указывает, что должна возвращать функция. Возвращаемое значение должно соответствовать типу, который мы определили до этого в самом начале. Вы можете использовать несколько операторов return в одной функции, если нужно, например:

Как видно, использование нескольких операторов return позволило избавиться от переменной color. Кроме того в операторе return можно использовать даже логические выражения:

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

Теперь давайте вернемся к списку аргументов. В нашей функции используется лишь один аргумент - int index. Если нужно использовать несколько аргументов, то перечислите их через запятую:

Чтобы обратится к этим аргументам, используйте их имена, как и в предыдущей функции. При вызове функций с несколькими аргументами обращайте внимание на порядок следования аргументов : ничего не перепутайте! Если функция не должна возвращать никакого значения, то используйте ключевое слово void, чтобы указать это. Обратите внимание, оператор return в этом случае не используется:

Есть еще одна тонкость: вы можете задать значения для аргументов функций по умолчанию. Что это такое? Допустим, вы написали какую-то сложную функцию, у которой есть 5 аргументов, которые настраивают ее поведение. Но последние несколько аргументов почти всегда используются с одними и теми же значениями. Только на два десятка вызовов вам приходится применять какие-то специальные значения. Что бы не указывать каждый раз значения последних аргументов, которые почти всегда одинаковы, используются значения аргументов по умолчанию. В таком случае вы просто пропускаете последние аргументы, как будто их не существует, но на самом деле они используются, только им присваиваются значения по умолчанию. Когда же возникает тот самый специальный случай, то вы указываете все аргументы. Посмотрим как можно объявить функцию с аргументами по умолчанию:

Как видите, все очень просто: мы присваиваем нужному аргументу нужное значение и теперь его можно пропускать при вызове:

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

   Ко всему списку