Основы языка
© 2000-2011, MetaQuotes Software Corp.
139
int OnCalculate (const int rates_total, // размер входных таймсерий
const int prev_calculated, // обработано баров на предыдущем вызове
const datetime& time[], // Time
const double& open[], // Open
const double& high[], // High
const double& low[], // Low
const double& close[], // Close
const long& tick_volume[], // Tick Volume
const long& volume[], // Real Volume
const int& spread[] // Spread
);
Параметры open[], high[], low[] и close[] содержит массивы с ценами открытия, максимальной,
минимальной ценами и ценами закрытия текущего таймфрейма. Параметр time[] содержит массив
со значениями времени открытия, параметр spread[] – массив, содержащий историю спредов (если
спред предусмотрен для данного торгового инструмента). Параметры volume[] и tick_volume[]
содержат соответственно историю торгового и тикового объема.
Чтобы определить направление индексации в массивах time[], open[], high[], low[], close[],
tick_volume[], volume[] и spread[], необходимо вызывать функцию ArrayGetAsSeries(). Чтобы не
зависеть от умолчаний, необходимо безусловно вызывать функцию ArraySetAsSeries() для тех
массивов, с которыми предполагается работать.
Первый параметр rates_total содержит количество баров, доступных индикатору для расчета, и
соответствует количеству баров, доступных на графике.
Необходимо отметить связь между значением, возвращаемым функцией OnCalculate() и вторым
входным параметром prev_calculated. Параметр prev_calculated при вызове функции содержит
значение, которое вернула функция OnCalculate() на предыдущем вызове. Это позволяет
реализовать экономные алгоритмы расчета пользовательского индикатора с тем, чтобы избежать
повторных расчетов для тех баров, которые не изменились с предыдущего запуска этой функции.
Для этого обычно достаточно вернуть значение параметра rates_total, которое содержит
количество баров при текущем вызове функции. Если с момента последнего вызова функции
OnCalculate() ценовые данные были изменены (подкачана более глубокая история или были
заполнены пропуски истории), то значение входного параметра prev_calculated будет установлено
в нулевое значение самим терминалом.
Примечание: если функция OnCalculate возвращает нулевое значение, то в окне DataWindow
клиентского терминала значения индикатора не показываются.
Для лучшего понимания будет полезно запустить индикатор, код которого приложен ниже.
Пример индикатора: