Обсуждение статьи "Как перенести расчетную часть любого индикатора в код эксперта" - страница 3

 
Dmitriy Gizlyk #:

Если посмотреть в стандартный класс-индикатора, то при обновлении данных он использует функцию CopyBuffer. Т.е. заполняет весь буфер из истории терминала, а не какую-то часть.

И перерасчет всей истории на каждом новом баре?

Не слишком ли это тогда затратно? Почему не определить дату последнего расчета и скопировать данные именно для этого кусочка времени?

 
Aleksey Vyazmikin #:

И перерасчет всей истории на каждом новом баре?

Не слишком ли это тогда затратно? Почему не определить дату последнего расчета и скопировать данные именно для этого кусочка времени?

Прошу прощения, предыдущий пост был не по статье, а по стандартной библиотеке.
В статье расчет индикатора осуществляется в методе Calculate. Здесь мы сначала определяем колиечество баров от последнего пересчета и только потом пересчитываем оставшуюся часть.

  • cur_date - текущее время;
  • m_last_calculate - время последнего пересчета.

bool CMA::Calculate(void)
  {
   datetime cur_date=(datetime)SeriesInfoInteger(m_Symbol,m_Timeframe,SERIES_LASTBAR_DATE);
   if(m_last_calculate==cur_date && ArraySize(m_source_data)==m_history_len)
      return true;
//---
   if(!LoadHistory())
      return false;
//---
   int shift=Bars(m_Symbol,m_Timeframe,m_last_calculate,cur_date)-1;
 
Dmitriy Gizlyk #:

Прошу прощения, предыдущий пост был не по статье, а по стандартной библиотеке.
В статье расчет индикатора осуществляется в методе Calculate. Здесь мы сначала определяем колиечество баров от последнего пересчета и только потом пересчитываем оставшуюся часть.

  • cur_date - текущее время;
  • m_last_calculate - время последнего пересчета.

Спасибо за уточнение!

Причина обращения: