Errores, fallos, preguntas - página 1962

 
Andrey Khatimlianskii:

¿Cómo ayuda esto?

La optimización ha pasado, hemos anotado todos los parámetros a buscar con rangos de valores.

Y luego ejecutamos una sola prueba, leemos la lista de parámetros y la mostramos: parámetro = valor. En este caso no conocemos el valor, porque no podemos referirnos a la intu-variable por su nombre.

El parámetro de entrada es bool Optim. En OnInit, se devuelve INIT_FAILED si Optim == true. Al mismo tiempo en OnTesterPass a través de FrameInputs y ParameterGetRange (o en el destructor del objeto de clase global) se escribe el SET real de Optimización.

Entonces se pone Optim = false. Y tomar un parámetro más sinput int Rango, establecerlo a través de ParameterSetRange para cambiar de cero a uno. Leer el archivo SET en OnTesterInit y establecer los valores de todos los parámetros del archivo en ParameterSetRange. Cuando Range == 0 devuelve INIT_FAILED en OnInit.

¡Eso es todo! En lugar de la optimización simple, tienes la optimización imaginaria, que también es más rápida que la optimización simple.... Además de los parámetros de entrada de lectura/escritura.

 

Pregunta fuera de tema pero le preguntaré si es posible complementar el manual de MQL5 con ejemplos adicionales de implementación de algoritmos más y más claros

 
fxsaber:

Hacer el parámetro de entrada bool Optim. En OnInit se devuelve INIT_FAILED si Optim == true. Al mismo tiempo en OnTesterPass a través de FrameInputs y ParameterGetRange (o en el destructor del objeto de clase global) se escribe realmente SET-file Optimization.

Entonces se pone Optim = false. Y tomar un parámetro más sinput int Rango, establecerlo a través de ParameterSetRange para cambiar de cero a uno. Lee el archivo SET en OnTesterInit y establece los valores de todos los parámetros del archivo en ParameterSetRange. Cuando Range == 0 devuelve INIT_FAILED en OnInit.

¡Eso es todo! En lugar de la optimización simple, tienes la optimización imaginaria, que también es más rápida que la optimización simple.... Además de los parámetros de entrada de lectura/escritura.

Gracias por el algoritmo detallado.

 
Tiempo de compilación en 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

Tiempo de compilación en 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

¡Algo se ha retocado!

 

Error de compilación

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
}

Y si se sustituye la línea (*) por

                int  f() { return 0; } //(*)
entonces está bien. ¿Cuál es la diferencia?

Se parece ahttps://www.mql5.com/ru/forum/1111/page1977#comment_5595772, pero tiene un código de error diferente


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

Error durante la compilación

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

Por lo demás:


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

Está bien. ¿Qué diferencia hay?
 
A100:

Error durante la compilación

pero de esta manera:

normalmente. ¿Cuál es la diferencia?

La diferencia es enorme. Cuando se llama a g(f), el compilador no tiene ni idea de qué tipo es f, porque sólo se prescribe la plantilla. Si se sobrecarga la plantilla, no hay problema

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:
Tiempo de compilación en 1643.

Tiempo de compilación en 1648


¡Es un ajuste genial!

El mío es el mismo que era, ¡la compilación no es más rápida!

 
Vitaly Muzichenko:

Todavía lo tengo, la compilación no está acelerada

Tal vez no utilizar lo que solía ralentizar en TesterBenchmark.mqh

 
fxsaber:

La diferencia es enorme. Cuando se llama a g(f), el compilador no tiene ni idea de qué tipo es f, porque sólo se prescribe la plantilla. Si se sobrecarga la plantilla, no hay problema

Si hay una gran diferencia, ¿por qué C++ compila bien con ambas variantes?