Функции

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

Пример:

double // тип возвращаемого значения
my_func (double x, double y) // имя функции и список параметров
{
 // составной оператор
 return (x + y); // возвращаемое значение
}

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

Пример:

void err_msg(string s) 
{ 
   Print("error: "+s); 
}

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

Пример:

int my_func(double a, double d=0.014, int n=3, bool b=false, string s="строка текст")
{
  Print("Обязательный параметр a=",a);
  Print("Переданы следующие параметры: d=",d," n=",n," b=",b," s=",s);
  return (0);
}

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

Пример неправильного объявления:

int my_func(double a, double d=0.0001, int n, bool b, string s="строка текст")
{
   ...
}

Вызов функции

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

имя_функции (x1, x2,…, xn)

Если функция использует аргументы(формальные параметры), она должна объявлять переменные, получающие значения аргументов. Данные переменные называются формальными параметрами функции. Они ведут себя так же, как и обычные локальные переменные, то есть создаются при входе в функцию и уничтожаются при выходе из нее.

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

Примеры:

void OnTick()
{
   double my_array[4]={0.3, 1.4, 2.5, 3.6};
   double a=my_func(my_array, 10.5, 8);
   //...
}
double my_func(double x[], double a, double b)
{
   return (a*x[0] + b);
}

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

Примеры:

void my_func(double init,double sec=0.015,int level=10); // прототип функции
my_func(); // неправильный вызов. первый обязательный параметр должен быть.
my_func(1.23); // правильный вызов
my_func(5.17, 0.0001); // правильный вызов
my_func(5.17, 0.0001, 6); // правильный вызов

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

my_func(5.17, , 6); // неправильный вызов, второй параметр пропущен

Специальные функции

В языке программирования MQL4 существуют 3 функции-события с предопределенными именами:

OnInit() — функция, вызывающаяся в процессе инициализации модуля. В случае ее отсутствия при инициализации не вызывается никакой функции.

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

OnDeinit() — функция, вызывающаяся в процессе деинициализации модуля. В случае ее отсутствия при деинициализации не вызывается никакой функции.

Предопределенные функции могут иметь параметры. Однако при вызове этих функций клиентским терминалом никакие параметры переданы извне не будут, а будут использованы умолчательные значения. Функции OnTick(), OnInit() и OnDeinit() могут быть вызваны из любого места модуля по общим правилам, наравне с другими функциями.

Нежелательно из функции OnInit() вызывать OnTick() или совершать торговые операции, так как в момент инициализации модуля могут быть не готовы данные графиков, рыночные цены и т.д. Функции OnInit() и OnDeinit() должны максимально быстро завершать свою работу и ни в коем случае не зацикливаться в попытке начать полноценную работу раньше вызова функции OnTick()