При тестировании эксперта значения индикатора не обновляются

 

Добрый день! Пытаюсь написать свой эксперт в котором мне необходимо отслеживать появление сформировавшегося бара.  Но при тестировании  эксперта я обнаружил что мой эксперт не всегда  обнаруживает  его. Как я выяснил причина оказалась в том, что индикатор CiTime не обновил свои значения.  В чем причина ? Что я не так делаю?

Код класса моего эксперта

//+------------------------------------------------------------------+
//|                                                       NewBar.mqh |
//+------------------------------------------------------------------+
#include <Expert\Expert.mqh>
class CNewBar : public CExpert
{
   private:
      datetime    m_LastTimeBar;
   public :
      CNewBar();
      void OnTick();
      void OnNewBar();
      bool Processing();
      
};
//+------------------------------------------------------------------+
CNewBar::CNewBar(void)
{
      m_used_series |= USE_SERIES_TIME;
}
//+------------------------------------------------------------------+
void CNewBar::OnTick()
{
   CExpert::OnTick();
   //printf("Time(0) = %s %s ", TimeToString(Time(0),TIME_DATE),TimeToString(Time(0),TIME_MINUTES));
   //Проверяем на изменение Time(1) т.к. Time(0) постоянно изменяеться
   if(m_LastTimeBar != Time(1))
   {
      m_LastTimeBar = Time(1);
      OnNewBar();
   }
}
//+------------------------------------------------------------------+
// Вызываеться когда бар полностью сформировался 
//+------------------------------------------------------------------+
void CNewBar::OnNewBar()
{
   printf("LastTimeBar = %s %s ", TimeToString(m_LastTimeBar,TIME_DATE),TimeToString(m_LastTimeBar,TIME_MINUTES));
}
//+------------------------------------------------------------------+
// Для простоты чтоб ничего не мешало
//+------------------------------------------------------------------+
bool CNewBar::Processing()
{
   return false;
}

Код эксперта

//+------------------------------------------------------------------+
//|                                                 ExpertNewBar.mq5 |
//+------------------------------------------------------------------+
#include <Expert\Trash\NewBar.mqh>
CNewBar Expert;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
//---
   if(!Expert.Init(Symbol(),Period(),true,12345))
   {
      //--- failed
      printf(__FUNCTION__+": error initializing expert");
      Expert.Deinit();
      return(-1);
   }   
   //--- Tuning of all necessary indicators
   if(!Expert.InitIndicators())
   {
      //--- failed
      printf(__FUNCTION__+": error initializing indicators");
      Expert.Deinit();
      return(-2);
   }
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
//---
   Expert.OnTick();
}
//+------------------------------------------------------------------+

Результат вызова


Причем если разкоментировать строчку в классе эксперта в методе OnTick()

printf("Time(0) = %s %s ", TimeToString(Time(0),TIME_DATE),TimeToString(Time(0),TIME_MINUTES));

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


 
miroslavovich:

Добрый день! Пытаюсь написать свой эксперт в котором мне необходимо отслеживать появление сформировавшегося бара.  Но при тестировании  эксперта я обнаружил что мой эксперт не всегда  обнаруживает  его. Как я выяснил причина оказалась в том, что индикатор CiTime не обновил свои значения.  В чем причина ? Что я не так делаю?

Код класса моего эксперта

Код эксперта

Результат вызова


Причем если разкоментировать строчку в классе эксперта в методе OnTick()

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


На первый взгляд никакого "криминала". Я посмотрю попозже, если Вы не возражаете.
 

miroslavovich:

Причем если разкоментировать строчку в классе эксперта в методе OnTick()

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


А Вы где смотрите результаты, в журнале тестера ? Туда не всё выводится. Надо смотреть в журнале агента.


 

Valmars:

А Вы где смотрите результаты, в журнале тестера ? Туда не всё выводится. Надо смотреть в журнале агента.

А где его можно посмотреть?
 
miroslavovich:
А где его можно посмотреть?
Ну, можно и в проводнике, но проще правая кнопка мыши во вкладке 'Журнал', 'Журналы локальных агентов'
 
miroslavovich:
А где его можно посмотреть?

https://www.metatrader5.com/ru/terminal/help/algotrading/testing:

Контекстное меню

Контекстное меню данной вкладки позволяет выполнить следующие команды:

  • Открыть Открыть — открыть папку, содержащую лог-файлы журнала. При выполнении данной команды также происходит сброс текущих записей журнала в лог-файлы. Данные файлы хранятся в каталоге /tester/logs клиентского терминала. Имена файлов соответствуют дате формирования журнала — ГГГГММДД.LOG. Таким образом можно посмотреть предыдущие записи о работе терминала, во вкладке "Журнал" отображаются только последние записи;
  • Копировать Копировать — скопировать строку с информацией в буфер обмена для использования в других приложениях;
  • Просмотр Просмотр — открыть окно специальной программы для просмотра лог-файлов;
  • Удалить журналы Удалить журналы — удалить все журналы тестера стратегий (/tester/logs) и агентов тестирования (/tester/agent-*/logs). При выполнении данной команды удаляются все файлы журналов из указанных папок. Если файл журнала в текущий момент используется (открыт агентом или пользователем вручную), его удаление невозможно;
  • Журналы локальных агентов — открыть подменю для просмотра записей журналов локальных агентов тестирования. При нажатии на названии агента в подменю будет открыто окно просмотра его лог-файла;
 

Результат тот же




 
miroslavovich:

Результат тот же

Ну что ж, значит дело не в обновлении журнала. Кстати, откомпилировал Ваш же код, прогнал его в тестере, пропусков, подобных Вашим, в журнале не наблюдаю. У Вас последний билд терминала (478) установлен ? С 'Мастером' пока не разбирался, подождём разъяснений разработчика.




 
билд терминала 478

 

Обнаружил две ошибки:

1. В тестере провал в тиках несколько минут.

2. М.б. так и должно быть, но класс CExpert не был готов к такому повороту событий (моя вина).

Разбираюсь.