home

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

  • Если вдруг Вам понадобится внести изменения в этот кусок кода, то это придется делать везде, где он используется. Существует большая вероятность, что где-то Вы забудете внести изменения, и советник будет торговать с ошибками.
  • Гораздо более читабельным будет код, когда выполнение повторяющихся действий вынесено в отдельную функцию, а в соответствующих местах эта функция вызывается. В этом случае изменения (в случае необходимости) надо делать всего в одном месте и читаемость такого кода будет гораздо лучше.

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

тип имя ( параметры )
{
действия
}


Функция может возвращать какое значение любого из стандартных типов (int, bool, datetime, double, color, string — см. описание типов в выпуске «Настраиваем параметры нового эксперта»), либо не возвращать никакого значения (тип void).

Имя функции — это любое понятное Вам имя, которое помогает сразу же вспомнить, что делает эта функция. Имя может состоять из цифр (0-9), латинских прописных и строчных букв (а — z и А — Z, следует помнить, что буквы ’a’ и ’A’ — совершенно разные символы), символа подчеркивания (_). Первый символ не может быть цифрой. Также имя функции не должно совпадать с зарезервированным словом (т.е. словом, которое имеет особый смысл в языке MetaQuotes Language 4 — но об этом позже).

Пример имени функции: GetConnectionStatus.

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

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

int GetMinValue(int a1, int a2)
{
if (a1

Эта функция возвращает значение типа int (целое число), ее имя — GetMinValue и она имеет два входящих целочисленных параметра: a1 и a2.

Для возврата значения в вызывающую программу используется команда return(значение).

Если в каком-то месте нашего советника нам потребуется вычислить минимальное число из двух, то мы можем вызвать нашу функцию следующим образом: имя(параметры через запятую). Например: GetMinValue(10, 15).

Функции init(), start() и deinit()

Функция init()

  • Эта функция вызывается в следующих случаях:
  • после присоединения советника к графику;
  • после старта MetaTrader 4 и подгрузки исторических данных;
  • после смены инструмента или периода графика;
  • после перекомпиляции программы в редакторе MetaEditor;
  • после изменения настроек эксперта;
  • после смены торгового счета.

Функция start()

Функция start() запускается на каждом новом тике. Собственно это основная функция эксперта, т.к. она вызывается на каждом тике и выполняет основную работу.


Важно: Если функция start() не успела завершить свою работу до прихода следующего тика, следующий тик пропускается и функция для него не вызывается.

Функция deinit()

С помощью UninitializeReason() можно узнать причину вызова функции deinit().

  • Функция deinit() вызвается в следующих случаях:
  • при завершении работы MetaTrader 4 или при закрытии графика (функция UninitializeReason() возвращает REASON_CHARTCLOSE);
  • при удалении эксперта с графика (REASON_REMOVE);
  • перед изменением инструмента графика или периода графика (REASON_CHARTCHANGE);
  • при удачной перекомпиляции программы в MetaEdito (REASON_RECOMPILE)r;
  • при изменении параметров эксперта (REASON_PARAMETERS);
  • при переключении на другой счет (REASON_ACCOUNT).

Функция UninitializeReason() возвращает 0, если скрипт самостоятельно завершил работу.

Если в течение 2.5 секунд фукция deinit() работу не завершила, то она прерывается принудительно.