Ошибки, баги, вопросы - страница 595

 
-Alexey-:
Попробуйте переложить на С - ошибка сама найдется. Да и вообще - с такими проектами только на нем и писать, если не хочешь проблем в будущем. К сожалению, сам я это слишком поздно понял и теперь переписываю :)
Возможно в ближайшем будущем изучу и C++. За последние полгода и так уже голова наполнилась: MQL4, MQL5, HTML, CSS, XML. И сейчас ещё JavaScript изучаю. Для C++ пока места и времени нет, хотя очень хочется.)) 
 

Имеем индикатор запускаемый на ТФ M15, в коде индикатор запрашивает таймсерию MqlRates с ТФ M1.

Индикатор не запускается сразу тк данные М1 не готовы, и добиться их загрузки при первом запуске не получается.

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

Сейчас я делаю запуск индикатора двумя способами:

  1. Запускаю индикатор на М15, удаляю индикатор и снова запускаю (всё работает).
  2. Перед запуском индикатора на М15 открываю чарт на М1, запускаю индикатор на М15 (всё работает с первого раза).

Отсюда вопрос: как правильно автоматизировать проверку и загрузку нужных данных другого ТФ?

 
Urain:

Отсюда вопрос: как правильно автоматизировать проверку и загрузку нужных данных другого ТФ?

В подобной ситуации контролирую процесс инициализации в OnCalculate. Если есть ошибка при инициализации, то возвращаю prev_calculated=0, и так пока все корректно не посчитается.
 
Lizar:
В подобной ситуации контролирую процесс инициализации в OnCalculate. Если есть ошибка при инициализации, то возвращаю prev_calculated=0, и так пока все корректно не посчитается.

Идея хорошая, хотя в prev_calculated ничего присвоить нельзя, переменная объявлена как const, но я вас понял можно завести другую аналогичную переменную.

Остаётся один вопрос, а если данных так и нет, чего делать?

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

 
Urain:

Идея хорошая, хотя в prev_calculated ничего присвоить нельзя, переменная объявлена как const, но я вас понял можно завести другую аналогичную переменную.

а не в присваивании дело!  Дело в числе, какое возвращает OnCalculated.  Если ваши данные не готовы, то вы соответственно из OnCalculated возвращаете 0.
Посмотрите на примеры по BarsCalculated.  Именно через него и надо делать проверку.

Остаётся один вопрос, а если данных так и нет, чего делать?

если их нет и не появятся, то и делать особо нечего.
Если хотите, можете ожидание и расчет буферов по таймеру вызывать.
 
sergeev:

а не в присваивании дело!  Дело в числе, какое возвращает OnCalculated.  Если ваши данные не готовы, то вы соответственно из OnCalculated возвращаете 0.
Посмотрите на примеры по BarsCalculated.  Именно через него и надо делать проверку.

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

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

Или как вариант открыть чарт с нужным ТФ М1, тогда данные на соседнем чарте М15 по запросу М1 готовы сразу.

 
Urain:

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

Или как вариант открыть чарт с нужным ТФ, тогда данные на соседнем чарте готовы сразу.

Николай не поверишь, сегодня полдня провозился с индюками. Были мультивалютный/мультитаймрфеймовый.

так вот проблема в неотображении в том, что выполняется попытка взять значение от бара, которого на этом ТФ просто нет. истории в памяти еще нет. 

Поэтому надо проверить перед взятием бара - SeriesInfoInteger. 
Никаких выгрузок не надо. Все равно расчетную часть не выгрузишь (сегодня как раз тему по этому поводу поднял).
 
sergeev:

Николай не поверишь, сегодня полдня провозился с индюками. Были мультивалютный/мультитаймрфеймовый.

так вот проблема в неотображении в том, что выполняется попытка взять значение от бара, которого на этом ТФ просто нет. истории в памяти еще нет. 

Поэтому надо проверить перед взятием бара - SeriesInfoInteger. 

Никаких выгрузок не надо. Все равно расчетную часть не выгрузишь (сегодня как раз тему по этому поводу поднял).

Мимо, у меня проверочка стоит, нахожу первую дату по ТФ М1, и расчёт баров М15 начинается от этой даты. TF в настройках указан как PERIOD_M1

   timestart=(datetime)SeriesInfoInteger(_Symbol,TF,SERIES_FIRSTDATE);
   for(int i=prev>0?prev-1:0;i<rates_total-1;i++)
     {
      if(time[i]>timestart)
        {
         ... расчёт
        }
     }
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков - Документация по MQL5
 
Urain:

1. Идея хорошая, хотя в prev_calculated ничего присвоить нельзя, переменная объявлена как const, но я вас понял можно завести другую аналогичную переменную.

2. Остаётся один вопрос, а если данных так и нет, чего делать?

3. Я так понимаю что сам запрос данных не приводит к их закачке или загрузке из локальной базы, и в этом как раз проблема.

  1. Имел ввиду из OnCalculate возвращаю 0, тогда prev_calculated=0;
  2. Ставлю счетчик переинициализаций. При переполнении выгружаю индикатор.
  3. С CopyХХХХ проблем не было. Если есть локальная история, то если не с первого, то со второго-третьего раза все считалось. На чемпионате используемый советником "шпион" считает исключительно на минутной истории, работает на Н1. И так по 9 парам. При отсутствии вообще локальной истории, срабатывал п.2.  Но, насколько я помню, начиналась закачка истории с сервера.
 
Urain:

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

Из справки по CopyXXXX:

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

Речь только об экспертах и скриптах. Для индикаторов это не действует?