Для начала же полезно понять, а что такое функция вообще. Допустим Вы
в своей программе часто производите одни и те же действия. Вы можете в
каждом месте написать код, который выполняет эти действия. Однако это
неудобно и неправильно с нескольких точек зрения:
- Если вдруг Вам понадобится внести изменения в этот кусок кода, то
это придется делать везде, где он используется. Существует большая
вероятность, что где-то Вы забудете внести изменения, и советник будет
торговать с ошибками.
- Гораздо более читабельным будет код, когда выполнение повторяющихся
действий вынесено в отдельную функцию, а в соответствующих местах эта
функция вызывается. В этом случае изменения (в случае необходимости)
надо делать всего в одном месте и читаемость такого кода будет гораздо
лучше.
Таким образом, в любой момент Вы можете описать свою функцию, которая будет выполнять определенные действия:
тип имя ( параметры )
{
действия
}
Функция может возвращать какое значение любого из стандартных типов
(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() работу не завершила, то она прерывается принудительно.