Как лучше узнать что пришел новый бар? - страница 3

 
Vitaly Muzichenko:

Виталий, вы сами код прогоняли через компилятор ?


Вариант 1. (Рисунок 1.)


Вариант 2. (Рисунок 2.)

Файлы:
5t5gq2t_1.jpg  83 kb
8wmwy8i_2.jpg  74 kb
 
Ihor Herasko:

Логично. Ведь данных до запуска программы нет. Поэтому при запуске программы всегда будем иметь дело в новым баром. Причем это тоже нужно. Ведь при запуске в большинстве случаев стоит обработать текущий бар. Хотя никто не мешает чуть поправить логику, и бар, имеющийся при запуске программы, всегда пропускать. Но, как мне кажется, это плохой подход.


Вот это и есть не айс. Так как у меня позиция закрываться при новом баре.

 
Берите мой код. 100% и везде :)
 
prostotrader:
Берите мой код. 100% и везде :)

Ваш код не корректный, он будет вызываться несколько раз если происходит подкачка истории, и не важно, что подкачка может происходить не на первых барах,

проверять неохота как Ваш код работает, давно так не делаю, но вроде и пропуск баров и обрыв связи, Ваш пример тоже не корректно отработает

по сабжу: корректно запоминать время бара №1 (хотя можно и бар №0) и сравнивать его на предмет изменения, у бара время открытия никогда не изменяется

вот правильный расчет https://www.mql5.com/ru/forum/52185/page2#comment_9068277

вот еще: https://www.mql5.com/ru/forum/2244/page2#comment_2419144

Как лучше узнать что пришел новый бар?
Как лучше узнать что пришел новый бар?
  • 2018.10.16
  • www.mql5.com
Общее обсуждение: Как лучше узнать что пришел новый бар?
 
setborg:

Виталий, вы сами код прогоняли через компилятор ?

Вариант 1. (Рисунок 1.)

Вариант 2. (Рисунок 2.)

А вы ждали полное рабочее решение? Если не можете устранить ПРОСТЕЙШУЮ ошибку, то вам и компилятор открывать не стоит, и вообще нужно удалить метаедитор.


Пробуйте, но решение не самое оптимальное:

bool NewBar(ENUM_TIMEFRAMES TF=0)
  {
   static datetime NewTime=0;
   datetime NowTime=iTime(Symbol(),TF,0);
   if(NewTime==0)
     {
      NewTime=NowTime;
      return(false);
     }
   if(NewTime!=NowTime)
     {
      NewTime=NowTime;
      return(true);
     }
   return(false);
  }
 
Vitaly Muzichenko:

А вы ждали полное рабочее решение? Если не можете устранить ПРОСТЕЙШУЮ ошибку, то вам и компилятор открывать не стоит, и вообще нужно удалить метаедитор.


Пробуйте, но решение не самое оптимальное:


Удалять МТ вот именно не нужно. Я не из тех числа людей которые сдаются при первых трудностях.

А за код, спасибо.

 
Igor Makanu:

Ваш код не корректный, он будет вызываться несколько раз если происходит подкачка истории, и не важно, что подкачка может происходить не на первых барах,

проверять неохота как Ваш код работает, давно так не делаю, но вроде и пропуск баров и обрыв связи, Ваш пример тоже не корректно отработает

по сабжу: корректно запоминать время бара №1 (хотя можно и бар №0) и сравнивать его на предмет изменения, у бара время открытия никогда не изменяется

вот правильный расчет https://www.mql5.com/ru/forum/52185/page2#comment_9068277

вот еще: https://www.mql5.com/ru/forum/2244/page2#comment_2419144

О, спасибо, я как раз искал эти топики. Хоть вы пытались помочь и не мне, но мне помогли)
 
datetime last_bar_time=0;

void OnTick()
  {
   datetime  time1=iTime(NULL,0,0);
   if(time1<=last_bar_time)
   {
      return;
   }else
   {
      last_bar_time=time1;
   }
   //Тут обработка события
   Print(time1);//Тестируем
   
  }

Всё просто. Для текущего инструмента и периода. Если нету нового бара, то выходим.

Результат:


У Vitaly Muzichenko верно было, только подправить надо было под ограничения MQL5.
 
Vitaly Muzichenko:

почти правильно,

только зачем два раза вызывать одну и ту же функцию iTime ?

 
Sergey Chalyshev:

почти правильно,

только зачем два раза вызывать одну и ту же функцию iTime ?

Вроде вызов один раз. Или нет?