Оператор цикла while тормозит терминал

 

Подскажите чем заменить оператор while

Рисую зоны графическими объектами от фракталов и всё правильно строится по истории (от одного фрактала до другого) если

int i=Bars-1;
while (i>=0)
{
//----+
//----+
//----+
//----+
i--;
}

но сильно тормозит терминал, зависает жутко

 

очевидно, что каждый тик делаете полный перерасчёт всей истории. Конечно это тормозит терминал.

// типичный цикл внутри OnCalculate

for(int bar=prev_calculated>0?prev_calculated-1:prev_calculated; bar<rates_total;bar++) {

   // prev_calculated-1 нужен чтобы перерассчитать только-что закрытый бар. Там high/low/close/volume отличаются(могут) от прежних

   int shift = rates_total - bar - 1;

   /// тут рассчёт

   // [bar] - при обращении к массивам как к массивам; [shift] для тайм-серий

}

return rates_total; // считаем только по барам

 
Maxim Kuznetsov:

очевидно, что каждый тик делаете полный перерасчёт всей истории. Конечно это тормозит терминал.

Не рисует в таком виде как вы предложили 

Я сделал немного по другому, рисует по истории как надо, в тестере летит уверенно, но начинает рисовать только с нового бара при старте, а надо сразу с текущего бара 

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
// Проверка наличия данных
   if(rates_total<=0) return(0);
   if(prev_calculated!=0){ // Если не первый запуск
      if(rates_total>prev_calculated){ // Если образовалась новая свеча
         // Инициализируем индикаторные буферы начальными значениями
         const int n=rates_total-1;    // Обнуляемый индекс массива
         HIb[n] = EMPTY_VALUE;
         OPb[n] = EMPTY_VALUE;
         LOs[n] = EMPTY_VALUE;
         OPs[n] = EMPTY_VALUE;
        }
      else return(prev_calculated);    // Если не образовалась - выходим
    } else {                           // Если первый запуск
      // Инициализируем индикаторные буферы начальными значениями
      ArrayInitialize(HIb,EMPTY_VALUE);
      ArrayInitialize(OPb,EMPTY_VALUE);
      ArrayInitialize(LOs,EMPTY_VALUE);
      ArrayInitialize(OPs,EMPTY_VALUE);
     }

    int i=rates_total-1;// Индекс первого не посчитанного

    while(i>=0){

//-----+
//-----+
//-----+
//-----+

   i--;
   }

На текущем баре при старте

На новом баре после старта


 

   for(i=Bars-1; i>=0; i--)
   {

        // такое чем не устраивает?

   }

 
Renat Akhtyamov:

// такое чем не устраивает?

Так терминал тоже грузит и не тянет в тестере

 
forex2030:

Так терминал тоже грузит и не тянет в тестере

тогда может быть брать и просчитывать не Bars-1, а к примеру только то, что видно на экране

устроит такой вариант?

просто нужно подумать о необходимом и достаточном
 
Стесняюсь спросить, а за каким таким ..., Вы на каждом тике всю историю, от начала времен, по отрисовке прямоугольников обсчитываете? Они ведь никуда уже не денутся)))
 
forex2030:

Не рисует в таком виде как вы предложили 

Я сделал немного по другому, рисует по истории как надо, в тестере летит уверенно, но начинает рисовать только с нового бара при старте, а надо сразу с текущего бара 

На текущем баре при старте

На новом баре после старта

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

P.S. И на сомом деле. Зачем прогоняться по всей истории постоянно. Это нужно только при старте. Потом по ходу работы просматривайте только то что интересует на данном этапе.

 
Vladimir Simakov:
Стесняюсь спросить, а за каким таким ..., Вы на каждом тике всю историю, от начала времен, по отрисовке прямоугольников обсчитываете? Они ведь никуда уже не денутся)))

Сделал прорисовку зон не по всей истории, теперь работает в тестере быстро и рисует с текущего бара

   int CountBars=1500;

   CountBars = MathMin(Bars-1,CountBars); 
   int i,limit,counted_bars=IndicatorCounted();
   if (counted_bars<0) return;
   if (counted_bars>0) counted_bars--;    
       limit = CountBars;
   if (limit<1) limit=10;
 
   for(i=limit-1; i>=0; i--)
      {
      //------
      //------
      //------
      //------
      }
Причина обращения: