Пользовательский индикатор. Функция паузы. Зависает терминал - страница 2

 
alsu:

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

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

Вообще конечно этот идиотизм, который разработчики намутили с работой индикаторов, до сих пор вызывает недоумение. Ну как можно было так строить программу... Что они курили в этот момент... Помимо загрузки интерфейсного потока есть и другие "фичи", например то, что при старте терминала сначала запускаются индикаторы, а уже потом появляются окна и всё остальное. Спрашивается, нахрена нужен расчёт индикаторов, если ещё нет даже окон, где они будут отрисовываться? Поэтому невозможно получить хэндл окна и некоторые другие значения, относящиеся к окнам. Т.е. отработка индикатора получается неполноценной. И при этом пользователь вынужден лицезреть пустой экран, ожидая пока запустятся все индикаторы, а потому терминал. По логике то следовало бы сделать всё наоборот: сначала запуск терминала, а уже потом индикаторов.  Но у метаквотсов своя логика, всем логикам логика... 

 
Две немного разные функции. В разных единицах измеряются. имхенько, конечно. 
 
Meat:

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

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

Вообще конечно этот идиотизм, который разработчики намутили с работой индикаторов, до сих пор вызывает недоумение. Ну как можно было так строить программу... Что они курили в этот момент... Помимо загрузки интерфейсного потока есть и другие "фичи", например то, что при старте терминала сначала запускаются индикаторы, а уже потом появляются окна и всё остальное. Спрашивается, нахрена нужен расчёт индикаторов, если ещё нет даже окон, где они будут отрисовываться? Поэтому невозможно получить хэндл окна и некоторые другие значения, относящиеся к окнам. Т.е. отработка индикатора получается неполноценной. И при этом пользователь вынужден лицезреть пустой экран, ожидая пока запустятся все индикаторы, а потому терминал. По логике то следовало бы сделать всё наоборот: сначала запуск терминала, а уже потом индикаторов.  Но у метаквотсов своя логика, всем логикам логика... 

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


PS Кстати, если очень надо, терминальный поток во время работы индикатора можно "развиснуть", периодически вручную разбирая очередь сообщений (через длл, естественно). Но тут надо быть очень аккуратным, учитывать всякие особенности обработки собщений в МТ, например, то, что сообщение прихода нового тика является триггером для срабатывания функции start, из которой, мы помним, и вызван перебо очереди: можно попасть)) в рекурсию))). Или, например, то как подкачивается история после разрыва: интересно, что сначала появляется последний тик и, соответственно, свечка, а потом только заполняется дыра.

 
alsu:

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

 Ну если советник торгует автоматически, то он и без всего этого может обойтись.

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

 Вообще было бы неплохо как-нибудь отыскать адрес функции старт(), чтобы напрямую запускать обработку индикатора, минуя очередь сообщений. В частности, запускать из разных потоков. Это бы сразу решило все проблемы с блокировкой главного потока и существенно улучшило работу терминала. Хотя это уже наверно можно счесть хакерством... Но если оно идёт во благо? :)

 
alsu:

PS Кстати, если очень надо, терминальный поток во время работы индикатора можно "развиснуть", периодически вручную разбирая очередь сообщений (через длл, естественно). Но тут надо быть очень аккуратным, учитывать всякие особенности обработки собщений в МТ, например, то, что сообщение прихода нового тика является триггером для срабатывания функции start, из которой, мы помним, и вызван перебо очереди: можно попасть)) в рекурсию))). Или, например, то как подкачивается история после разрыва: интересно, что сначала появляется последний тик и, соответственно, свечка, а потом только заполняется дыра.

Это не проблема. Сделать DLL невыгружаемой и разбор очереди в отдельном потоке. Один раз вызывается функция. Она запускает поток и завершается. Поток останавливается при завершении процесса терминала.
 
Zhunko:
Это не проблема. Сделать DLL невыгружаемой и разбор очереди в отдельном потоке. Один раз вызывается функция. Она запускает поток и завершается. Поток останавливается при завершении процесса терминала.

Просто говорю надо аккуратно: те сообщения, которые можно обработать, обработать (например, ввод и отрисовку), а те, что хорошо бы оставить до завершения функции start() (тики, история,...), соответственно оставить в очереди.

ЗЫ Вадим, я понимаю, что у некоторых возня с WinAPI не вызывает вопросов, но не у всех же))

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