[SOLVED] Индикаторы неправильно инстанцируются при вызове/создании из индикатора другого рабочего таймфрейма. - страница 2

 
Alain Verleyen:

Вы повторяете "не удается инстанцировать", но это не точно. Индикатор инстанцируется во всех случаях.

Проблема в том, что данные не доступны синхронно, и вам придется с этим смириться. Это НЕ баг МТ5, это ФАКТУРА.

Я предлагаю прекратить дискуссию и подождать ответа SD.

Возможно, я неправильно сформулировал, что независимо от количества циклов и ожиданий, вы не сможете получить доступ к данным индикатора (различных TF) до первого прохода (*edit) OnCalculate();

Я вполне допускаю, что могу ошибаться, поэтому я предлагаю вознаграждение в $10, если вы сможете доказать обратное. Пожалуйста... докажите, что я не прав. Мне нужно обходное решение для этой глупой ошибки, простите, я имею в виду "особенность".

 
nicholishen:

Возможно, я не правильно сформулировал, что независимо от количества циклов и ожиданий, вы не сможете получить доступ к данным индикатора (различных TF) до первого прохода (*edit) OnCalculate();

Я вполне допускаю, что могу ошибаться, поэтому я предлагаю вознаграждение в $10, если вы сможете доказать обратное. Пожалуйста... докажите, что я не прав. Мне нужно обходное решение для этой глупой ошибки, простите, я имею в виду "особенность".

Зачем вам это нужно при первом "проходе"? Если нужные данные недоступны, подождите, пока они появятся, вот и все.
 
Alain Verleyen:
Почему это нужно при первом "проходе"? Если нужные данные недоступны, подождите, пока они появятся, вот и все.

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

Почему мы должны идти на компромисс из-за этой ошибки? Что заставляет вас так яростно его защищать?

 
nicholishen:

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

Почему мы должны идти на компромисс из-за этой ошибки? Что вам мешает так яростно его защищать?

???

Я ничего не защищаю, и уж точно не "яростно". Пожалуйста, сохраняйте спокойствие.

 
Alain Verleyen:

???

Я ничего не защищаю, и уж точно не "яростно". Пожалуйста, оставайтесь спокойными.

Форум о трейдинге, автоматических торговых системах и тестировании торговых стратегий

[MQL5 BUG] Индикаторы неправильно инстанцируются при вызове/создании из индикатора другого рабочего таймфрейма.

Alain Verleyen, 2017.01.31 12:46

Ок вы мне не верите, это ваше право, но вы ошибаетесь

Я могу только посоветовать вам написать в ServiceDesk и, пожалуйста, сообщить об их ответе здесь.


OK.

Я разместил эту работу на случай, если кому-то интересно попробовать.

https://www.mql5.com/en/job/57516

 
nicholishen:

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

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

Ваша задача невыполнима из-за пункта 3:

3. Должен быть доступ к буферу при инициализации

Это просто противоречит архитектуре терминала и документации:

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

Также ознакомьтесь с функцией CopyBuffer:

Примечание

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

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

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

Documentation on MQL5: Technical Indicators
Documentation on MQL5: Technical Indicators
  • www.mql5.com
Technical Indicators - Reference on algorithmic/automated trading language for MetaTrader 5
 
Что касается вашей конкретной задачи, то ее можно легко решить другим способом. Вы не первый, кто строит индикатор на индикаторе и хочет, чтобы он работал в автономном режиме. Используйте таймер.
 
Stanislav Korotky:
Что касается вашей конкретной задачи, то ее можно легко решить другим способом. Вы не первый, кто строит индикатор на индикаторе и хочет, чтобы он работал в автономном режиме. Используйте таймер.
Пробовали. Не сработало.
 
nicholishen:
Попробовал. Не сработало.
Опубликуйте более конкретный вопрос с примером кода. Это может быть багги. Этот подход работает для меня.
 
Stanislav Korotky:
Опубликуйте более конкретный вопрос с примером кода. Он может быть глючным. У меня этот подход работает.
Я не понимаю, как я могу быть более конкретным, чем я уже сделал...

Никакое количество таймеров или циклов не может преодолеть тот факт, что индикатор не будет инстанцироваться до тех пор, пока Oncalculate не вернется хотя бы один раз. Рекурсия также не работает.