Определение времени закрытой свечи старшего таймфрейма

 

Вроде простая задача, но никак не могу решить. 
Глобально: надо определить время последней закрытой свечи старшего таймфрейма относительно текущего времени младшего таймфрейма.
Т.е. например на М1 по текущему времени определить время последней закрытой свечи на М5. Или на M5 время последней закрытой свечи на H1.

прошу помощи...

 
peterlogin:

Вроде простая задача, но никак не могу решить. 
Глобально: надо определить время последней закрытой свечи старшего таймфрейма относительно текущего времени младшего таймфрейма.
Т.е. например на М1 по текущему времени определить время последней закрытой свечи на М5. Или на M5 время последней закрытой свечи на H1.

прошу помощи...

datetime dtTime = iTime(NULL, PERIOD_M5, 1);

Только предварительно нужно проверить, что нужный ТФ доступен. В МТ4 для этого нужно постоянно "дергать" другой ТФ.

 
Ihor Herasko:

Только предварительно нужно проверить, что нужный ТФ доступен. В МТ4 для этого нужно постоянно "дергать" другой ТФ.

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

 
peterlogin:

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

не изобретайте велосипед, всё равно будет работать не правильно, iTime вполне достаточно, проще обработать возможные исключения, чем рожать подобную функцию самому
 
peterlogin:

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

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

для проверки "свежести" свечи проверяйте чтобы время попадало в диапазон 5+5 - десяти последних минут (на других периодах соответственно - время длительности двух свечей)

 

Да вы правы 1-й бар должен быть всегда закрытым. Цена последней закрытой свечи старшего ТФ ( переменная tfix) будет равна:

int tfix = PERIOD_M5; // старший период
double PriceCloseTF_GL = iClose(Symbol(), Period(), iBarShift(Symbol(), Period(), iTime(Symbol(), tfix, 1)+tfix*60-60)); 
Print(PriceCloseTF_GL);


 пример для M1

 
peterlogin:

Да вы правы 1-й бар должен быть всегда закрытым. Цена последней закрытой свечи старшего ТФ ( переменная tfix) будет равна:


 пример для M1

И зачем такое извращение? Ведь проще запросить сразу по нужному периоду

double PriceCloseTF_GL = iClose(Symbol(), PERIOD_M5, 1);
Print(PriceCloseTF_GL);
или так
  double arr[1];
  CopyClose(_Symbol, PERIOD_M5, 1, 1, arr);
  double PriceCloseTF_GL = arr[0];

И такой вариант

  MqlRates arr[1];
  CopyRates(_Symbol, PERIOD_M5, 1, 1, arr);
  double PriceCloseTF_GL = arr[0].close;
 
Alexey Viktorov:

И зачем такое извращение? Ведь проще запросить сразу по нужному периоду

для того чтобы не зависеть от истории котировок M5 (старшего ТФ), т.к. нет гарантии, что она будет подгружена

 
peterlogin:

для того чтобы не зависеть от истории котировок M5 (старшего ТФ), т.к. нет гарантии, что она будет подгружена

Подгружена куда? В тестер? Так в тестере вся история состоит из минуток. Минутки есть, значит есть все периоды. Если-же пытаетесь получить цены в OnInit(), тогда когда история вообще недоступна, так хоть в бубен бей, нет минутной истории и ничего не получишь.

 
Alexey Viktorov:

Подгружена куда? В тестер? Так в тестере вся история состоит из минуток. Минутки есть, значит есть все периоды. Если-же пытаетесь получить цены в OnInit(), тогда когда история вообще недоступна, так хоть в бубен бей, нет минутной истории и ничего не получишь.

Да в тестере через iClose я получал совершенно непонятную котировку. Хотя история тиков подгружена. Поэтому решил все сделать не обращаясь к другим ТФ.

 
peterlogin:

Да в тестере через iClose я получал совершенно непонятную котировку. Хотя история тиков подгружена. Поэтому решил все сделать не обращаясь к другим ТФ.

Ну так можно воспользоваться таким вариантом

int  CopyRates( 
   string           symbol_name,       // имя символа 
   ENUM_TIMEFRAMES  timeframe,         // период 
   datetime         start_time,        // с какой даты 
   int              count,             // сколько копируем 
   MqlRates         rates_array[]      // массив, куда будут скопированы данные 
   );

Закрытие свечи минутного периода, например свеча 10:24, всегда будет совпадать с закрытием 5ти минутки с временем открытия 10:20

Не нравится использовать структуры, можно взять закрытие

int  CopyClose( 
   string           symbol_name,       // имя символа 
   ENUM_TIMEFRAMES  timeframe,         // период 
   datetime         start_time,        // с какой даты 
   int              count,             // сколько копируем 
   double           close_array[]      // массив для копирования цен закрытия 
Причина обращения: