Смена ТФ - проблема - страница 3

 
Vasyl Nosal:

Есть идея. Позднее напишу.

идея накрылась.

 

Буду просить разрабов чтобы сделали что то типа HistoryUpdated() системную проверку обновилась ли вся история или нет. 

Оптимальный вариант. Поддерживать историю по всем таймфреймам в актуальном состоянии. Недавно появился подобный индикатор в CodeBase
 
Slawa:

Разрабы вам не помогут, потому что не будут

Сказано же уже: если разница между rates_total и prev_calculated больше 1, то это и есть HistoryUpdated

больше 0, а не 1.

И? Это решает проблему? 

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

 
Vasyl Nosal:

больше 0, а не 1.

И? Это решает проблему? 

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

Вам правильно сказали. Больше 1. При появлении нового бара разность равна 1.

И это полностью решает проблему.

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

 
Victor Nikolaev:

Вам правильно сказали. Больше 1. При появлении нового бара разность равна 1.

И это полностью решает проблему.

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

Работает только если буфера обнулять.

//history update
  int all=rates_total;
  int counted=prev_calculated;
  if(all-counted>1)
  { 
  ArrayInitialize(up_arr,EMPTY_VALUE);
  ArrayInitialize(down_arr,EMPTY_VALUE);
  counted=0;
  }
   
   //main
 for(int i=all-counted;i>=0;i--)
{
 
Vasyl Nosal:

Работает только если буфера обнулять.

//history update
  int all=rates_total;
  int counted=prev_calculated;
  if(all-counted>1)
  { 
  ArrayInitialize(up_arr,EMPTY_VALUE);
  ArrayInitialize(down_arr,EMPTY_VALUE);
  counted=0;
  }
   
   //main
 for(int i=all-counted;i>=0;i--)
{

Sorry, но позвольте поинтересоваться:

  • для чего вам здесь присваивать на каждом тике создаваемым отдельным переменным значения rates_total и prev_calculated?
  • в выражении условного оператора if() и в цикле for() проводить повторные вычисления разницы этих переменных?
  • почему бы просто не ввести переменную для разницы между rates_total и prev_calculated, например, limit?
Реализация может быть различной в зависимости от задач. Нюансы могут быть различны. Может вам посмотреть, как что реализовано у других в зависимости от различных условий? В т.ч., и с помощью распринтовки разобраться, определиться, сформировать приемлемые для себя в зависимости от задач варианты?
 
Vasyl Nosal:

Постскриптумом ещё дополню:

Ваша задумка по обнулению (counted=0) в блоке условного оператора if(){} похоже мне была и есть понятна.

На всякий случай, что бы и вам было понятнее что, в том числе, имела в виду кратко выше, приведу выдержку из Документации, из раздела ... Основы языка / Функции / Функции обработки событий:

... Если с момента последнего вызова функции OnCalculate() ценовые данные были изменены (подкачана более глубокая история или были заполнены пропуски истории), то значение входного параметра prev_calculated будет установлено в нулевое значение самим терминалом.

 
Vasyl Nosal:

Работает только если буфера обнулять.

Да не надо ничего обнулять.

int OnCalculate(...)
{
   // индекс последнего посчитанного на прошлом вызове бара
   // с которого начинаем расчёт
   int nStartBar = rates_total - MathMax(prev_calculated, 1);

   for(int i = nStartBar; i >= 0; i--)
   {
       // рассчитываем индикатор на всех непосчитанных барах
   }
}

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

 
Dina Paches:

Sorry, но позвольте поинтересоваться:

  • для чего вам здесь присваивать на каждом тике создаваемым отдельным переменным значения rates_total и prev_calculated?
  • в выражении условного оператора if() и в цикле for() проводить повторные вычисления разницы этих переменных?
  • почему бы просто не ввести переменную для разницы между rates_total и prev_calculated, например, limit?
Реализация может быть различной в зависимости от задач. Нюансы могут быть различны. Может вам посмотреть, как что реализовано у других в зависимости от различных условий? В т.ч., и с помощью распринтовки разобраться, определиться, сформировать приемлемые для себя в зависимости от задач варианты?

Спасибо. Хорошее замечание.

А нет. Это для того чтобы можно было всю историю пересчтитать если есть разрыв.

 
Dina Paches:

Постскриптумом ещё дополню:

Ваша задумка по обнулению (counted=0) в блоке условного оператора if(){} похоже мне была и есть понятна.

На всякий случай, что бы и вам было понятнее что, в том числе, имела в виду кратко выше, приведу выдержку из Документации, из раздела ... Основы языка / Функции / Функции обработки событий:

... Если с момента последнего вызова функции OnCalculate() ценовые данные были изменены (подкачана более глубокая история или были заполнены пропуски истории), то значение входного параметра prev_calculated будет установлено в нулевое значение самим терминалом.

Не пойдёт. Он 0 потом не 0 потом опять 0(при подгрузке истории пару раз).
 
Sergei Vladimirov:

Да не надо ничего обнулять.

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

Нет. Без обнуления будет то что на скринах.