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

Всем привет.

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

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

Что я только не делал, где только не искал. Поставил запись сообщений в файл из основных функций в 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 шт) включить так, чтоб все нормально тестировалось?

История продолжается.....

Работаю дальше, изменил код, перекомпилировал, опять полезли нули....

Поставил один агент (1), все хорошо...

Поставил два агента (1,4), все хорошо....

Три агента (1,3,4)- хорошо, четыре - плохо, опять три (1,2,4) - хорошо....


Вообще не понимаю что твориться...

Что- то с терминалом? С процессором?