Наши рекомендации:

  1. Главная
  2. Уроки MQL4
  3. 1.9 Пользовательские функции mql4

1.9 Пользовательские функции mql4

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

Создаем собственную функцию

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

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

В функции обработки событий OnStart была объявлена функция ShowMePrint. Круглые скобки после названия говорят о том, что ей не передаются никакие параметры. Далее программа ищет и переходит к телу данной функции, которое мы записали за пределами функции OnStart. Void это тип данных этой функции, ее заголовок. Это слово обозначает, что функция не возвращает значение т.е. в данном примере то, что произойдет в ее теле никак не повлияет на другие действия в основной функции.

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

Теперь попробуем задать для пользовательской функции один параметр — просто целое число:

В теле функции OnStart нами была объявлена int переменная А. Чтобы вывести ее в принт через функцию, необходимо передать ей это значение, поэтому переменная А была добавлена в круглые скобки. Далее идет вызов функции. Так как функции было передано значение, то и ее внешний вид немного изменяется — у нее появился формальный параметр а. Это временная переменная, которая существует только в теле функции. Раз это переменная, то у нее должен быть объявлен тип, который должен соответствовать типу переменной, что мы передали в функцию, т.е. int. Получается, что переменная a переняла значение переменной A из основной функции и отправила его на принт.

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

Естественно, функцию с одним вычислением или выражением редко кто делает. Попробуем усложнить задачу и изменим тип функции с void на int, чтобы она могла возвращать значение:

Функция CountSum имеет заголовок int, считает сумму трех целых чисел, которые мы передали ей как константы. Соответственно в формальных параметрах самой функции необходимо объявить три int переменные для этих чисел, где a = 2, b = 4, c = 7. В теле функции идет банальное сложение этих чисел и далее идет слово return, в скобках которого указывается возвращаемое значение, переменная sum. Если заголовок функции отличается от void, т.е. имеет тип string, int, double, bool, color или datetime, то обязательно нужно указывать оператор возврата. В данном примере возврат обозначает, что это значение будет присвоено переменной В. Проверьте этот пример в вашем терминале, чтобы лучше понять логику работы кода.

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

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

Стоит заметить, что в функции FuncNumberOne два раза указывается оператор возврата, но сработает только один, у которого быстрее выполнится условие. В нашем случае условие if истина, поэтому функция возвращает результат true.

Количество параметров, передаваемое в функцию может не совпадать, если один или несколько формальных параметров имеют значение:

В этом примере было объявлено три переменные типа int, но только две были переданы в функцию. Сама же пользовательская функция имеет три формальных переменный, но, т.к. у переменной c2 заведомо задано значение ноль, то ее не обязательно заполнять пользовательским значением. Притом, стоит заметить, что значение по умолчанию будет использовано только, если функции не будет передан данный параметр. Если же формальная переменная не имеет значения, то количество параметров обязательно должно быть одинаковым. Также мы использовали возврат return сразу, без дополнительных переменных. В таких простых примерах это удобно и освобождает код от лишнего мусора.

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

Альтернативным способом является передача аргумента по ссылке. Знак & присваивается формальному параметру, что в последствии ведет к изменению самого параметра в основной функции. Сравним оба метода:

В обоих способах мы изменили значение a2 и b2, но во втором добавили знак &, который сигнализирует о том, что значение переменной можно менять в теле функции. Соответственно оба метода дали разные результаты. Этим способом можно воспользоваться, когда вам нужно вернуть не одно значение из функции, а несколько.

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

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

В моем коде каждая пользовательская функция выполняет какое-то конкретное действие и возвращает результат. К примеру, мне нужно открыть ордер, для этого вначале в работу включается функция, которая проверяет условие на вход, если она возвращает true, тогда следующая функция уже высчитывает необходим лот при включенном АвтоММ. Последующая рассчитывает цели данного ордера, выполняет проверку на их корректность и только после этого в бой вступает функция открытия ордера, которая также возвращает результат. Если была какая-то ошибка — задействуется функция проверки на ошибки. Потом идет отдельно сопровождение открытого ордера, отдельно проверка на сигнал для закрытия и т.д. Все строго на своих местах, функция обработки событий не захламляется, притом самые полезные функции потом можно вывести в отдельную библиотеку, которую можно будет раздавать для разных программ.

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

0. Начало работы

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

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

Меню