Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2652

 
Vladimir #:
Здравствуйте! Могли бы вы указать в чем здесь моя ошибка? 

По каким то причинам условие isNewBar не работает и экперт обрабатывает код на каждом тике, вместо одного бара

Код конечно далёк от нормального, но всё-же должен работать хоть как-то… Проблема кажется в том, что для каждого символа должен быть свой экземпляр объекта.

 
Vladimir #:
Здравствуйте! Могли бы вы указать в чем здесь моя ошибка? 

По каким то причинам условие isNewBar не работает и экперт обрабатывает код на каждом тике, вместо одного бара
Здравствуйте. Не запуская код, могу сказать, что у вас нет инициализации нулём поля lastbar в конструкторе. Из-за этого там может оказаться произвольное ненулевое значение, которое никогда не позволит выполниться условию lastbar==0. А это приведёт к тому, что всегда будет выполнено условие lastbar!=curbar.

И для разных символов надо создавать разные объекты этого класса.
 
Понял. Благодарю за помощь! 
 
Yuriy Bykov #:
Здравствуйте. Не запуская код, могу сказать, что у вас нет инициализации нулём поля lastbar в конструкторе. Из-за этого там может оказаться произвольное ненулевое значение, которое никогда не позволит выполниться условию lastbar==0. А это приведёт к тому, что всегда будет выполнено условие lastbar!=curbar.

И для разных символов надо создавать разные объекты этого класса.

Это не самая серьёзная ошибка. Если там окажется не нулевое значение, то выполнится условие

if(lastbar!=curbar)
 
Vladimir #:
Здравствуйте! Могли бы вы указать в чем здесь моя ошибка? 

По каким то причинам условие isNewBar не работает и экперт обрабатывает код на каждом тике, вместо одного бара

Создаём  класс ради класса.

Можно не плодить кучу классов, а просто сделать массив для предыдущего времени.

//+------------------------------------------------------------------+
class CNevBar
  {
private:
   long          lastbar[];
public:
                     CNevBar();
                    ~CNevBar();
   bool              bar(int u, string symbol, ENUM_TIMEFRAMES period);
  };
//+------------------------------------------------------------------+
void CNevBar::CNevBar()
  {
   ArrayResize(lastbar, SymbolsTotal(true));
   ZeroMemory(lastbar);
  }
//+------------------------------------------------------------------+
void CNevBar::~CNevBar(void)
  {

  }
//+------------------------------------------------------------------+
bool CNevBar:: bar(int u, string symbol, ENUM_TIMEFRAMES period)
  {
  long curbar = SeriesInfoInteger(symbol, period, SERIES_LASTBAR_DATE);
   
   if(lastbar[u] == 0)
      lastbar[u] = SeriesInfoInteger(symbol, period, SERIES_LASTBAR_DATE);
      
   if(lastbar[u] != curbar)
     {
      lastbar[u] = curbar;
      return(true);
     }
     
   return(false);
  }
//+------------------------------------------------------------------+
CNevBar isNewBar;
//+------------------------------------------------------------------+
void OnTick()
  {
   for(int u = 0; u < SymbolsTotal(true); u++)
     {
      if(isNewBar.bar(u, SymbolName(u, true), PERIOD_CURRENT))
        {
         //Code Signals
        }
     }
  }
//+------------------------------------------------------------------+
 

раньше таким пользовался

//+------------------------------------------------------------------+
//| Class Новый бар                                                  |
//+------------------------------------------------------------------+
class CNewBar
  {
protected:
   datetime          oldTime;
public:
   bool              NewBar(string symbol,ENUM_TIMEFRAMES timeframe)
     {
      datetime newTime=datetime(SeriesInfoInteger(symbol,timeframe,SERIES_LASTBAR_DATE));
      if(newTime!=oldTime && newTime) // проверка на появление нового бара
        {
         oldTime=newTime; //обновим время прошлого бара
         return(true); // вернем функции NewBar true, появился новый бар
         //--- иначе,
         return(false); // нового бара еще нет
        };
      //---- конструктор класса
      CNewBar() {oldTime=NULL;}; 
     };
 
Alexey Viktorov #:

Это не самая серьёзная ошибка. Если там окажется не нулевое значение, то выполнится условие 

if(lastbar!=curbar)

Про то и речь. Это условие будет всегда выполнено, и поведение будет таким, как описал Vladimir - на каждом тике есть новый бар.

Для определения события нового бара использую свою библиотеку, выложенную в Codebase. Кстати, надо её обновить до актуальной версии, в которой внесены мелкие дополнения и комментарии.

New Bar Event
New Bar Event
  • 2022.02.03
  • www.mql5.com
Позволяет определить наступление события нового бара в мультивалютном советнике. В вызове OnTick() можно многократно проверять, наступило ли на этом тике событие для нужного инструмента (symbol) и периода графика (timeframe).
 

исправленная версия, по месту редактировал, не то удалил

//+------------------------------------------------------------------+
//| Class Новый бар                                                  |
//+------------------------------------------------------------------+
class CNewBar
  {
protected:
   datetime          oldTime;
public:
   bool              NewBar(string symbol,ENUM_TIMEFRAMES timeframe)
     {
      datetime newTime=datetime(SeriesInfoInteger(symbol,timeframe,SERIES_LASTBAR_DATE));
      if(newTime!=oldTime && newTime) // проверка на появление нового бара
        {
         oldTime=newTime; //обновим время прошлого бара
         return(true); // вернем функции NewBar true, появился новый бар
        };
      //--- иначе,
      return(false); // нового бара еще нет
     };
   //---- конструктор класса
                     CNewBar() {oldTime=NULL;};
  };
//+------------------------------------------------------------------+

Запускать так

   static CNewBar M1;
//--- проверим новый ли бар
   if(M1.NewBar(Symbol(),PERIOD_M1))  
      Print("Новый бар ",TimeToString(TimeCurrent(),TIME_SECONDS));
 

Перестал компилироваться советник для мт5

Выдаёт такие ошибки:


Кто знает как исправить?

Файлы:
iw2.jpg  282 kb
 
Ihar Tsitou #:

Перестал компилироваться советник для мт5

Выдаёт такие ошибки:


Кто знает как исправить?

Нужно весь код смотреть, чтобы понять, где ошибка