Тонкости обновления таймфреймов

 

Допустим что у меня есть эксперт, которого я прицепил на EURUSD M30 в только что проинсталеный терминал. В нем есть код запрашивающий минутные данные с М1 ( iOpen(Symbol(), PERIOD_M1, FirstBarNo) ). Терминал только что проинсталеный и никакой истории в нем нет кроме той что закачалась на М30 в момент открытия графика для прицепки эксперта.

Кажется мне что данные по М1 я не получу до тех пор пока не открою сам график М1? Но даже если я его открою и подгружу всю историю (например эмуляцией нажатий KEY_HOME), а потом закрою М1. График М1 закрыт и данные в него терминал вроде как не пишет? Что мне вернет iOpen(Symbol(), PERIOD_M1, 0) через час? Наверно цену открытия того нулевого бара который был на момент закрытия графика? Если да - то как принудительно заставить MQL-кодом обновить график M1, работая только на М30?

 
Сергей, все функции для работы с таймсериями запрашивают историю с сервера. Надо реализовать ожидание последнего бара в истории. История приходит не сразу. Иногда совсем не приходит.
 
Zhunko:
....реализовать ожидание последнего бара в истории. История приходит не сразу. Иногда совсем не приходит.

и как я узнаю что он "последний"? особенно если "иногда совсем не приходит" ;)

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

 

В периодконверторе есть строка ожидания истории. Она работает, но на выходных зацикливается из-за особенностей RefreshRates().

Доделал:

for (j = 0; i == 0 && !RefreshRates() && !IsStopped() && j < 10; j++, i = iBarShift(sSymbol, nSourceTF, lTimeSource)) Sleep(200); 
 

ну это все равно не решает вопрос. тут скорее всего надо зная время TimeCurrent текущего прихода котировки на текущем тайме (ведь эксперт пнется именно на нем на живом времени), нужно проверить что ближайшее к нему время на другом тайме уже есть.

например TimeCurrent = 20:36:12 мы понимаем что на М1 Time[0] должно быть 20:36 а на М5 - 20:35

остается второй вопрос: что делать если несмотря на наши "понятия" мы получили с М5 время Time[0] например 20:30 и поняли что нет (еще) последнего бара со временм 20:35 ?

 

Мне кажется, нужно копать в направлении "последней известной цены". История, если она есть, то, когда-нибудь, приходит.

Поэтому я пользуюсь следующей функцией:

double  LastKnownPrice( string SymbolName, datetime cTime)
{
   int   shift;
   
   shift = iBarShift( SymbolName, 0, cTime, false);
   if (iTime(SymbolName, 0, shift) > cTime) shift++;
   return( iClose(SymbolName, 0, shift) );
}
Здесь используется текущий ТаймФрейм, но это легко правится
 
Mislaid:

Мне кажется, нужно копать в направлении "последней известной цены". История, если она есть, то, когда-нибудь, приходит.

Правильно. поэтому первый мой вопрос был такой: если на текущем тайме уже есть "последняя известная цена" означает ли это что она есть и на всех других таймах для ее получения через тот же iClose?
Я много раз замечал как после перключения на другой тайм в течении нескольких секунд происходит подчитка данных и на нем быстренько появляются пара-тройка новых баров. Это значит что в те таймы данные при работающем терминале не записывались.
 

ForexTools:
Я много раз замечал как после перключения на другой тайм в течении нескольких секунд происходит подчитка данных и на нем быстренько появляются пара-тройка новых баров. Это значит что в те таймы данные при работающем терминале не записывались

Я, скорее, пессимист. Что есть, с тем и работаем.
 

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

Запустите прилагаемый индикатор на минутках. И когда зигзаги прорисуются. Иногда почти сразу. Иногда приходится немного подождать, пока не подкачается история. И посмотрите историю.

Файлы:
mzz9_1.mq4  35 kb
 
ForexTools:
Правильно. поэтому первый мой вопрос был такой: если на текущем тайме уже есть "последняя известная цена" означает ли это что она есть и на всех других таймах для ее получения через тот же iClose?
Я много раз замечал как после перключения на другой тайм в течении нескольких секунд происходит подчитка данных и на нем быстренько появляются пара-тройка новых баров. Это значит что в те таймы данные при работающем терминале не записывались.

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