Запрос на загрузку бара mql5

 

В индикаторе необходимо получить цену открытия бара на таймфрейме, окно которого не открыто совсем (если открыто, то все работает).

 пыталась сделать функцией:

    double iOpenMQL4(string symbol, ENUM_TIMEFRAMES timeframe, int index){   
   if(index < 0) return(-1);
   double Arr[];
   if(CopyOpen(symbol,timeframe, index, 1, Arr)>0) 
        return(Arr[0]);
   else return(-1); } 
 
В большинстве случаев даже показывает что прошла синхронизация (SeriesInfoInteger(symbol, tf, SERIES_SYNCHRONIZED))...
 
Уточните, для какого терминала делаете это: для МТ5 или МТ4. По названию функции iOpenMQL4 складывается впечатление, что именно для МТ4, хотя в названии темы фигурирует MQL5 (т. е. для МТ5). В этом случае вряд ли описанный метод получения данных будет работать. Языки терминалов сближаются, но в MQL4 пока еще много чего недоступно из того, что есть в MQL5.
 
Игорь Герасько:
Уточните, для какого терминала делаете это: для МТ5 или МТ4.

Да, когда писала в шапке mql5 я имела ввиду что это mql5.
Игорь Герасько:
По названию функции iOpenMQL4 складывается впечатление, что именно для МТ4

Зачем??? В mql4 фунцией iOpen я могу получить все данные.
Игорь Герасько:
хотя в названии темы фигурирует MQL5 (т. е. для МТ5). В этом случае вряд ли описанный метод получения данных будет работать.

Я в курсе что он работает через раз, иначе бы не было темы. Спрашивается, а как достать цену открытия бара по любом ТФ и Символу хотя бы на 0-м баре?
Игорь Герасько:
Языки терминалов сближаются, но в MQL4 пока еще много чего недоступно из того, что есть в MQL5.

да, особенно цены открытия стали еще доступнее...
 
Galina Bobro:

...
Я в курсе что он работает через раз, иначе бы не было темы. Спрашивается, а как достать цену открытия бара по любом ТФ и Символу хотя бы на 0-м баре?
...

Через раз это как? Если CopyOpen иногда возвращает -1, это нормально. Нужно проверять результат, если успешен, то делаем, что нужно, если -1, то будем повторять на следующем тике.

Из справки про CopyOpen():

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

Если таймфрейм еще не построен, будет возвращено -1 и начнется процесс постройки таймфрейма... На следующем тике, возможно, получится скопировать.

 
Dmitry Fedoseev:

Через раз это как? Если CopyOpen иногда возвращает -1, это нормально. Нужно проверять результат, если успешен, то делаем, что нужно, если -1, то будем повторять на следующем тике.

Из справки про CopyOpen():

Если таймфрейм еще не построен, будет возвращено -1 и начнется процесс постройки таймфрейма... На следующем тике, возможно, получится скопировать.

100-200 проходов и есть пропущенные значения...  Я уже по всяком перепробовала.  Нужно именно тика? Делала из слипом. 

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

 
Galina Bobro:

100-200 проходов и есть пропущенные значения...  Я уже по всяком перепробовала.  Нужно именно тика? Делала из слипом. 

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

Про 100-200 проходов не понял. 

С тиком проще и универсальней. В индикаторах Sleep() не работает, но если в советнике, можно и со Sleep(). Самое главное в том, что нужно проверять результат CopyClose() и т.п. функций. Специальной функции для инициации построения таймфрейма не встречал, ее вроде и нет. Еще есть функция Bars(), она тоже инициирует построение таймфрейма, можно ее попробовать в самом начале вызывать.

 
Galina Bobro:

100-200 проходов и есть пропущенные значения...  Я уже по всяком перепробовала.  Нужно именно тика? Делала из слипом. 

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

Кэш просто сбрасывается, если не используется какое-то время.

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

 
Andrey Khatimlianskii:

Кэш просто сбрасывается, если не используется какое-то время.

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

спасибо, но уже решила. Это жестоко просить пользователя открыть 20 графиков)

Принцип что берем значения, если что-то сфейлилось - помечаем как непосчитаное (отдельный буфер выделила). Если пришел новый тик, то  проходимся по не посчитанных. И так очень даже работает.

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

 
Galina Bobro:

спасибо, но уже решила. Это жестоко просить пользователя открыть 20 графиков)

Можно не просить, а чтобы эксперт сам открыл ))) Но есть более простой способ - на каждом тике обращаться к нулевому бару нужного ТФ. В итоге график будет формироваться виртуально (именно об этом способе говорил komposter).

Принцип что берем значения, если что-то сфейлилось - помечаем как непосчитаное (отдельный буфер выделила). Если пришел новый тик, то  проходимся по не посчитанных. И так очень даже работает.

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

rates_total и prev_calculated...
 

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

а rates_total и prev_calculated можно неужели менять руками? они не по ссылке передаются в OnCalculate. И как узнать посчитан ли n-й бар?