Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Alexey Navoykov
3996
Alexey Navoykov 2013.01.15 21:14  
alsu:

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

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

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

Алексей Тарабанов
7275
Алексей Тарабанов 2013.01.15 21:40  
Две немного разные функции. В разных единицах измеряются. имхенько, конечно. 
Alexey Subbotin
4998
Alexey Subbotin 2013.01.16 05:55  
Meat:

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

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

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

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


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

Alexey Navoykov
3996
Alexey Navoykov 2013.01.16 16:42  
alsu:

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

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

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

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

Vadim Zhunko
5227
Vadim Zhunko 2013.01.16 18:17  
alsu:

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

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

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

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

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий