Как обнаружить новый бар

 

Привет всем,

Я полный новичок в MQL5, но я сделал достаточно много кодирования для других платформ.

Мне интересно, почему советнику так сложно исполняться только на новом баре. Я просмотрел некоторые статьи, включая обработчик события "новый бар", и это кажется очень сложным.

Если это не сработает и мне придется использовать обработчик события "новый бар", можно ли просто загрузить соответствующие файлы и скопировать их в папку Files(?), а затем #include их? Есть ли где-нибудь документация по этому вопросу для таких людей, как я, которые не имеют ни малейшего представления о том, что они делают?

Я работаю над учебником в https://www.mql5.com/en/articles/100, и первое, что я заметил, это то, что функция "Bars" используется для обеспечения достаточного количества баров для выполнения расчетов, но следующая часть кода, очевидно, предназначена для обнаружения нового бара и является (насколько я понимаю) очень сложной частью кода. Не может ли функция Bars использоваться для обнаружения нового бара? Что-то вроде if(Bars > int LastBarCount) {bool IsNewBar = true; LastBarCount = Bars;} else {IsNewBar = false;}. Будет ли что-то подобное работать?

Один для списка пожеланий. Было бы хорошо, если бы вместо OnTick было событие OnNewBar, которое мы могли бы переопределять? Поскольку все индикаторы, которые я когда-либо видел, работают на барах, а не на тиках, я думаю, это значительно облегчило бы жизнь всем.

Только что нашел еще одну возможность: "BarsCalculated". Опять же, не совсем понимаю, что это значит из описания, но похоже, что это количество баров, которые советник уже обработал. Если бы это было так, то все, что мне нужно было бы проверить, это if(Bars > BarsCalculated), если верно, то идти и делать мою обработку, иначе возврат? Я что-то упустил?

Спасибо,

Ян

Step-By-Step Guide to writing an Expert Advisor in MQL5 for Beginners
  • 2010.06.09
  • Samuel
  • www.mql5.com
The Expert Advisors programming in MQL5 is simple, and you can learn it easy. In this step by step guide, you will see the basic steps required in writing a simple Expert Advisor based on a developed trading strategy. The structure of an Expert Advisor, the use of built-in technical indicators and trading functions, the details of the Debug mode and use of the Strategy Tester are presented.
 


Попробуйте сделать это в своем советнике, в начале функции OnTick.

// Мы будем использовать статическую переменную Old_Time для сохранения времени бара.

// При каждом выполнении OnTick мы будем сверять текущее время бара с сохраненным.

// Если время бара не равно сохраненному времени, это означает, что у нас новый тик.


static datetime Old_Time;

datetime New_Time[1];

bool IsNewBar=false;


// копируем время последнего бара в элемент New_Time[0]

int copied=CopyTime(_Symbol,_Period,0,1,New_Time);

if(copied>0) // ok, данные успешно скопированы

{

if(Old_Time!=New_Time[0]) // если старое время не равно новому времени бара

{

IsNewBar=true; // если это не первый вызов, то появился новый бар

if(MQL5InfoInteger(MQL5_DEBUGGING)) Print("У нас тут новый бар ",New_Time[0], "старое время было ",Old_Time);

Old_Time=New_Time[0]; // сохранение времени бара

}

}

else

{

Alert("Ошибка при копировании исторических данных времени, ошибка =",GetLastError());

ResetLastError();

return;

}


//--- Советник должен проверять новую сделку, только если у нас есть новый бар

if(IsNewBar==false)

{

return;

}

//--- Достаточно ли у нас баров для работы

int Mybars=Bars(_Symbol,_Period);

if(Mybars<60) // если общее количество баров меньше 60 баров

{

Alert("У нас менее 60 баров, советник сейчас выйдет!!!");

return;

}


 

Привет, oneillj,

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

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

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

;-) Ian
Documentation on MQL5: Timeseries and Indicators Access / BarsCalculated
  • www.mql5.com
Timeseries and Indicators Access / BarsCalculated - Documentation on MQL5
 
Я использую это...
static int BARS;
//+------------------------------------------------------------------+
//| NewBar function                                                  |
//+------------------------------------------------------------------+
bool IsNewBar()
   {
      if(BARS!=Bars(_Symbol,_Period))
        {
            BARS=Bars(_Symbol,_Period);
            return(true);
        }
      return(false);
   }
 
"New Bar" Event Handler
  • 2010.10.11
  • Konstantin Gruzdev
  • www.mql5.com
MQL5 programming language is capable of solving problems on a brand new level. Even those tasks, that already have such solutions, thanks to object oriented programming can rise to a higher level. In this article we take a specially simple example of checking new bar on a chart, that was transformed into rather powerful and versatile tool. What tool? Find out in this article.
 
ssn:
Я использую это...
Риск этого метода заключается в том, что если ценовые данные для вашего символа не начинаются с 4 января 1971 года, то любые загруженные исторические данные, пока эксперт прикреплен к графику, будут считываться как новый бар...
 
Комментарии, не относящиеся к данной теме, были перемещены в раздел "Можно ли использовать mql5 в MT4?".
 

Функция iTime выдает время бара.

Когда оно меняется, это новый бар.

 
Nathan5:

Функция iTime выдает время бара.

Когда оно меняется, это новый бар.

Эта тема посвящена mql5. В нем нет функции iTime().
 

Вы также можете попробовать следующее:


// Rates structure array for last two bars 
   MqlRates mrate[2];                 
   CopyRates(Symbol(), Period(), 0, 2, mrate);

// NEW BAR CHECK.
//---------------
   static double   dBar_Open;     
   static double   dBar_High;
   static double   dBar_Low;
   static double   dBar_Close;
   static long     lBar_Volume;
   static datetime nBar_Time;

// Boolean for new BAR confirmation. 
   bool bStart_NewBar = false;

// Check if the price data has changed tov the previous bar.   
   if(mrate[0].open != dBar_Open || mrate[0].high != dBar_High || mrate[0].low != dBar_Low || mrate[0].close != dBar_Close || mrate[0].tick_volume != lBar_Volume || mrate[0].time != nBar_Time)
         {
         bStart_NewBar = true; // A new BAR has appeared!        

// Update the new BAR data.     
         dBar_Open   = mrate[0].open;      
         dBar_High   = mrate[0].high;
         dBar_Low    = mrate[0].low;
         dBar_Close  = mrate[0].close;                 
         lBar_Volume = mrate[0].tick_volume;
         nBar_Time   = mrate[0].time;
         }

// Check if a new bar has formed.   
   if(bStart_NewBar == true)
         {
         
// Your code.          
         
         }
 
Stephen Njuki:
Я использую это...
К сожалению, это не работает в MQL5.
Причина обращения: