Таймер

 

Собственно, вопрос -- почему таймер меряется в секундах?

Честно говоря, когда услышал, что будет нативный таймер, у меня даже мысли не возникло, что атомарной единицей времени будет секунда а не миллисекунда...

Не очень приятное (для себя) открытие сделал недавно, когда захотел использовать.


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

Опять же, это отличная замена функции Sleep в индюках, и опять же секунда это многовато.

Надеюсь, разработчики не оставят просьбу без внимания. Если надо, оформлю заявку в сервисдеске.

Тему открыл для обсуждения. Что думаете?

Общайтесь с разработчиками через Сервисдеск!
Общайтесь с разработчиками через Сервисдеск!
  • www.mql5.com
Ваше сообщение сразу станет доступно нашим отделам тестирования, технической поддержки и разработчикам торговой платформы.
 
TheXpert:

Собственно, вопрос -- почему таймер меряется в секундах?

Честно говоря, когда услышал, что будет нативный таймер, у меня даже мысли не возникло, что атомарной единицей времени будет секунда а не миллисекунда...

Не очень приятное (для себя) открытие сделал недавно, когда захотел использовать.


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

Опять же, это отличная замена функции Sleep в индюках, и опять же секунда это многовато.

Надеюсь, разработчики не оставят просьбу без внимания. Если надо, оформлю заявку в сервисдеске.

Тему открыл для обсуждения. Что думаете?

Поверьте на слово,  для текущей реализации торгового терминала и того алгоритма работы с потоками что применили в нем MQ секунды вполне подходящее решение.

Тем более что время в тестере генерируется на основе минутного графика (как я понял) и поэтому более мелкий масштаб времени там просто не покатит.

PS

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

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

 

Interesting:

Тем более что время в тестере генерируется на основе минутного графика (как я понял) и поэтому более мелкий масштаб времени там просто не покатит.

При чем здесь тестер?

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

Каким образом? Почему не возможен?

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

И что же случится? И насколько это страшнее, если таймер будет 1с?

Вы голову вообще подключаете, когда пишете комментарии?
 
TheXpert:

Собственно, вопрос -- почему таймер меряется в секундах?

Честно говоря, когда услышал, что будет нативный таймер, у меня даже мысли не возникло, что атомарной единицей времени будет секунда а не миллисекунда...

Не очень приятное (для себя) открытие сделал недавно, когда захотел использовать.


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

Опять же, это отличная замена функции Sleep в индюках, и опять же секунда это многовато.

Надеюсь, разработчики не оставят просьбу без внимания. Если надо, оформлю заявку в сервисдеске.

Тему открыл для обсуждения. Что думаете?

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

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

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

 
stringo:

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

Это можно сделать без таймера и кстати даже без геморроя -- просто посылать самому себе событие. Так почему бы не расширить функциональность?

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

Синхронизация может быть с данными. Например -- встроенного индикатора. Как решать такую синхронизацию в индикаторе? Про советников не спрашиваю, там все решаемо без особых проблем. А в индикаторе Sleep -- это простой всего потока, а значит всех остальных индикаторов. А это значит геморрой при синхронизации.

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

Придется, если ничего не поменяется...
 
TheXpert:

При чем здесь тестер?

Каким образом? Почему не возможен?

И что же случится? И насколько это страшнее, если таймер будет 1с?

Вы голову вообще подключаете, когда пишете комментарии?

Я думаю, что если Вам известно об атомарных единицах времени, то наверно известно о том как организованы процессы и потоки в ОС и остальном ПО.

Но напомню (на всякий случай, может есть те кто не в курсе) основные вещи  - Все что происходит в системе разбито на процессы и потоки, у каждого процесса может быть от одного потока до нескольких. Грубо говоря каждый исполняемый файл запущенный в системе это ПРОЦЕСС. Каждый процесс имеет свой приоритет, также свой приоритет имеет и каждый поток в этом процессе.

На основании этих приоритетов система выделяет процессорное время каждому процессу (или потоку определенного процесса).

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

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

При этом для каждого графика формируется свой поток событий которые последовательно обрабатывается системой.

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

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

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

void OnTimer()
{
//----------------------------------------------------------------------------//
//Work variables
//----------------------------------------------------------------------------//
Print(TimeLocal());
Sleep(2000);
//----------------------------------------------------------------------------//
}

PS

На счет тестера стратегий - А как Вы предлагаете формировать там время?

 

Interesting:

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

С каких это пор? Со скриптами и советниками проблем вообще не вижу, т.к. они работают каждый в своем потоке.

А индикаторы ВСЕ работают в ОДНОМ потоке, да будет вам известно, и это очень сильно усложняет задачу организации таймера в любом индюке. А иногда очень хочется.

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

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

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

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

На счет тестера стратегий - А как Вы предлагаете формировать там время?
А никак, меня в нем пока все устраивает.
 
TheXpert:

С каких это пор? Со скриптами и советниками проблем вообще не вижу, т.к. они работают каждый в своем потоке.

А индикаторы ВСЕ работают в ОДНОМ потоке, да будет вам известно, и это очень сильно усложняет задачу организации таймера в любом индюке. А иногда очень хочется.


Хотел не отвечать, но не сдержался

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

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

Что наверно в и стоило сказать по поводу индюков.

TheXpert:

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

А кто бы сомневался что он рабочий , только таймер (вот зараза) выполняется каждые 2 секунды вместо заявленной 1, которую и указал в блоке инициализации.

Специально для Вас, закоодил это в эксперт, хотя проблему с вызовом таймера и так видно было (Будем считать что для наглядности, говорят что в картинках все удобней и проще донести)...

Теперь только осталось выяснить как будет вызываться OnTimer каждых 500 миллисекунд если время обработки OnTime займет 1 секунду (в примере секунду и две соответственно)?

TheXpert:

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

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

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

Так не посылайте собеседника, а лучше объясните в чем он не прав или так и напишите: "ты не прав, ищи инфу в гугле".

На сколько я понимаю форум - обоюдовыгодная беседа, если есть вопросы только к разработчику вперед в сервисдеск.

To Interesting

Я проводил эксперименты с быстродействием MQL5, так вот скажу: Большинство экспертов выполняют функцию OnTick меньше чем за 0.1 секунды.


To TheXpert

Куда вы так торопитесь?
Но я не вижу смысла в таймере меньше секунды. Мы что рассчитываем когда столкнутся два электрона?
Если так, то вперед цикл и Sleep().

 

mrProF:

To Interesting

Я проводил эксперименты с быстродействием MQL5, так вот скажу: Большинство экспертов выполняют функцию OnTick меньше чем за 0.1 секунды.

Смотря что туда поместить и сколько данных обработать, а что MQL5 достаточно быстр я не спорю...
 

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

mrProF:

Но я не вижу смысла в таймере меньше секунды.

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

Если так, то вперед цикл и Sleep().

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