Советники: New_Bar (условие, определяющее появление нового бара, реализованно в виде микросоветника) - страница 4

 
Nikolai Semko #:

ровно тоже самое, что я давал здесь (вариант функции - когда используется только текущий ТФ и текущий символ), только с глобальной переменной, а не статической, и не в виде функции, а в теле OnTick. 
Статическая переменная по сути тоже самое, что и глобальная, только удобнее, т.к. не "засоряет" шапку и зона видимости только в пределах функции, что безопаснее. 
Использование функции в данной ситуации только лишь улучшает читаемость кода, но можно конечно же обойтись и без функции. На скорость не влияет.

Спасибо за мысли.

 
Petr Zharuk #:

Доброго времени, коллеги!

Я пишу код только месяц. Но хочу поделится своим способом определения нового бара.

Как по мне это самый коротки вариант.

Подводных камней пока не встретил. 

От гуру послушал бы рекомендаций.

Вариантов немалое количество и совсем необязательно всегда делать одинаково. Вот тот-же вариант 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Советники: New_Bar (условие, определяющее появление нового бара, реализованно в виде микросоветника)

Alexey Viktorov, 2022.06.29 12:04

Владимир, вот код

/********************************************************************\
|   Expert tick function                                             |
\********************************************************************/
void OnTick()
 {
//---
  Sleep(250);
  if(iOpen(_Symbol, PERIOD_CURRENT, 0) && iVolume(_Symbol, PERIOD_CURRENT, 0) <= 1)
    Print("Ура! Появился новый бар! ",TimeTradeServer());
  datetime tm = iTime(_Symbol, PERIOD_CURRENT, 0);
  static datetime time = tm;
  if(time == tm)
    return;
  long volume = iVolume(_Symbol, PERIOD_CURRENT, 0);
  if(volume > 1)
    Print("***** Вот и ошибка? volume = ", volume);
  time = tm;
 }/******************************************************************/

и вот результат работы

2022.06.29 12:51:55.339 Test_NewBar (GBPUSD,M1) ***** Вот и ошибка? volume = 2
2022.06.29 12:52:57.520 Test_NewBar (GBPUSD,M1) ***** Вот и ошибка? volume = 3
2022.06.29 12:53:55.377 Test_NewBar (GBPUSD,M1) ***** Вот и ошибка? volume = 2
2022.06.29 12:54:55.449 Test_NewBar (GBPUSD,M1) ***** Вот и ошибка? volume = 3
2022.06.29 12:55:55.417 Test_NewBar (GBPUSD,M1) Ура! Появился новый бар! 2022.06.29 12:55:55
2022.06.29 12:56:55.444 Test_NewBar (GBPUSD,M1) ***** Вот и ошибка? volume = 3
2022.06.29 12:57:55.458 Test_NewBar (GBPUSD,M1) Ура! Появился новый бар! 2022.06.29 12:57:55
2022.06.29 12:58:55.450 Test_NewBar (GBPUSD,M1) Ура! Появился новый бар! 2022.06.29 12:58:55
2022.06.29 12:59:55.656 Test_NewBar (GBPUSD,M1) ***** Вот и ошибка? volume = 2

Конечно задержка в четверть секунды многовато, но ведь мне надо было показать, что задержка может пропустить первый тик, а задержка может произойти в самый неожиданный момент…

А по хорошему, лучше почитайте обсуждение тут. Это самая полная версия функции определения нового бара.
Вопросы от начинающих MQL5 MT5 MetaTrader 5
Вопросы от начинающих MQL5 MT5 MetaTrader 5
  • 2021.08.04
  • www.mql5.com
Подскажите пожалуйста, такой показатель тестера в жизни реален? И хороший это или плохой результат за год с депо 3000...
 
Alexey Viktorov #:

Вариантов немалое количество и совсем необязательно всегда делать одинаково. Вот тот-же вариант 

А по хорошему, лучше почитайте обсуждение тут. Это самая полная версия функции определения нового бара.

новый бар (вроде как по определению) имеет время открытия (time в нужной кратности) отличное от предыдущего. time бара расставляет терминал и тут ему способствовать только себе вредить. 

то есть если сервер отсёк изменение цены bid/ask/last или их объёма или иных прелестей стакана или сделку (то есть пофик чего, кроме операций по конкретному счёту) за кратностью периода - знать новый бар открылся, время пошло.
ВСЁ - есть торговое событие, новая отметка времени, есть открытие бара.
volume в теории может быть 0 или 1 или иное, может быть даже больше прежнего.
Bid (iClose) может не поменяться или быть 0 или EMPTY_VALUE (как и iOpen) - были подобные то-ли баги, то ли специфика настроек серверов

Время должно поменяться. В HFT где входящие слегка вразнобой, тики могут опережаться, там наверное придётся  попыхтеть..Но HFT и не про MT

PS> пока не видел, но наверное в жизни встречается (отчего нет) когда время открытия двух соседних баров совпадает. вот только в таких случаях наверное стоит сравнивать volume

 
Maxim Kuznetsov #:

PS> пока не видел, но наверное в жизни встречается (отчего нет) когда время открытия двух соседних баров совпадает. вот только в таких случаях наверное стоит сравнивать volume

Нет. Такого  не бывает.
 

Для всех тф. Удобно, что переменные времени определяются в функции, а вставляются по ссылке. Переменную нужно только объявить перед вызовом функции, но не нужно присваивать ей значение. Флаг будет тру только на первом тике нового бара, потом будет ложь.

bool FlagNewBarF(int prd, datetime &ArgBarTime,bool &FlagNbar)
  {
   FlagNbar=false;
   if(ArgBarTime!=iTime(NULL,prd,0))
     {
      ArgBarTime=iTime(NULL,prd,0);
      FlagNbar=true;
     }

   return(FlagNbar);
  }
 
Alexey Viktorov #:
Владимир, это самое плохое решение…
 

Nikolai Semko #:
Да не нужно здесь сложного кода.

...

Спасибо за волшебный пинок. Действительно, я сильно усложнил то, что можно было сделать проще и, что самое главное, в моём коде пользователю нужно было самостоятельно делать то, что можно было сделать автоматически. Переделал, оставив в качестве интерфейса только функцию IsNewBar()... и еще UpdateNewBar(). Никаких дополнительных переменных или объектов объявлять и создавать не нужно. Да и от UpdateNewBar() можно отказаться, если проверка нового бара гарантированно будет выполняться только в единственном месте (но это потребует небольшой модификации кода)

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