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

 

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

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

Ошибки, баги, вопросы

Sergey Diubakin, 2016.10.09 10:48

Версия и битность терминала

Version: 5.00, build 1445 (07.10.2016), 32 bit.

Описание проблемы

В индикаторе не удаётся скопировать данные стандартных индикаторов (встроенных в МТ5)  с другого таймфрейма (отличающегося от текущего таймфрейма графика на котором установлен индикатор). При этом "хэндл" стандартного индикатора получить удаётся, но функция CopyBuffer() постоянно возвращает значение -1. В тестере в режиме визуализации данная проблема не возникает, а в терминале на графике (к которому добавлен индикатор) проблема присутствует постоянно.

Последовательность действий

Описана выше.

Полученный результат

Описан выше.

Ожидаемый результат

Корректное копирование в индикаторе данных стандартных (и пользовательских желательно тоже) индикаторов с других таймфреймов.

Дополнительные сведения

В более ранних "билдах" данная проблема не возникала.

Кто-нибудь сталкивался с подобной проблемой? "Баг" терминала или мой?


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

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

Задача: получить значения фракталов периода Н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:

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


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

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

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

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

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

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

ничего не помогает, результат

ERR_INDICATOR_DATA_NOT_FOUND

4806

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

Рашид как-то находил работающий пример. Погляди.
 
Artyom Trishkin:
Рашид как-то находил работающий пример. Погляди.

Увы и ах...

TradePad_Sample - эксперт для MetaTrader 5


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

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

Alexey Viktorov, 2017.07.08 10:39


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

ничего не помогает, результат

ERR_INDICATOR_DATA_NOT_FOUND

4806

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


 
Alexey Viktorov:

Попробуйте мой костыль:

        double getIndy( int handle, int buff, int bar )
        {
                if( handle == INVALID_HANDLE ) return(EMPTY_VALUE);

                double array[];
                if( CopyBuffer( handle, buff, bar, 1, array ) > 0 ) return(array[0]);

                int err=GetLastError();
                Print( " * Can't get indicator data (handle = ",handle,", buff = ",buff,", bar = ",bar,")! ERROR #",err,"!!!");

                //--- https://www.mql5.com/ru/articles/5
                //--- если номер ошибки 4806, то данные просто не успели подгрузиться
                if(err==4806)
                {
                        Print( " ** Trying to load data...");
                        //--- ждем, пока данные загрузятся
                        for(int i=0; i<1000;++ i)
                        {
                                Sleep(1);
                                if(BarsCalculated(handle)>0) break;
                        }

                        //--- попытаемся скопировать данные индикатора еще раз
                        if( CopyBuffer( handle, buff, bar, 1, array ) > 0 ) return(array[0]);

                        Print( " *** Still can't get indicator data!");
                }

                return(EMPTY_VALUE);
        }

И понаблюдайте за логами.

 
Andrey Khatimlianskii:

Попробуйте мой костыль:

И понаблюдайте за логами.

Это я уже видел в ветке Артёма и пробовал применить, но не получилось. Предположительно по причине того, что мне хотелось-бы получить данные индикатора PERIOD_H1, запущенного на PERIOD_M5 в int OnInit().

После загрузки индикатора эти данные приходят, приходят и в том случае если рядом открыт график PERIOD_H1. Я пробовал программно добавить график PERIOD_H1, добавить на него индикатор или применить шаблон с индикатором перед чтением буфера, но всё безрезультатно.

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

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

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

 
Alexey Viktorov:

Это я уже видел в ветке Артёма и пробовал применить, но не получилось. Предположительно по причине того, что мне хотелось-бы получить данные индикатора PERIOD_H1, запущенного на PERIOD_M5 в int OnInit().

После загрузки индикатора эти данные приходят, приходят и в том случае если рядом открыт график PERIOD_H1. Я пробовал программно добавить график PERIOD_H1, добавить на него индикатор или применить шаблон с индикатором перед чтением буфера, но всё безрезультатно.

Да, у меня тоже из советника код.

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

Если не справитесь, скажите, повырезаю куски кода.

 
Andrey Khatimlianskii:

Да, у меня тоже из советника код.

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

Если не справитесь, скажите, повырезаю куски кода.

Спасибо, буду иметь ввиду.
Причина обращения: