Прошу поделится опытом, как организовать лучше (эффективней) проверку на повторное выполнение кода.
Допустим есть в советнике функция с входными параметрами, которая делает какой либо расчет (допустим заменяет индикатор), вызывается она многократно в коде советника, но в зависимости от потребности, т.е. её вызов на каждом баре/тике не обязателен. На вход в функцию могут подаваться разные данные/пееременные.
Задача сделать, так, что бы функция не рассчитывалась повторно, если она была уже рассчитана на текущем баре и входные данные её не изменились.
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, тогда функция будет вызываться раз в один час.
Добавить глобальную переменную ФлагНовогоБара.
Если флаг установлен - то функция/-ии срабатывают.
Может так. Вместо Time[0] можно использовать iTime() , с указанием нужного периода, например PERIOD_H1, тогда функция будет вызываться раз в один час.
Добавить глобальную переменную ФлагНовогоБара.
Если флаг установлен - то функция/-ии срабатывают.
Она не должна рассчитывать только после того, как будет уже рассчитана на текущем баре по входным параметрам, но должна возвращать результат своих вычислений каждый раз при её вызове. Т.е. у нас есть функция, которая вызывается в коде много раз с разными и одинаковыми параметрами, но частота её вызова и параметры будут разными на каждом баре - может вызываться много раз, а может вообще не вызываться. Код у меня выполняется один раз на открытии бара, суть в том, что сама функция вызывается в коде много раз.
Она не должна рассчитывать только после того, как будет уже рассчитана на текущем баре по входным параметрам, но должна возвращать результат своих вычислений каждый раз при её вызове. Т.е. у нас есть функция, которая вызывается в коде много раз с разными и одинаковыми параметрами, но частота её вызова и параметры будут разными на каждом баре - может вызываться много раз, а может вообще не вызываться. Код у меня выполняется один раз на открытии бара, суть в том, что сама функция вызывается в коде много раз.
вызываете функцию - функция смотрит включен ли флаг - если да делаем расчет, если нет возвращаем что уже посчитано
Она не должна рассчитывать только после того, как будет уже рассчитана на текущем баре по входным параметрам, но должна возвращать результат своих вычислений каждый раз при её вызове. Т.е. у нас есть функция, которая вызывается в коде много раз с разными и одинаковыми параметрами, но частота её вызова и параметры будут разными на каждом баре - может вызываться много раз, а может вообще не вызываться. Код у меня выполняется один раз на открытии бара, суть в том, что сама функция вызывается в коде много раз.
То есть, если я правильно вас понял, функция должна пересчитываться, только в том случае, если ей были переданы параметры отличающиеся от предыдущих переданных параметров?
Она не должна рассчитывать только после того, как будет уже рассчитана на текущем баре по входным параметрам, но должна возвращать результат своих вычислений каждый раз при её вызове. Т.е. у нас есть функция, которая вызывается в коде много раз с разными и одинаковыми параметрами, но частота её вызова и параметры будут разными на каждом баре - может вызываться много раз, а может вообще не вызываться. Код у меня выполняется один раз на открытии бара, суть в том, что сама функция вызывается в коде много раз.
Статическая переменная внутри функции вам поможет
вызываете функцию - функция смотрит включен ли флаг - если да делаем расчет, если нет возвращаем что уже посчитано
А как происходит проверка на входные данные? Флаг, что посчитано - ясно, можно, но тогда надо видимо добавить отдельные переменные, в которые класть последнее значение передоваемое функции, и если они совпали с прошлым значением и это было на этом баре, то не пересчитывать?
То есть, если я правильно вас понял, функция должна пересчитываться, только в том случае, если ей были переданы параметры отличающиеся от предыдущих переданных параметров?
Да, и если это произошло на новом баре. Так как параметры могут передаваться одни и те же, но при этом на разных барах будет разный результат.
Возможно поможет, но хотелось бы понять, как это лучше сделать в виде кода... пример по ссылке видел.
У тебя должны сохраняться входные переменные функции и результат. (Лично я бы сделал их членами класса, в котором эта самая функция выполняется, статическими или нет - в зависимости от конкретной архитектуры системы).
Далее, при входе в функцию сравниваешь входные переменные с сохраненными. Если они такие же - возвращаешь результат. Если нет - то вычисляешь значение, и сохраняешь результат и входные переменные.
Если функция выполняет очень сложные и громоздкие вычисления - есть смысл даже хранить не один входной набор данных, а целый ряд их, и при входе искать среди имеющихся вариантов такой же.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Прошу поделится опытом, как организовать лучше (эффективней) проверку на повторное выполнение кода.
Допустим есть в советнике функция с входными параметрами, которая делает какой либо расчет (допустим заменяет индикатор), вызывается она многократно в коде советника, но в зависимости от потребности, т.е. её вызов на каждом баре/тике не обязателен. На вход в функцию могут подаваться разные данные/пееременные.
Задача сделать, так, что бы функция не рассчитывалась повторно, если она была уже рассчитана на текущем баре и входные данные её не изменились.