Как обнаружить новый бар - страница 2

 
Ian Harris:

Привет, oneillj,

Я думал, что уже ответил вам, но, похоже, это сообщение исчезло в интернет-эфире.

Приведенный вами фрагмент кода - это практически то, на что я жаловался в первую очередь. Почему так сложно? Я просто подумал, что должен быть более простой способ. Я придумал этот, который, кажется, работает. Пожалуйста, поправьте меня, если я ошибаюсь. (Я также пытался использовать BarsCalculated, но он всегда был равен Bars, поэтому тест всегда выдавал false).

static int LastBarCount = 0;
if (Bars(_Symbol, _Period) > LastBarCount)
LastBarCount = Bars(_Symbol, _Period);
else
return;

;-) Ian

Я полностью согласен с тем, что нам нужно что-то как можно более простое.

К сожалению, этот код, похоже, не работает в MQL5.

 
RoboSpider:
К сожалению, это не работает в MQL5.

Бары в любом случае были бы плохим способом обнаружения нового бара.

Единственный надежный способ проверить наличие нового бара - это использование времени. Не объем, не цены, не бары.

static datetime LastBar = 0;
datetime ThisBar = (datetime)SeriesInfoInteger(_Symbol,PERIOD_CURRENT,SERIES_LASTBAR_DATE);
if(LastBar != ThisBar)
  {
   printf("New bar: %s",TimeToString(ThisBar));
   LastBar = ThisBar;
  }
 
honest_knave:

Бары в любом случае были бы плохим способом обнаружения нового бара.

Единственный надежный способ проверить наличие нового бара - это использование времени. Не объем, не цены, не бары.

static datetime LastBar = 0;
datetime ThisBar = (datetime)SeriesInfoInteger(_Symbol,PERIOD_CURRENT,SERIES_LASTBAR_DATE);
if(LastBar != ThisBar)
  {
   printf("New bar: %s",TimeToString(ThisBar));
   LastBar = ThisBar;
  }
Вы мой герой!
 
honest_knave Bars в любом случае будет плохим способом обнаружения нового бара. Единственный надежный способ проверки нового бара - это использование времени. Не объем, не цены, не бары.
  1. Bars ненадежен (обновление/подключение может изменить количество баров на графике,) volume ненадежен (пропуск тиков,) Price ненадежен (дублирование цен и операнд ==. - Форум MQL4.) Всегда используйте время. Новая свеча - Форум MQL4
 
honest_knave:

Бары в любом случае были бы плохим способом обнаружения нового бара.

Единственный надежный способ проверить наличие нового бара - это использование времени. Не объем, не цены, не бары.

static datetime LastBar = 0;
datetime ThisBar = (datetime)SeriesInfoInteger(_Symbol,PERIOD_CURRENT,SERIES_LASTBAR_DATE);
if(LastBar != ThisBar)
  {
   printf("New bar: %s",TimeToString(ThisBar));
   LastBar = ThisBar;
  }

Просто для информации, у меня есть следующее примечание в моих ссылках :

//-- Иногда SeriesInfoInteger с SERIES_LASTBAR_DATE возвращает ошибку,

Это было давно, и я не использую/тестирую эту функцию уже много лет, так что, возможно, это не совсем так. Но если вы хотите использовать ее для обнаружения нового бара, то, вероятно, лучше это проверить ;-)

 
Alain Verleyen:

Просто для информации, у меня есть следующее примечание в моих рекомендациях :

//-- Иногда SeriesInfoInteger с SERIES_LASTBAR_DATE возвращает ошибку,

Это было давно, и я не использую/тестирую эту функцию уже много лет, так что, возможно, это не совсем так. Но если вы хотите использовать ее для обнаружения нового бара, то, вероятно, лучше это проверить ;-)

Это очень загадочно Алена! Какой тип ошибок?

В таком случае, для поясов'n'braces либо проверьте SeriesInfoInteger >0 и/или ResetLastError до вызова, затем проверьте _LastError после вызова.

Или получите источник времени в другом месте, например, time[], если в OnCalculate, или CopyTime и т.д. и т.п.

 

Почему бы просто не использовать что-то вроде этого:

   static datetime prevTime=0;
          datetime lastTime[1];
          if (CopyTime(_Symbol,_Period,0,1,lastTime)==1 && prevTime!=lastTime[0])
          {
               prevTime=lastTime[0];
              
               // ...
          }
Это должно работать во всех случаях (даже когда есть ошибка с CopyTime(), это позволяет избежать ловушки).
 
honest_knave:

Это очень загадочно Алена! Какой тип ошибок?

В таком случае, для поясных скобок либо проверьте SeriesInfoInteger >0 и/или ResetLastError до вызова, затем проверьте _LastError после вызова.

Или получите источник времени в другом месте, например, time[], если в OnCalculate, или CopyTime и т.д. и т.п.

Я просто говорю, что когда я использовал его много лет назад, SeriesInfoInteger() не был действительно надежным. Вам решать, что вы будете делать с этой информацией :-D
 
Alain Verleyen:
Я просто говорю, что когда я использовал его много лет назад, SeriesInfoInteger() был не совсем надежным. Вам решать, что вы будете делать с этой информацией :-D

Не очень много TBH - мне не нужно обнаруживать новый бар в MT5 Но спасибо, что поделились - я буду иметь это в виду на будущее.

Я просто пытался упростить то, что люди, похоже, делают чрезмерно сложным.

Тем не менее, принцип остается: используйте время. Предостережение: выбирайте свой метод получения времени на свой страх и риск, учитывая неполные исторические заметки Алена (кстати, как вам XP Service Pack 1?).

 
honest_knave:

Не очень много TBH - мне не нужно обнаруживать новый бар в MT5 Но спасибо, что поделились - я буду иметь это в виду на будущее.

Я просто пытался упростить то, что люди, похоже, делают чрезмерно сложным.

Тем не менее, принцип остается: используйте время. Предостережение: выбирайте свой метод получения времени на свой страх и риск, учитывая неполные исторические заметки Алена (кстати, как вам XP Service Pack 1?).

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