Оптимизация советника заканчивается нулевым результатом MT5 - страница 3

 
VVT:

Это определяется следующим параметром count -> закрытый бар=1

count чего? какое свойство. количество чего?

 
Aleksandr Dziuba:

count чего? какое свойство. количество чего?

Вы программист или я? Если хотите получить значение последнего закрытого бара применяйте правильно массив https://www.mql5.com/ru/docs/series/copybuffer

 

Вопрос решен. 

Не вычислялся пересчет баров. Поэтому целая ветка была пропущена и соответственно сделки не совершались. 

Оказалось, что при отладке советника в тестере стратегий при оптимизации и при работе его при реальной торговле и при визуальном тестировании функция BarsCalculated работает по разному.

Данная функция вычисляет количество рассчитанных баров в индикаторе.  По вызову данной функции я вычислял следующее,  произошло ли временное закрытие свечи по заданному тайм фрейму или нет.

   barssdl  = BarsCalculated(sdl_handle);
   barsTrix = BarsCalculated(TriX_handle);
   barsvma  = BarsCalculated(vma_handle);
   if(barssdl==barsTrix && barssdl== barsvma && barssdl > previousbars)
     {
      barsnew=barsTrix;
      //      Print(previousbars," ",barssdl," ",barsTrix," ",barsvma);
      previousbars=barsnew;
      // произошел пересчет бара. Проверяем не было ли сделки.

И если все индикаторы просчитались то значит можно переходить к вычислениям. Но как оказалось что в тестере стратегий данная функция срабатывает после того как прошло копирование в буфер. Поэтому немного изменил логику и все заработало.  Индикаторы считаются в своих потоках поэтому часто приходится использовать функцию       Sleep(Milisecond);

   RefreshRates();
   ResetLastError();
   int copied=CopyBuffer(TriX_handle,0,1,2,TriX_buffer);
   if(copied<=0)
     {
      Print("Ошибка копирования буфера TriX_buffer");
      return;
     }
   copied=CopyBuffer(vma_handle,0,1,2,vma_buffer);
   if(copied<=0)
     {
      Print("Ошибка копирования буфера vma_buffer");
      return;
     }
   copied=CopyBuffer(sdl_handle,0,1,2,sdl_buffer);
   if(copied<=0)
     {
      Print("Ошибка копирования буфера sdl_buffer");
      return;
     }
   barssdl  = BarsCalculated(sdl_handle);
   barsTrix = BarsCalculated(TriX_handle);
   barsvma  = BarsCalculated(vma_handle);
   Print(previousbars," ",barssdl," ",barsTrix," ",barsvma," ",TriX_buffer[0],TriX_buffer[1]);
   if(barssdl==barsTrix && barssdl== barsvma && barssdl > previousbars)
     {
      // Print(" Пересчет");
      barsnew=barsTrix;
      // Print(previousbars," ",barssdl," ",barsTrix," ",barsvma);
      previousbars=barsnew;
      // произошел пересчет бара. Проверяем не было ли сделки.

В дополнение хочу сказать, что данные функции вызываются на событие void OnTick().

Спасибо тем, кто подсказал что можно посмотреть логи агентов. В них записываются Ваши комментарии от функции Print и Вы сможете получить хоть какую то информацию для начала.

Всем удачи кто столкнулся с такой же проблемой. 

Документация по MQL5: Доступ к таймсериям и индикаторам / BarsCalculated
Документация по MQL5: Доступ к таймсериям и индикаторам / BarsCalculated
  • www.mql5.com
BarsCalculated - Доступ к таймсериям и индикаторам - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Причина обращения: