Нулевые результаты оптимизации в тестере

 

Всем привет.

Такая проблема. В результатах оптимизации присутствуют нулевые результаты:

Все бы ничего, но когда вручную ставишь этот результат и прогоняешь его, результат перестает быть нулевым.

Что я только не делал, где только не искал. Поставил запись сообщений в файл из основных функций в OnTesterPass(), думал че интересное увижу, но при нулевых результатах он ничего не записывает. Такое чувство, что при нулевом результате его нигде нет: ни в OnInit, ни в OnTick, ни в OnTester, ни в OnTesterPass. Что тестер просто каким то образом обходит все процедуры и ставит результат ноль.

В чем может быть дело?

 
Nexxtor:

Всем привет.

Такая проблема. В результатах оптимизации присутствуют нулевые результаты:

Все бы ничего, но когда вручную ставишь этот результат и прогоняешь его, результат перестает быть нулевым.

Что я только не делал, где только не искал. Поставил запись сообщений в файл из основных функций в OnTesterPass(), думал че интересное увижу, но при нулевых результатах он ничего не записывает. Такое чувство, что при нулевом результате его нигде нет: ни в OnInit, ни в OnTick, ни в OnTester, ни в OnTesterPass. Что тестер просто каким то образом обходит все процедуры и ставит результат ноль.

В чем может быть дело?


нужно смотреть закономерность переменных при нулевых и ненулевых и по ним искать в коде
 
Nikolay Gaylis:

нужно смотреть закономерность переменных при нулевых и ненулевых и по ним искать в коде
не понял...
 
Nexxtor:
не понял...

*закономерность перебираемых параметров при нулевых и ненулевых разультатах
 

Первое, что я бы сделал - убедился, что в нулевых результатах действительно вызываются все указаные функции.

Сделал бы это через особый результат OnTester() - если нужная функция не вызывалась - возвращаем это самое значение (и включаем кастомный критерий в тестере). Скорее всего - таких значений не будет, эти функции вызываются.

Значит, дальше - уже по коду смотрим, где идет анализ и принятие решения - опять же, там, где сделки должны происходить, но не происходят - выставляем особый флаг возврата, и смотрим по результатам.

Процедура, конечно, довольно муторная, но если и правда, в одиночном проходе сделки есть, а в тестерном - их нет, то другого ничего и не придумаешь для локализации проблемы.

 
Думаю все проще, не все переменные инициализируете в OnInit. Получается если первый раз запустили - переменные обнулены, если оптимизация - переменные не сбрасываются.
 
Nexxtor:

Такая проблема. В результатах оптимизации присутствуют нулевые результаты:

Все бы ничего, но когда вручную ставишь этот результат и прогоняешь его, результат перестает быть нулевым.

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

Отрубите все агенты, оставив один. Скорее всего, ситуация изменится.

 
Aleksei Radchenko:
Думаю все проще, не все переменные инициализируете в OnInit. Получается если первый раз запустили - переменные обнулены, если оптимизация - переменные не сбрасываются.

 

Разработчики писали, что при оптимизации все переменные обнуляются.
 

@George Merts , спасибо за мысль, помогло.

В итоге, нашел причину, в коде в OnTick() стоит 

if(Bars(Symbol(),Period())> glb_MaxIndicatorPeriod){

glb_MaxIndicatorPeriod часто особенно в первых прогонах тестера возвращает вот что (первые две строки):


такое чувство, что в glb_MaxIndicatorPeriod попадают случайные значения из памяти, но высчитывается он правильно:

struct ParametersOfIndicators

   {

   int    ZigZagPeriod;

   int    ZigZagBackStep;

   string NameOfIndicator;

   int    Parameter_1;

   int    Parameter_2;

   int    Parameter_3;

   double KoefSigmoid;

   double AlphaSigmoid;

   int    ParametersQuantity;

   };


//+------------------------------------------------------------------+

//| class CommitteeOfNeuroExperts                                    |

//+------------------------------------------------------------------+

class CommitteeOfNeuroExperts

  {

   // тут были конструктор, деструктор и т.д.....

   void              InitializationParametersOfIndicators(void);

   int               CalculateMaxParameterOfIndicators(void);

   ParametersOfIndicators                cone_ParametersOfIndicators[];

  };

// Это есть в конструкторе, который тут опущен: ArrayResize(cone_ParametersOfIndicators,arg_NeuralNetworkQuantity);

//+------------------------------------------------------------------+

//|на всякий случай добавил процедуру инициализации:                 |

//+------------------------------------------------------------------+

void CommitteeOfNeuroExperts::InitializationParametersOfIndicators(void)

   {

   for (int i=0;i<cone_NeuralNetworkQuantity;++i)

      {

      cone_ParametersOfIndicators[i].ZigZagPeriod        = 0;

      cone_ParametersOfIndicators[i].ZigZagBackStep      = 0;

      cone_ParametersOfIndicators[i].NameOfIndicator     = "";

      cone_ParametersOfIndicators[i].Parameter_1         = 0;

      cone_ParametersOfIndicators[i].Parameter_2         = 0;

      cone_ParametersOfIndicators[i].Parameter_3         = 0;

      cone_ParametersOfIndicators[i].KoefSigmoid         = 0.0;

      cone_ParametersOfIndicators[i].AlphaSigmoid        = 0.0;

      cone_ParametersOfIndicators[i].ParametersQuantity  = 0;

      }

   }

//потом массив cone_ParametersOfIndicators[i] заполняется input параметрами...

//+------------------------------------------------------------------+

//| расчет максимального параметра:                                  |

//+------------------------------------------------------------------+

int CommitteeOfNeuroExperts::CalculateMaxParameterOfIndicators(void)

   {

   int MaxParameter = 0;

   for (int i=0;i<cone_NeuralNetworkQuantity;++i)

      {

      if (cone_NeuroExperts[i].dt_Use == false)

         continue;

      if (cone_ParametersOfIndicators[i].ZigZagPeriod > MaxParameter)

         MaxParameter = cone_ParametersOfIndicators[i].ZigZagPeriod;

      else if (cone_ParametersOfIndicators[i].ZigZagBackStep > MaxParameter)

         MaxParameter = cone_ParametersOfIndicators[i].ZigZagBackStep;

      else if (cone_ParametersOfIndicators[i].Parameter_1 > MaxParameter)

         MaxParameter = cone_ParametersOfIndicators[i].Parameter_1;

      else if (cone_ParametersOfIndicators[i].Parameter_2 > MaxParameter)

         MaxParameter = cone_ParametersOfIndicators[i].Parameter_2;

      else if (cone_ParametersOfIndicators[i].Parameter_3 > MaxParameter)

         MaxParameter = cone_ParametersOfIndicators[i].Parameter_3;

      }

   return MaxParameter;

   }


и разве не должны в тестере прогоны идти по порядку, а не  5,15,10,16,0 (из 20) ? (при полном переборе параметров, медленная оптимизация)

Если сделаю вот так:

 if(Bars(Symbol(),Period())>110){

то все пучком:


@fxsaber , данные из файлов не читаю.

@Aleksei Radchenko , glb_MaxIndicatorPeriod инициализируется в OnInit() 

glb_MaxIndicatorPeriod = glb_CommitteeOfNeuroExperts.CalculateMaxParameterOfIndicators();  

объявлена эта переменная на глобальном уровне.

И возникает все это именно при оптимизации, при ручных прогонах нулевые результаты исчезают.

@Nikolay Gaylis, оптимизируется параметр пустышка, который в коде ничего не делает. То есть советник грузится всегда с одними и теми же параметрами.

 
fxsaber:

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

Отрубите все агенты, оставив один. Скорее всего, ситуация изменится.


На одном агенте, при  (то есть когда есть нулевые результаты в тестере)

if(Bars(Symbol(),Period())> glb_MaxIndicatorPeriod){

получилось все нормально:


и проходы идут по порядку,а не так, как выше. И в чем может быть дело? как теперь остальные агенты (3 шт) включить так, чтоб все нормально тестировалось?

 

Вообщем, почистил Roaming\MetaQuotes\Terminal\Tester, почистил C:\Program Files\Alfa-Forex MetaTrader 5\Tester, перезагрузился, активировал все агенты, запустил оптимизацию, все прошло хорошо. При этом, папка tester в Roaming\MetaQuotes\Terminal не создалась, создалась только в диске C:\Program Files\Alfa-Forex MetaTrader 5.

То есть у агентов кеш разъехался? Часть агентов работало из Roaming, часть из Program Files ? и один из агентов косячил.... Я как раз на той неделе сделал так, чтоб каталог данных терминала всегда был равен каталогу установки, а не так, чтоб он создавался в  Roaming\MetaQuotes\Terminal. (здесь описание https://www.metatrader5.com/ru/terminal/help/start_advanced/start)

Может тогда что-то слетело у агентов....

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