Ошибка при определении нового бара

 

Использую в коде такую схему

bool isNewBarCreated()

  {

//--- в статической переменной будем помнить время открытия последнего бара

   static datetime last_time=0;

//--- текущее время

   datetime lastbar_time;

   if(!SeriesInfoInteger(Symbol(),Period(),SERIES_LASTBAR_DATE,lastbar_time))return(false);

//--- если это первый вызов функции

   if(last_time==0)

     {

      //--- установим время и выйдем 

      last_time=lastbar_time;

      return(false);

     }


//--- если время отличается

   if(last_time!=lastbar_time)

     {

      //--- запомним время и вернем true

      last_time=lastbar_time;

      return(true);

     }

//--- дошли до этого места - значит бар не новый, вернем false

   return(false);

  }


 Проблема в том, что в журнале появляются сообщения

2016.01.11 14:25:05.376    EURUSD.m,H1: cannot refresh history [4073]

 

Если я изменяю в этом коде строку  

  datetime lastbar_time;

   if(!SeriesInfoInteger(Symbol(),Period(),SERIES_LASTBAR_DATE,lastbar_time))return(false);

на 

datatime lastbar_time = Time[0];


То при появлении нового бара выдает сообщение , что array out of range на этой строке.

Не понимаю где ошибка. Помогите, пожалуйста. 

 

Уточните язык: MQL4 или MQL5?

Потому как из кода, судя по использованию функции SeriesInfoInteger, речь идет об MQL5. Но в таком случае Time[0] не может быть использовано, т. к. такой таймсерии в MQL5 нет.

Если же основываться на том, что таймсерия Time существует, то речь об MQL4. Но тогда использовать SeriesInfoInteger совместно с SERIES_LASTBAR_DATE, не имеет смысла, т. к. для этого есть Time[0] или iTime(NULL, 0, 0).

Если речь об MQL4, то бегом в сервисдеск с этой ошибкой. Разработчики ее уже больше года отлавливают, но воспроизвести не могут.

 
Ihor Herasko:

Уточните язык: MQL4 или MQL5?

Потому как из кода, судя по использованию функции SeriesInfoInteger, речь идет об MQL5. Но в таком случае Time[0] не может быть использовано, т. к. такой таймсерии в MQL5 нет.

Если же основываться на том, что таймсерия Time существует, то речь об MQL4. Но тогда использовать SeriesInfoInteger совместно с SERIES_LASTBAR_DATE, не имеет смысла, т. к. для этого есть Time[0] или iTime(NULL, 0, 0).

Если речь об MQL4, то бегом в сервисдеск с этой ошибкой. Разработчики ее уже больше года отлавливают, но воспроизвести не могут.

Спасибо. MQL4 язык. В справочнике по языку есть эта функция. с ней по крайней мере советник не вылетает. Но в сервисдеск уже бегу ))
 
Maksim Garkin:
Спасибо. MQL4 язык. В справочнике по языку есть эта функция. с ней по крайней мере советник не вылетает. Но в сервисдеск уже бегу ))
Люблю когда люди ищут что то посложнее:)))))))))))
int prev_bars;

 

if(Bars!=prev_bars)

{

 Alert("New bar");

prev_bars=Bars; 

} 
 
Vasyl Nosal:
не работает, первая итерация сразу обнаружит новый бар, хотя он уже давно не новый
 
Oleg Tsarkov:
не работает, первая итерация сразу обнаружит новый бар, хотя он уже давно не новый
Ну в инит допиши           Это же логично что при запуске один раз нужно код прогнать, а если не нужно то читай слева:))))))))
prev_bars=Bars;
 

GetLastError() надо проверять, надо дать данным обновиться. 

Только смысл такого в чем? Ладно бы МТ5, где только стандартные таймфреймы, а если МТ4, то значит сразу ограничиваем себя стандартными таймфреймами, а ведь могут быть и нестандартные. 

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

***

Тем более используется Period() - таймфрейм графика.  Тогда уж можно просто Time[0].