Запрет на повторный перерасчет функции

 

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

Допустим есть в советнике функция с входными параметрами, которая делает какой либо расчет (допустим заменяет индикатор), вызывается она многократно в коде советника, но в зависимости от потребности, т.е. её вызов на каждом баре/тике не обязателен. На вход в функцию могут подаваться разные данные/пееременные.

Задача сделать, так, что бы функция не рассчитывалась повторно, если она была уже рассчитана на текущем баре и входные данные её не изменились.

 
Aleksey Vyazmikin:

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

Допустим есть в советнике функция с входными параметрами, которая делает какой либо расчет (допустим заменяет индикатор), вызывается она многократно в коде советника, но в зависимости от потребности, т.е. её вызов на каждом баре/тике не обязателен. На вход в функцию могут подаваться разные данные/пееременные.

Задача сделать, так, что бы функция не рассчитывалась повторно, если она была уже рассчитана на текущем баре и входные данные её не изменились.

datetime TM;
int OnInit()
{
   ......
   TM = Time[0];
   return(INIT_SUCCEEDED);
}
void OnTick()
{
  if (TM!=Time[0])
  {
      TM = Time[0];
      //Вызов функции на открытии нового бара
      Function();
  }
}

Может так. Вместо Time[0] можно использовать iTime() , с указанием нужного периода, например PERIOD_H1, тогда функция будет вызываться раз в один час.

 

Добавить глобальную переменную ФлагНовогоБара.
Если флаг установлен - то функция/-ии срабатывают.

 
Vitalii Ananev:

Может так. Вместо Time[0] можно использовать iTime() , с указанием нужного периода, например PERIOD_H1, тогда функция будет вызываться раз в один час.

Taras Slobodyanik:

Добавить глобальную переменную ФлагНовогоБара.
Если флаг установлен - то функция/-ии срабатывают.

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

 
Aleksey Vyazmikin:

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

вызываете функцию - функция смотрит включен ли флаг - если да делаем расчет, если нет возвращаем что уже посчитано

 
Aleksey Vyazmikin:

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

То есть, если я правильно вас понял, функция должна пересчитываться, только в том случае, если ей были переданы параметры отличающиеся от предыдущих переданных параметров?

 
Aleksey Vyazmikin:

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

Статическая переменная внутри функции вам поможет

 
Taras Slobodyanik:

вызываете функцию - функция смотрит включен ли флаг - если да делаем расчет, если нет возвращаем что уже посчитано

А как происходит проверка на входные данные? Флаг, что посчитано - ясно, можно, но тогда надо видимо добавить отдельные переменные, в которые класть последнее значение передоваемое функции, и если они совпали с прошлым значением и это было на этом баре, то не пересчитывать?

 
Vitalii Ananev:

То есть, если я правильно вас понял, функция должна пересчитываться, только в том случае, если ей были переданы параметры отличающиеся от предыдущих переданных параметров?

Да, и если это произошло на новом баре. Так как параметры могут передаваться одни и те же, но при этом на разных барах будет разный результат.

 
Rashid Umarov:

Статическая переменная внутри функции вам поможет

Возможно поможет, но хотелось бы понять, как это лучше сделать в виде кода... пример по ссылке видел.

 

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

Далее, при входе в функцию сравниваешь входные переменные с сохраненными. Если они такие же - возвращаешь результат. Если нет - то вычисляешь значение, и сохраняешь результат и входные переменные.

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