Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Поиск на MQL5.community ведется во всех разделах. Попробуй сам!
. ... Rick D. ... .
1079
. ... Rick D. ... . 2015.09.20 11:32 

Есть индикатор. В нем есть OnTimer, который прекрасно отрабатывает, если поместить индикатор на чарт.

Есть эксперт. В нем есть OnTimer, который прекрасно отрабатывает, если поместить эксперт на чарт.

Эксперт вызывает индикатор через iCustom. При этом таймер в индикаторе не отрабатывает.

Это баг или так задумано?

. ... Rick D. ... .
1079
. ... Rick D. ... . 2015.09.20 11:36  
EventSetMillisecondTimer в индикаторе при этом возвращает false, а GetLastError() возвращает 4051 (ERR_INVALID_FUNCTION_PARAMVALUE)
Slawa
Модератор
6681
Slawa 2015.09.21 06:49  
RickD:

Есть индикатор. В нем есть OnTimer, который прекрасно отрабатывает, если поместить индикатор на чарт.

Есть эксперт. В нем есть OnTimer, который прекрасно отрабатывает, если поместить эксперт на чарт.

Эксперт вызывает индикатор через iCustom. При этом таймер в индикаторе не отрабатывает.

Это баг или так задумано?

Это - ограничение архитектуры.

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

. ... Rick D. ... .
1079
. ... Rick D. ... . 2015.09.21 19:13  

А можно это как-то изменить/улучшить?

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

Когда индикатор вызывается из эксперта, и долго нет тиков (или выходные), то новости не показываются.

Slawa
Модератор
6681
Slawa 2015.09.22 05:25  

Повторяю. Это - ограничение архитектуры. Чтобы изменить поведение индикаторов, надо менять архитектуру клиентского терминала. Мы этого делать не будем.

Накидывайте нужный индикатор непосредственно на график.

. ... Rick D. ... .
1079
. ... Rick D. ... . 2015.09.23 00:09  

Подскажите такой момент.

1) Почему когда я в эксперте в OnTimer вызывают индикатор через iCustom, то в индикаторе не срабатывает OnCalculate?

2) Можно ли в таком случае в эксперте вызвать EventChartCustom, а в вызываемом через iCustom индикаторе поймать OnChartEvent?

Slawa
Модератор
6681
Slawa 2015.09.23 06:39  

1. Потому что исходные данные у индикатора не изменились. OnCalculate вызывается только при изменении данных (приход новой котировки). Дальнейшие запросы вплоть до прихода следующей котировки не приводят к вызову расчёта

2. Нет. Тут такая же ситуация как и с таймером.

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

hrenfx
3680
hrenfx 2015.09.23 06:59  

Или офорляйте индикаторы в виде производных класссов, запихивая их в в советник, как соответствующие экземпляры. Тогда можно будет навсегда забыть про ограничения iCustom, вызывая индикаторы напрямую в советнике со всеми Timer и Event-событиями. При этом еще и экономя на памяти и вычислительных ресурсах.

Надо всего один раз сделать, а дальше пойдет, как по маслу. И будете вспоминать про iCustom, как про страшный сон.

А если захотите визуализировать свои индикаторные классы, то внтури MT4 создаете экземпляр индикатор-класса и прописываете только код: буффер = значение. 

. ... Rick D. ... .
1079
. ... Rick D. ... . 2015.09.23 09:40  
stringo:

1. Потому что исходные данные у индикатора не изменились. OnCalculate вызывается только при изменении данных (приход новой котировки). Дальнейшие запросы вплоть до прихода следующей котировки не приводят к вызову расчёта

2. Нет. Тут такая же ситуация как и с таймером.

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

1) Такой обмен данынми уже организован. Чтобы брать данные из индикатора. Но как такой обмен скажет индикатору обновлять значение времени, выводимое на чарт, и сами данные раз в секунду?

2) Кстати - а если значение какого-то параметра индикатора изменилось динамически, то вызов iCustom тоже не приведет к вызову OnCalculate?

3) Если из эксперта послать в чарт PostMessage для эмуляции прихода новой котировки - OnCalculate не вызовется?
. ... Rick D. ... .
1079
. ... Rick D. ... . 2015.09.23 09:42  
hrenfx:

Или офорляйте индикаторы в виде производных класссов, запихивая их в в советник, как соответствующие экземпляры. Тогда можно будет навсегда забыть про ограничения iCustom, вызывая индикаторы напрямую в советнике со всеми Timer и Event-событиями. При этом еще и экономя на памяти и вычислительных ресурсах.

Надо всего один раз сделать, а дальше пойдет, как по маслу. И будете вспоминать про iCustom, как про страшный сон.

А если захотите визуализировать свои индикаторные классы, то внтури MT4 создаете экземпляр индикатор-класса и прописываете только код: буффер = значение. 

Да. Это пожалуй выход. Встраивать код индикатора напрямую в советник. Хотя не самый красивый и удобный.

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