
Основы языка
© 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
клиентского терминала значения индикатора не показываются.
Для лучшего понимания будет полезно запустить индикатор, код которого приложен ниже.
Пример индикатора: