Смена ТФ - проблема

 
Собственно проблема в том что индикатор рисующий линию при смене ТФ на котором ещё не подкачана история расчитывает данные, потом на графике добавлются бары, и он ещё раз расчитывает данные, соответсвенно прошлые тоже оотсаются+пропуски.
 
Vasyl Nosal:
Собственно проблема в том что индикатор рисующий линию при смене ТФ на котором ещё не подкачана история расчитывает данные, потом на графике добавлются бары, и он ещё раз расчитывает данные, соответсвенно прошлые тоже оотсаются+пропуски.

Значит ошибка в логике работы индикатора. При подкачке истории идеальный вариант работы индикатора: рассчитать свое состояние на момент последнего не измененного в истории бара и заново произвести расчет данных на обновленном участке истории. 

В реальности такой вариант не всегда возможен, т. к. вернуть окружение индикатора на  какой-либо указанный бар - это проведение расчета с начала истории. Поэтому при сколько-нибудь сложных алгоритмах работы индикатора полный пересчет истории производится при подкачке даже одного бара (не путать с открытием нового бара).

 
Vasyl Nosal:
Собственно проблема в том что индикатор рисующий линию при смене ТФ на котором ещё не подкачана история расчитывает данные, потом на графике добавлются бары, и он ещё раз расчитывает данные, соответсвенно прошлые тоже оотсаются+пропуски.

В индикаторе в OnCalculate() нужно делать проверку на:

if(prev_calculated==0)  // значит история изменилась или это первый проход
 
Karputov Vladimir:

В индикаторе в OnCalculate() нужно делать проверку на:

Спасибо.

Меня просто смутило что алерты мне выдавали то что история кусками подгружалась. 

Да. Так и есть. 

 
Ihor Herasko:

Значит ошибка в логике работы индикатора. При подкачке истории идеальный вариант работы индикатора: рассчитать свое состояние на момент последнего не измененного в истории бара и заново произвести расчет данных на обновленном участке истории. 

В реальности такой вариант не всегда возможен, т. к. вернуть окружение индикатора на  какой-либо указанный бар - это проведение расчета с начала истории. Поэтому при сколько-нибудь сложных алгоритмах работы индикатора полный пересчет истории производится при подкачке даже одного бара (не путать с открытием нового бара).

Тоесть единственное работающие решение только?

for(int i=rates_total-prev_calculated;i>=0;i--) 

 
Vasyl Nosal:

Тоесть единственное работающие решение только?

for(int i=rates_total-prev_calculated;i>=0;i--) 

А если надо пересчёт не только текущего бара то так(например 4)?

for(int i=rates_total-prev_calculated+4;i>=0;i--) 

{ 

if(i>Bars) i=Bars; 
 

Ага, рабочая.

Когда бары кусками подгружаются, то кусками и пересчёт.

Получается правильный кусок только тот что подгрузился последним дальше-влево хаха.

 

 
Vasyl Nosal:

Ага, рабочая.

Когда бары кусками подгружаются, то кусками и пересчёт.

Получается правильный кусок только тот что подгрузился последним дальше-влево хаха.

 

Пора учиться индикаторы писать
 
Victor Nikolaev:
Пора учиться индикаторы писать

Научи.

А я говорю что надо вносить разработчиками коректировку в первые расчёты индикатора.  

 
Victor Nikolaev:
Пора учиться индикаторы писать

Хочешь трюк? Угадай что Алерт возвратил? 

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(prev_calculated!=0) Alert(prev_calculated," M:",Period());
return(rates_total);
  }

 

 
Vasyl Nosal:

Хочешь трюк? Угадай что Алерт возвратил? 

 

Алертами в индикаторах не пользуюсь. Предусматриваю полный перерасчет если произошла подгрузка истории. Проконтролировать это легко.