Аналоги Sleep для таймера в индикаторе - или как синхронизировать время - страница 2

 
fxsaber:

Это решение совсем другой задачи. И оно может обойтись без TimeLocal.

В задаче сказано в начале минуты, как мы поймаем начало минуты без локального времени? Тики могут прийти с запозданием.

И цель задания ясно поставлена Проблема: индикатор должен выполнять действие через заданный промежуток времени, например, через каждые 5 минут моё предложение полностью решает поставленные задачи, и с высокой точностью.

 
Alexey Valeev:

В задаче сказано в начале минуты, как мы поймаем начало минуты без локального времени? Тики могут прийти с запозданием.

Реализация показал. К тикам не привязано - таймер.

И цель задания ясно поставлена Проблема: индикатор должен выполнять действие через заданный промежуток времени, например, через каждые 5 минут моё предложение полностью решает поставленные задачи, и с высокой точностью.

Вы предлагаете использовать мелкий таймер и в нем делать фильтр. Так можно и совсем без таймера обойтись - OnChartEvent+ChartCustom.

 

А почему не посмотреть на текущее время при запуске и не установить первый таймер с интервалом = искомое время - текущее?

А после первого срабатывания переустановить таймер на нужный интервал.

Например, если запустились в 00:01:40, поставить таймер на 3 минуты 20 секунд. И, когда он сработает в 00:05:00, поставить новый, с разрешением 5 минут ровно.

Попробуете?

 
Andrey Khatimlianskii:

А почему не посмотреть на текущее время при запуске и не установить первый таймер с интервалом = искомое время - текущее?

А после первого срабатывания переустановить таймер на нужный интервал.

Например, если запустились в 00:01:40, поставить таймер на 3 минуты 20 секунд. И, когда он сработает в 00:05:00, поставить новый, с разрешением 5 минут ровно.

Попробуете?

Андрей, такой вариант реализовал еще днем, но эти операции расчетов занимают незначительные доли секунды, и если первые 10 минут таймер дает ответ в диапазоне 0,600-0,900 с,  то через 10 минут работы этого же таймера (никаких перезапусков после единственного не было) - таймер стал запускаться в 1,0-1,3 сек. от положенного времени.

Остановился на миллисекундном таймере с интервалом 250 мс и фильтре таймера по принципу поиска нового бара.

int OnInit()
  {
   int cnt=0;
   if(!(bool)MQLInfoInteger(MQL_TESTER))                                                    //Если работаем не в тестере
      EventSetMillisecondTimer(250);                                                        //активируем таймер
   time_last=TimeLocal()/(Period()*30);                                                     //количество интервалов с начала отсчета
   return(INIT_SUCCEEDED);
  }

void OnTimer()
  {
   uint q_interval=TimeLocal()/(Period()*30); bool newinterval=false;
   if(time_last<q_interval) { newinterval=true; time_last=q_interval; }                  //определяем время, наиболее соответствующее
   if(fmod(time_last,2)==0) newinterval=false; if(!newinterval) return;                  //  середине новой свечи
  }