Таймер - страница 2

 
TheXpert:

Еще один... Вы не братья часом?

Что не значит, что его нет. Задачи у всех разные.

Приплыли... Читать умеем? Покажите, как это делается для индюков.


  1. Вроде нет, даж не знаю кто эт :D
  2. Ну я честно не сталкивался с такой задачей, для моих задач - чем быстрее считает - тем лучше.
  3. Извиняюсь, просмотрел)) Сильно не вникал в каких потоках - что творится. Так зависит от задачи, действительно если только запускать какой-нибудь левый скрипт который будет стучатся в индюк.
Или еще как вариант - затолкать в dll-ку вычисления и все подряд и в отдельный поток - но это на извращения похоже.
 

Interesting:

... обработка таймера не может быть вызвана до тех пор пока условно говоря не окончена предыдущая обработка таймера. Или говоря проще, OnTimer() не получит право на выполнение до тех пор пока поток который должен его обработать занят. 

Для иллюстрации невозможности запуска обработки таймера вторым потоком можно воспользоваться этим примером (тупо но наглядно):

int OnInit()
{
//----------------------------------------------------------------------------//
//Work variables
//----------------------------------------------------------------------------//
EventSetTimer(1);
//----------------------------------------------------------------------------//
return(0);
//----------------------------------------------------------------------------//
}

void OnTimer()
{
//----------------------------------------------------------------------------//
//Work variables
//----------------------------------------------------------------------------//
Print(TimeLocal());
Sleep(2000);
//----------------------------------------------------------------------------//
}
Т.е. получается, что события Timer могут игнорироваться также, как и события NewTick? И при определённых условиях могут не ставиться в очередь событий эксперта?
 
Yedelkin:
Т.е. получается, что события Timer могут игнорироваться также, как и события NewTick? И при определённых условиях могут не ставиться в очередь событий эксперта?
Событие NewTick является исключением в данном случае. Проверок для других типов событий нет. Если обработчики событий будут работать медленнее, чем заполняется очередь событий, то очередь переполнится, и часть событий будет пропускаться. Что касается приведенного примера, то он лишь подтверждает, что поток выполнения эксперта один и обработка событий выполняется последовательно, в порядке попадания событий в очередь.
Документация по MQL5: Программы MQL5 / События клиентского терминала
Документация по MQL5: Программы MQL5 / События клиентского терминала
  • www.mql5.com
Программы MQL5 / События клиентского терминала - Документация по MQL5
 
antt:
Событие NewTick является исключением в данном случае. Проверок для других типов событий нет. Если обработчики событий будут работать медленнее, чем заполняется очередь событий, то очередь переполнится, и часть событий будет пропускаться. Что касается приведенного примера, то он лишь подтверждает, что поток выполнения эксперта один и обработка событий выполняется последовательно, в порядке попадания событий в очередь.

Отлично, спасибо за пояснения! Логично и доходчиво, ничего домысливать не надо

Interesting, вроде как на Ваш вопрос о многопоточности обработки событий ответ получен. И я даже угадал насчёт OnTimer'а :)

 
Yedelkin:
Т.е. получается, что события Timer могут игнорироваться также, как и события NewTick? И при определённых условиях могут не ставиться в очередь событий эксперта?

Насколько я понял дело обстоит примерно так:

1. все события ставятся в одну очередь. Если в очереди есть событие NewTick или такое событие обрабатывается то NewTick игнорируется и не ставится в очередь.

2. Программист самостоятельно выбирает какие события и как он будет обрабатывать. При этом обработчики для OnTrade, OnTimer и OnTick являются основными и часто используемыми в советниках.

3. Во время обработки одного события другие обрабатываться не могут.

4. если стек событий переполняются старые события удаляются из очереди без обработки.

5. Из приведенных выше трех типов событий реже всего будет генерироваться Trade, а чаще всего NewTick (но при этом тики как описано выше могут не включаться в очередь).

6. Самым интересным обработчиком с этой точки зрения становится OnChartEvent, который обрабатывает все события с графика + пользовательские события.

При этом именно большое количество этих событий с легкостью может переполнить очередь событий (в том случае если таких событий будет очень много).

Спасает в этой ситуации на мой взгляд только то что события обрабатываемые в OnChartEvent генерируются бессистемно и асинхронно.

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика - Документация по MQL5
 

Yedelkin:

Interesting, вроде как на Ваш вопрос о многопоточности обработки событий ответ получен. И я даже угадал насчёт OnTimer'а :)

Да я в принципе и не сомневался в одном потоке, тем более в самом эксперте код выполняется в один поток.

А то что я описал это как бы мечты о будущем (скажем о MT6), когда в МТ появится многопоточность (как минимум до тех пор пока по каким-то причинам не будет разделен поток событий).

Я бы изначально как минимум выделил все события ChartEvent в отдельный поток, но разработчикам тут видней...

 

Есть ли какой-нибудь способ заставить советник генерировать события Timer в определённое время? Например, в начале последней минуты часа или дня. 

 
Yedelkin:

Есть ли какой-нибудь способ заставить советник генерировать события Timer в определённое время? Например, в начале последней минуты часа или дня. 

Конечно.
 
TheXpert:
Конечно.  
Как он (способ) выглядит, если не секрет?
 
Yedelkin:
Как он (способ) выглядит, если не секрет?

Использование менеджера таймеров. Хотел статью тиснуть, потом как-то отошло в сторону. Хотя на статью может и не потянет.

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

Тем более таймер он только один.

Надо?

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