Как сделать расчет не на каждом тике, а каждую секунду (или несколько раз в секунду)?

 

OnCalculate()  - Если я правильно понимаю вызывается каждый тик

Проблема -  в некоторые периоды количество тиков зашкаливает за 10000 в минуту.   Индикатор дико тормозит в эти моменты. И мне не принципально что там в каждом конкрентном тике происходит. Достаточно чтобы вычисления происходили  несколько раз в секунду

Не могу понять как это написать

 

OnTimer

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

Документация по MQL5: Обработка событий / OnTimer
Документация по MQL5: Обработка событий / OnTimer
  • www.mql5.com
OnTimer - Обработка событий - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov:

OnTimer

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

не понятно как это соотноситься с тем , что мне надо ограничить OnCalculate. -  мне нужны данны что приходят в 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[])

И вообще Мне не нужно чтобы был Timer.  - ведь тики иногда могут и по 10k приходить, а  иногда и гораздо меньше. OnTimer мне не подходит

 

Поставьте счетчик входов в Oncalculate() за одну секунду:

static int nCnt = 0;
static datetime dtLastSecond = 0;

if (dtLastSecond == TimeCurrent())
{
   ++nCnt;
   if (nCnt > <сколько раз в секунду>)
      return;
}

dtLastSecond = TimeCurrent();
nCnt = 0;
P. S. У Вас в теме написано одно, а по факту требуется другое. Вот и угадывают тут люди.
 
Ihor Herasko:

Поставьте счетчик входов в Oncalculate() за одну секунду:

P. S. У Вас в теме написано одно, а по факту требуется другое. Вот и угадывают тут люди.

Вот огромное спасибо! Сейчас перформанс протестирую.  

А по поводу формулировки - Ну чтобы задать хороший вопрос надо знать половину ответа! А тут в дебрях MT5  я плаваю. Базовые вещи в документации очень поверхностно. И все примеры используют oncalculate без всяких ограничетелей или ontimer - нигде даже не видел упоминания о том , что так будет тормозить при реальной наргузке 


p.s. Хмм подумав  немного по логике получается что  если в секунду придёт 5 тиков, то вычисления отложатся до следующей секунды. Не совсем комильфо. Надо всё таки хотя бы несколько раз в секунду обрабатывать. 

Может действительно OnTimer?  - но как тогда получать

const int rates_total,                 const int prev_calculated,                 const datetime &time[],                 const double &open[],                 const double &high[],                 const double &low[],                 const double &close[],


,

 
Max B:

Хмм подумав  немного по логике получается что  если в секунду придёт 5 тиков, то вычисления отложатся до следующей секунды.

Не понял. На чем основан такой вывод?

Код пробовали запускать?

 
Ihor Herasko:

Не понял. На чем основан такой вывод?

Код пробовали запускать?

Да .- Нормально работает. Снизил нагрузку. Спасибо. Насчёт  стоп через 5 тиков - протупил 

 
Max B:

Да .- Нормально работает. Снизил нагрузку. Спасибо. Насчёт  стоп через 5 тиков - протупил 

У вас там что-то сложное считается, что нужно именно по тикам делать пересчёт? 

 
Vitaly Muzichenko:

У вас там что-то сложное считается, что нужно именно по тикам делать пересчёт? 

Да как раз не надо в каждом тике , потому что  расчётов много и тормозит . Надо несколько раз в секунду (или реже). Засада в том , что OnCalculate вызывается каждый тик. Ну вот и приходиться извращаться

Было бы проще если было бы событие OnNewBar . В общем пока вариант вышепредложенный сработал удовлетворительно на десктопе.     Но  на VPS  не достаточно , вариант Игоря хотя и быстрее, но всё равно десинхронизируется  периодечески во время загрузки. Могу конечно попробовать более мощный VPS купить

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

 
Max B:

Да как раз не надо в каждом тике , потому что  расчётов много и тормозит . Надо несколько раз в секунду (или реже). Засада в том , что OnCalculate вызывается каждый тик. Ну вот и приходиться извращаться

Было бы проще если было бы событие OnNewBar . В общем пока вариант вышепредложенный сработал удовлетворительно на десктопе.     Но  на VPS  не достаточно , вариант Игоря хотя и быстрее, но всё равно десинхронизируется  периодечески во время загрузки. Могу конечно попробовать более мощный VPS купить

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

Так оно есть

   if(rates_total-prev_calculated==0)
      return(rates_total);
 
Max B:

Да как раз не надо в каждом тике , потому что  расчётов много и тормозит . Надо несколько раз в секунду (или реже). Засада в том , что OnCalculate вызывается каждый тик. Ну вот и приходиться извращаться

Было бы проще если было бы событие OnNewBar . В общем пока вариант вышепредложенный сработал удовлетворительно на десктопе.     Но  на VPS  не достаточно , вариант Игоря хотя и быстрее, но всё равно десинхронизируется  периодечески во время загрузки. Могу конечно попробовать более мощный VPS купить

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

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

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