Функция обнаружения нового бара

 

Добрый день!

В учебнике по mql4 предлагается следующая функция по определению нового бара:

void Fun_New_Bar()                              // Ф-ия обнаружения ..
  {                                             // .. нового бара
   static datetime New_Time=0;                  // Время текущего бара
   New_Bar=false;                               // Нового бара нет
   if(New_Time!=Time[0])                        // Сравниваем время
     {
      New_Time=Time[0];                         // Теперь время такое
      New_Bar=true;                             // Поймался новый бар
     }

В связи с чем, у меня возник вопрос по строке выделенной красным. Здесь New_Time=0, следовательно, данное условие будет выполняться if(New_Time!=Time[0]), что приведет к тому, что при первой же проверке на новый бар с момента запуска программы будет находится новый бар:

Fun_New_Bar();                               // Обращение к ф-ии
   if (New_Bar==false)                          // Если бар не новый..
      return;                                   // ..то уходим

Правилен ли ход моих мыслей?

Если да, то в случае когда нам необходимо при запуске программы не считать бар [0] новым, а только последующий сформировавшийся бар, можно ли модифицировать код следующим образом?

void Fun_New_Bar()                              // Ф-ия обнаружения ..
  {                                             // .. нового бара
   static datetime New_Time=Time[0];                  // Время текущего бара
   New_Bar=false;                               // Нового бара нет
   if(New_Time!=Time[0])                        // Сравниваем время
     {
      New_Time=Time[0];                         // Теперь время такое
      New_Bar=true;                             // Поймался новый бар
     }

Спасибо!

 
Che:

Добрый день!

В учебнике по mql4 предлагается следующая функция по определению нового бара:

В связи с чем, у меня возник вопрос по строке выделенной красным. Здесь New_Time=0, следовательно, данное условие будет выполняться if(New_Time!=Time[0]), что приведет к тому, что при первой же проверке на новый бар с момента запуска программы будет находится новый бар:

Правилен ли ход моих мыслей?

Если да, то в случае когда нам необходимо при запуске программы не считать бар [0] новым, а только последующий сформировавшийся бар, можно ли модифицировать код следующим образом?

Спасибо!


bool Fun_New_Bar()                              // Ф-ия обнаружения ..
  {                                             // .. нового бара
   static datetime Prev_Time=0;                  // Время текущего бара
   if (Prev_Time==0) 
     {
        Prev_Time=Time[0];
        return(false);
     }
   if(Prev_Time!=Time[0])                        // Сравниваем время
     {
      Prev_Time=Time[0];                         // Теперь время такое
      return(true);                             // Поймался новый бар
     }
  return(false);
}
Лучше уж так. Функция возвращает истину (true) если это не первый запуск и пришел новый тик нового бара
 

Спасибо, Vinin!

У меня один уточняющий вопрос непосвященного в дела программные, если позволите.

bool Fun_New_Bar()                              // 
  {                                             // 
   static datetime Prev_Time=0;                  //2. При повторном обращении мы в самом начале присваиваем Prev_Time значение 0, таким образом удаляя 
                                                  //  присвоенное нами ранее значение
                                                   // Time[0] в пункте 1. Или нет? Как это работает?
 
   if (Prev_Time==0) 
     {
        Prev_Time=Time[0];
        return(false);
     }
   if(Prev_Time!=Time[0])                        // 
     {
      Prev_Time=Time[0];                         // 
      return(true);                             // 1. Здесь мы присваиваем Prev_Time значение Time[0].
     }
  return(false);
}
Спасибо.
 
Почитайте документацию
 

Спасибо Vinin.

Читал. Неспециалисту понять сложновато. Поэтому и спросил здесь.

"при выходе из функции, внутри которой объявлена статическая переменная, значение этой переменной не теряется." -- этот момент кажется понятным, т.е. после

Prev_Time=Time[0];                         
      return(true); 

Prev_Time будет равным Time[0].

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

{                                              
   static datetime Prev_Time=0; 

я ответа не нашел.

Спасибо.

 
Che:


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

я ответа не нашел.

Спасибо.


Значение переменной не изменится
 

Вот модификация функции Виктора от меня:

bool IsNewBar()
 {
  static int nBars = 0;
  if (nBars == 0) 
   {
    nBars = Bars;
    return(false);
   }
  if (nBars != Bars)
   {
    nBars = Bars;
    return(true);
   }
  return(false);
 }
Но по мне это ближе (первый запуск функции аналогичен наличию нового бара):
bool IsNewBar()
 {
  static int nBars = 0;
  if (nBars != Bars)
   {
    nBars = Bars;
    return(true);
   }
  return(false);
 }
 
Спасибо, Vinin и Zhunko!
 

Здравствуйте.

Почему бы проще не воспользоваться:

...

if( High[0]==Low[0] )

{ return(true); }

...

 
faust:

Здравствуйте.

Почему бы проще не воспользоваться:

...

if( High[0]==Low[0] )

{ return(true); }

...

Возможны ошибки в таком случае.

Даже это не спасёт от ошибок:

if(High[0] == Low[0] && Open[0] == Close[0] && High[0] == Open[0])
 {
  return(true);
 }
 
faust:

Здравствуйте.

Почему бы проще не воспользоваться:

...

if( High[0]==Low[0] )

{ return(true); }

...

По ночам точечные бары косяками ходят.

И на каждом High[0]==Low[0].

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