Ошибки, баги, вопросы - страница 1961

 
fxsaber:

Не ошибка ли это, что const-метод все таки может менять поле своей структуры?

Гы, в приведенном коде меняется не this.i, а другой экземпляр Struct.i. Ошибки нет. Чтобы блокировать модификацию параметра Struct нужно и его объявить const.

 
Andrey Khatimlianskii:

Вариант "оптимизация + тест" вполне подходит для удобного отображения входных параметров одиночных проходов после оптимизации.

Но как при одиночном проходе получить список параметров, кроме как из файла, подготовленного при оптимизации? И как параметрам из этого файла сопоставить используемые в тесте значения?

Только если делать мнимую Оптимизацию в два прохода, вместо одиночного.

 
Stanislav Korotky:

Гы, в приведенном коде меняется не this.i, а другой экземпляр Struct.i. Ошибки нет. Чтобы блокировать модификацию параметра Struct нужно и его объявить const.

Да, механизм понятен.

 
fxsaber:

Только если делать мнимую Оптимизацию в два прохода, вместо одиночного.

И как параметрам из этого файла сопоставить используемые в тесте значения?

 

Andrey Khatimlianskii:

И как параметрам из этого файла сопоставить используемые в тесте значения?

Через ParameterSetRange.

 
fxsaber:

Через ParameterSetRange.

Как это поможет?

Оптимизация прошла, мы записали все перебираемые параметры с диапазонами значений.

А потом запускаем одиночный тест, читаем список параметров, и выводим его на экран: параметр = значение. При этом значение нам не известно, т.к. мы не можем обратиться к инпут-переменной по имени.

 
Andrey Khatimlianskii:

Как это поможет?

Оптимизация прошла, мы записали все перебираемые параметры с диапазонами значений.

А потом запускаем одиночный тест, читаем список параметров, и выводим его на экран: параметр = значение. При этом значение нам не известно, т.к. мы не можем обратиться к инпут-переменной по имени.

Делаете входной параметр bool Optim. В OnInit возвращаете INIT_FAILED, если Optim == true. При этом в OnTesterPass через FrameInputs и ParameterGetRange (или в деструкторе глобального объекта класса) записываете фактически SET-файл Оптимизации.

Далее ставите Optim = false. И берете еще один параметр sinput int Range, задаете ему через ParameterSetRange изменение от нуля до единицы. В OnTesterInit считываете SET-файл и задаете значения всех параметров из файла в ParameterSetRange. В OnInit при Range == 0 возвращаете INIT_FAILED. 

Все! Вместо одиночного имеете мнимую Оптимизацию, которая еще и быстрее одиночного будет.... Плюс считывание/запись входных параметров.

 

не в тему вопрос но спрошу или попрошу можно ли дополнять справочник MQL5 дополнительными примерами реализации алгоритмов больше и наглядней

 
fxsaber:

Делаете входной параметр bool Optim. В OnInit возвращаете INIT_FAILED, если Optim == true. При этом в OnTesterPass через FrameInputs и ParameterGetRange (или в деструкторе глобального объекта класса) записываете фактически SET-файл Оптимизации.

Далее ставите Optim = false. И берете еще один параметр sinput int Range, задаете ему через ParameterSetRange изменение от нуля до единицы. В OnTesterInit считываете SET-файл и задаете значения всех параметров из файла в ParameterSetRange. В OnInit при Range == 0 возвращаете INIT_FAILED. 

Все! Вместо одиночного имеете мнимую Оптимизацию, которая еще и быстрее одиночного будет.... Плюс считывание/запись входных параметров.

Спасибо за подробный алгоритм.

 
Время компиляции в 1643
'TesterBenchmark_Example.mq5'   TesterBenchmark_Example.mq5     1       1
'TesterBenchmark.mqh'   TesterBenchmark.mqh     1       1
0 error(s), 0 warning(s), compile time: 3113 msec               1       1

Время компиляции в 1648

'TesterBenchmark_Example.mq5'   TesterBenchmark_Example.mq5     1       1
'TesterBenchmark.mqh'   TesterBenchmark.mqh     1       1
0 error(s), 0 warning(s), compile time: 219 msec                1       1

Что-то круто подкрутили!