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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Nexxtor
728
Nexxtor  

Всем привет.

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

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

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

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

Nikolay Gaylis
16477
Nikolay Gaylis  
Nexxtor:

Всем привет.

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

@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, оптимизируется параметр пустышка, который в коде ничего не делает. То есть советник грузится всегда с одними и теми же параметрами.

Nexxtor
728
Nexxtor  
fxsaber:

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

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


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

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

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


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

Nexxtor
728
Nexxtor  

Вообщем, почистил 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)

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

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий