Получение данных индикатором с другого индикатора на большем тайм фрейме

 

Здравствуйте.

В индикаторе (5 мин ТФ) пробую получить данные с другого индикатора (1 час ТФ). Система выдает ошибку 4806 - "Запрашиваемые данные не найдены". Однако, если второй индикатор (с большего ТФ) запущен на параллельном графике, то мой индикатор работает. Как заставить индикатор работать без открытия второго графика?

Для примера сделал индикатор, который запускаю на 5 мин. ТФ. Он и пытается получить данные индикатора АТР с часовика.

Выдает ошибку:

А вот так не выдает:

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

 
savinkins:

Здравствуйте.

В индикаторе (5 мин ТФ) пробую получить данные с другого индикатора (1 час ТФ). Система выдает ошибку 4806 - "Запрашиваемые данные не найдены". Однако, если второй индикатор (с большего ТФ) запущен на параллельном графике, то данные мой индикатор работает. Как заставить индикатор работать без открытия второго графика?

Для примера сделал индикатор, который на 5 мин. ТФ пытается получить данные индикатора АТР с часовика.

Выдает ошибку:

А вот так не выдает:

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


Рекомендую приложить индикатор в виде файла для начала - с картинкой мало кто будет работать...

 
-Aleks-:

Рекомендую приложить индикатор в виде файла для начала - с картинкой мало кто будет работать...

Я подумал, что проблема известная, так подскажут. Но спасибо за совет. Вот файл.
Файлы:
Test_Ind.mq5  4 kb
 
savinkins:
Я подумал, что проблема известная, так подскажут. Но спасибо за совет. Вот файл.

Проблема не только известная, но и измусоленная

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

Запрошенные данные не найдены.

Alexey Viktorov, 2017.07.08 10:39

Вопрос поднимался ещё в далёком сентябре 2016 года, но так и ничего не исправлено или я не смог найти решение проблемы?


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

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

Задача: получить значения фракталов периода Н1 при запуске индикатора на периоде М5.

int hadle;
double arr[];
/**************Custom indicator initialization function**************/
int OnInit()
{
   hadle = iFractals(_Symbol, PERIOD_H1);
   int size = CopyBuffer(hadle, 0, 0, 1000, arr);
   if(size < 0)
    {
     Print("Ошибка CopyBuffer ", GetLastError());
    }
   return(INIT_SUCCEEDED);
}/*******************************************************************/

И абсолютно не важно где расположить CopyBuffer() в OnInit() или в OnCalculate()

Даже пробовал открывать новое окно графика с указанным периодом Н1

long idChart = ChartOpen(_Symbol, PERIOD_H1);

добавлять на него индикатор, или применять шаблон с индикатором обновлять этот график

   ChartIndicatorAdd(idChart, 0, hadle);
   ChartRedraw(idChart);
ничего не помогает, результат

ERR_INDICATOR_DATA_NOT_FOUND

4806

Запрошенные данные не найдены

там есть ещё ссылки на другие темы.
 
Alexey Viktorov:

Проблема не только известная, но и измусоленная

там есть ещё ссылки на другие темы.

Спасибо за информацию. Посмотрел, но, честно говоря, не понял, как это исправляется. Похоже, что причина в особенности платформы, которую я не знаю.

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

 
savinkins:

Спасибо за информацию. Посмотрел, но, честно говоря, не понял, как это исправляется. Похоже, что причина в особенности платформы, которую я не знаю.

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

Пока решения не вижу

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

Запрошенные данные не найдены.

Alexey Viktorov, 2017.07.11 07:52


Предположительно надо проверить такой вариант:

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

Но пока нет времени и желания над этим колдовать.


Если есть желание можете проверить эту идею.

 
savinkins:

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

У советника с синхронизацией проще. Если визуализация на другом ТФ не нужна, не заморачивайтесь, а подключайте индикатор с нужного ТФ к советнику.

 

Попробуйте решить задачу с помощью нестандартных методов. Например, так:

https://www.mql5.com/ru/articles/81

Переход с MQL4 на MQL5
Переход с MQL4 на MQL5
  • 2010.05.11
  • Sergey Pavlov
  • www.mql5.com
Данная статья, построенная в форме справочника по функциям MQL4, призвана помочь переходу с MQL4 на MQL5. Для каждой функции языка MQL4 приведено описание и представлен способ ее реализации на MQL5, что позволит вам значительно ускорить перевод своих программ с MQL4 на MQL5. Для удобства функции разбиты на группы, как в документации по MQL4.
 
savinkins:

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

Здравствуйте. На каждом тике нужно проверять синхронизацию старшего ТФ. Т.е. вызывать функцию SeriesInfoInteger() с идентификатором синхронизации (посмотрите по документации). Либо же вызывать функцию Bars() с нужным символом/ТФ и сравнивать с -1. Насколько я помню, если таймсерия не синхронизирована то и синхронизация вернет false, и  Bars() вернет -1. Также, Вам нужно сравнить количество просчитанных баров (Bars()) и количество просчитанных баров индикатора (BarsCalculated()) на равенство. 
 
Alexey Kozitsyn:
Здравствуйте. На каждом тике нужно проверять синхронизацию старшего ТФ. Т.е. вызывать функцию SeriesInfoInteger() с идентификатором синхронизации (посмотрите по документации). Либо же вызывать функцию Bars() с нужным символом/ТФ и сравнивать с -1. Насколько я помню, если таймсерия не синхронизирована то и синхронизация вернет false, и  Bars() вернет -1. Также, Вам нужно сравнить количество просчитанных баров (Bars()) и количество просчитанных баров индикатора (BarsCalculated()) на равенство. 

Bars() возвращает -1. Насколько я понимаю, синхронизация нужна тогда, когда информация подгрузиться не успевает. А здесь она вообще не идет.

 

Спасибо за помощь.

Похоже, на моем уровне программирования задача не решаемая.

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

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