iOpen и iClose "не работает". - страница 2

 
kermit:

Кажется нашёл проблему.

Когда истории нет, то iOpen действительно выдаёт ошибку и нули.

Но если файл с историей есть, но устаревший, то функция выдаёт последние имеющиеся данные, не проверяя за какое они число.


Не проверял, но не сталкивался с подобными проблемами... как то не случалось

С точки зрения логики вы можете перед iOpen iClose попытаться проверить наличие хотя бы одной свечки на всех тайм фреймах а не только на D1


для корректной работы может стоит проверять GetLastError()


еще можно проверять TimeCurrent() и если оно больше чем iTime той свечи которую вы просите

необходимо добиться что бы она была загружена


попробуйте поиском найти ЗАГРУЗКА ИСТОРИИ - ЗАГРУЗКА КОТИРОВОК - СКРИПТ ЗАГРУЗКИ ИСТОРИИ

кажется Вадим Жунко делал неплохой скрипт по загрузке ...

 
YuraZ:

попробуйте поиском найти ЗАГРУЗКА ИСТОРИИ - ЗАГРУЗКА КОТИРОВОК - СКРИПТ ЗАГРУЗКИ ИСТОРИИ

кажется Вадим Жунко делал неплохой скрипт по загрузке ...

Поискал - не то. Нашлось всё типа 'Закачивание котировок скриптом "Key_Home"'

Мне нужна не загрузка истории "в глубину", а обновление данных на текущем баре с произвольного ТФ.

Что-то типа iRefreshRates (Symbol(), PERIOD_D1, N), где N - количество обновляемых баров, но можно и без N.

 
kermit писал (а):

Мне нужна не загрузка истории "в глубину", а обновление данных на текущем баре с произвольного ТФ.

Посмотрите https://docs.mql4.com/ru/array/ArrayCopySeries - как обрабатывается ошибка 4066

 
Itso:
kermit писал (а):

Мне нужна не загрузка истории "в глубину", а обновление данных на текущем баре с произвольного ТФ.

Посмотрите https://docs.mql4.com/ru/array/ArrayCopySeries - как обрабатывается ошибка 4066

Зачем мне копировать массив. Я этого не хочу.

Судя по набранной в голове информации, функции обновляющей данные на заданном ТФ не существует.

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

Т.е. получается надо делать где-то так.

int trend()                         
{
int t;
iClose(Symbol(),1440,0);
Sleep(10000);

if (iClose(Symbol(),1440,0)>iOpen(Symbol(),1440,0)) t=0;
else t=1;

return(t);
}
Или есть более цивилизованный выход?
 
kermit:
Itso:
kermit писал (а):

Мне нужна не загрузка истории "в глубину", а обновление данных на текущем баре с произвольного ТФ.

Посмотрите https://docs.mql4.com/ru/array/ArrayCopySeries - как обрабатывается ошибка 4066

Зачем мне копировать массив. Я этого не хочу.

А кто говорить, что нужно копировать массив? Посмотрите пример внимательнее. Если вы попытаетесь прочитать бары, которые еще не загруженые, то будеть ошибка 4066, но загрузка начнется. Нужно подождать достаточно долго и попробовать опять.

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

 
Itso:

А кто говорить, что нужно копировать массив? Посмотрите пример внимательнее. Если вы попытаетесь прочитать бары, которые еще не загруженые, то будеть ошибка 4066, но загрузка начнется. Нужно подождать достаточно долго и попробовать опять.

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

В принципе мы говорим об одном и том же.

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

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

Надеюсь на её исправление в ближайшем билде.

 
kermit:

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

Надеюсь на её исправление в ближайшем билде.

Вы запрашиваете цену открытия нулевого бара на тааком-то таймфрейме. Нулевой бар - это самый последний известный терминалу бар на момент запроса.

 
Rosh:
kermit:

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

Надеюсь на её исправление в ближайшем билде.

Вы запрашиваете цену открытия нулевого бара на тааком-то таймфрейме. Нулевой бар - это самый последний известный терминалу бар на момент запроса.

Можно сделать, чтобы при запросе цен на нулевом баре, проверялось и время этого нулевого бар - если Д1, то чтобы совпадал день, если Н1, совпал текущий час?

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

 
Rosh писал(а) >>

Вы запрашиваете цену открытия нулевого бара на тааком-то таймфрейме. Нулевой бар - это самый последний известный терминалу бар на момент запроса.

При запросе первого бара так же ноль выскакивает, о чем мы говорим вообще?

Ясно же, что так программа мт4 работать не должна. а должна как то иначе.

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