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

 
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

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

 

Ошибка при компиляции

typedef void (*fn)( int );
struct A {
                void f() { return   ; } //(*)
        static  void f( int ) {}
};
void g( fn ) {}
void OnStart()
{
        g( A::f ); //error: 'f' - cannot resolve function address
}

а если заменить строку (*) на

                int  f() { return 0; } //(*)
то нормально. А какая разница?

Похоже на https://www.mql5.com/ru/forum/1111/page1977#comment_5595772, но отличается кодом ошибки  


Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2017.08.11
  • www.mql5.com
Форум алго-трейдеров MQL5
 

Ошибка при компиляции

template<typename T>
void g( T ) {}
void f() {}
void OnStart()
{
        g( f ); //error: 'g' - cannot to apply function template
}

а так:


template<typename T>
void g( T ) {}
void f() {}
typedef void (*fn)();
void OnStart()
{
        fn ff = f;
        g( ff ); //нормально
}

нормально. А какая разница?
 
A100:

Ошибка при компиляции

а так:

нормально. А какая разница?

Разница огромная. Когда вызывается g(f), то компилятор понятия не имеет, какого типа f, т.к. прописан только template. Если перегрузить template, то не будет проблем

typedef void (*fn)();

template<typename T>
void g( T Value ) { Print(typename(Value)); }
void f() {}

void g( fn Value ) { Print(typename(Value)); }
void OnStart()
{
        g( f ); // void(*fn)()
}
 
fxsaber:
Время компиляции в 1643

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


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

У меня как было, так и осталось, компиляция не ускорилась

 
Vitaly Muzichenko:

У меня как было, так и осталось, компиляция не ускорилась

Возможно, не используете то, что раньше тормозило в TesterBenchmark.mqh

 
fxsaber:

Разница огромная. Когда вызывается g(f), то компилятор понятия не имеет, какого типа f, т.к. прописан только template. Если перегрузить template, то не будет проблем

Если разница огромная, то почему тогда в С++ нормально компилируются оба варианта?
Причина обращения: