Пересчёт баров в истории на каждом тике

 

Уже две недели бьюсь как рыба об лёд и не могу решить задачу

Есть цикл перебора баров в истории, после заполнения отключаемся (return) и ждём новый бар

Как мне на каждом тике получать всю историю заново как будто это первый старт??
Все мои эксперименты приводят к зависанию и ошибке "out of memory" (недостаточно памяти)

 int i=0, bars=Bars-1, limit=bars-IndicatorCounted();
  
 if(limit<bars){
     if(limit<1) return(0); //Не повторять на том же баре
        i=limit;  
 } else i=bars;

   while(i>=0)
        {
//Работает индикатор
    i--;}
 
forex2030:

Подарите пожалуйста новогодний подарок с примером решения))
Уже две недели бьюсь как рыба об лёд и не могу решить задачу

Есть цикл перебора баров в истории, после заполнения отключаемся (return) и ждём новый бар

Как мне на каждом тике получать всю историю заново как будто это первый старт??
Все мои эксперименты приводя к зависанию и ошибке "out of memory" - недостаточно памяти

Всю историю пересчитывать на каждом(новом) тике? или сохранить какие то данные как историю? и обращаться к ним в каждом тике?

Пересчитывать всю историю совсем расточительно, нужно как-то математику реализовать, чтоб полного пересчета избежать. 

 
dr.mr.mom Mishanin:

Всю историю пересчитывать на каждом(новом) тике? или сохранить какие то данные как историю? и обращаться к ним в каждом тике?

Мне наверно подойдёт любой из вариантов, какой будет быстрее и безопасней от перегрузок и зависаний

 
forex2030:

Мне подойдёт любой из вариантов, какой будет быстрее и безопасней от перегрузок и зависаний

Вы так формулируете вопрос, что за Вас нужно всё додумывать, что практически нереально.

Речь об эксперте, скрипте или индикаторе? Что считается в цикле по историческим барам и что нужно сохранить?

 
dr.mr.mom Mishanin:

Речь об эксперте, скрипте или индикаторе? Что считается в цикле по историческим барам и что нужно сохранить?

Это индикатор

Суть такая что по стрелкам сигналов я получаю результаты на всей доступной истории,
на новом тике меняются значения параметров индикатора по которым так же меняются сигналы стрелок и требуется получить новые результаты

Пробовал решить проблему грубо подставив после смены значений параметров  limit=bars; в тот момент когда if(limit<1) return(0);
В итоге всё работает как требуется, новые результаты получаю, но терминал виснет и далее завершает с ошибкой "out of memory"
По умолчанию если не подкидывать limit=bars; то далее новые результаты =0

 
forex2030:


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[])
  {
//---
   int limit=rates_total-prev_calculated;

   if(limit==0)
      return(rates_total); 
//---
   for(int i=rates_total-1; i>0; i--)
     {
      // Код индикатора
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
 
Vitaly Muzichenko:

Не подходит к сожалению ваш вариант

Вот если вместо return(0) добавить limit=bars; то работает как надо но виснет на каждом тике и через N-время зависает весь терминал полностью

 int i=0, bars=Bars-1, limit=bars-IndicatorCounted();
  
 if(limit<bars){
     if(limit<1) return(0); //Не повторять на том же баре
     if(limit<1) limit=bars; 
        i=limit;  
 } else i=bars;

   while(i>=0)
        {
//Работает индикатор
    i--;}
 
forex2030:

Не подходит к сожалению ваш вариант

Вот если вместо return(0) добавить limit=bars; то работает как надо но виснет на каждом тике и через N-время зависает весь терминал полностью

Вы понимаете суть своей конструкции, что такое bars и limit?
Сколько баров просчитываете и в какой момент, а также зачем это делать? И вообще, что именно делать?

 
Vitaly Muzichenko:

Вы понимаете суть своей конструкции, что такое bars и limit?
Сколько баров просчитываете и в какой момент, а также зачем это делать? И вообще, что именно делать?

Если честно, то вообще не понимаю этот пересчёт баров и ни когда не понимал
Можете просветить, что к чему, если не трудно ?))

 
forex2030:

Если честно, то вообще не понимаю этот пересчёт баров и ни когда не понимал
Можете просветить, что к чему, если не трудно ?))

нужно просто почистить буфер стандартной функцией перед расчетом

ArrayInitialize(буфер,EMPTY_VALUE);

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

 
Renat Akhtyamov:

нужно просто почистить буфер перед расчетом

ArrayInitialize(буфер,EMPTY_VALUE);

отрисовка индикатора будет выполнена заново, причем на каждом тике

Не нужно ничего чистить.


forex2030:

Если честно, то вообще не понимаю этот пересчёт баров и ни когда не понимал
Можете просветить, что к чему, если не трудно ?))

Скиньте код расчётной части индикатора.

===

Хотя, мне почему-то кажется, что вы хотите от индикатора чего-то лишнего, раз нужен полный пересчет на каждом баре

===

P.S. Точно не тике, на новом баре?

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