Errores, fallos, preguntas - página 2296

 
A100:

No hay ningún problema... hay un error. Tampoco entiendo por qué te sacas la explicación de la cabeza. La impresión por defecto tiene la siguiente firma:

Y también puede chocar con otras funciones (si es necesario)

La firma de impresión está fuera del alcance del lenguaje MQL5. Si MQL5 prohíbe la sobrecarga de impresión en absoluto, no será un error.

Espero que este "bug" no le impida crear TS y no requiera muletas de escritura.

 

He medido el rendimiento del probador. Para ello, abrí y cerré una posición en cada tick. He medido el tiempo de ejecución de 100 ticks. Lo pasé por 100 000 ticks. He medido un total de 1000 ticks. Tengo este gráfico

Hay picos de ralentización a distancias casi iguales entre ellos. Lo he medido en el modo de optimización. Si ignoro esos picos, el rendimiento del probador varía un 25% en lugar del valor constante. Tal vez sean los trucos de medición de velocidad de Windows otra vez.


SZZ El mismo código que ejecuté en MT4

Por término medio, MT4 Tester tarda entre 1,5 y 2 veces menos en procesar un tick que MT5.

Archivos adjuntos:
Tester.mq5  2 kb
 

Posiblemente surja mediante el uso de un algoritmo de optimización genética.


... En cada tick abierto y cerrado una posición. <br / translate="no">
De media, MT4-Tester tarda entre 1,5 y 2 veces menos en procesar un tick que MT5.
Y esto es pura manipulación y engaño.
 
Sergey Dzyublik:

Posiblemente surja mediante el uso de un algoritmo de optimización genética.

No GA. Optimización a partir de dos pases en un agente.

Y esto ya es pura manipulación y engaño.

El código fuente está en su sitio.

 

En un caso una advertencia, en el otro un error

void f()
{
    for ( int i = 0;; )
    {
        Print( i );
        int    i = 5; //Warning: declaration of 'i' hides local declaration
        Print( i );
        break;
    }
}
void For( int i = 0 )
    {
        Print( i );
        int    i = 5; //Error: redefinition of formal parameter 'i'
        Print( i );
    }

¿Cuál es la diferencia fundamental? En C++, por ejemplo, hay un error en ambos casos

 

Pido ayuda a los entendidos para entender el tema de los punteros a instancias de clases. No lo entiendo.

Aquí hay un ejemplo de la secuencia de comandos:

class A
  {
public :
                     A() { Print("Start"); };
                    ~A() { 
                     Print("End"); 
                     Print(EnumToString(CheckPointer(GetPointer(this)))); 
                     if (CheckPointer(GetPointer(this))!=POINTER_DYNAMIC) 
                     delete GetPointer(this);};
  };
  
A a;

void OnStart()
  {
  }

Al ejecutarlo tenemos, como era de esperar:

2018.09.23 21:56:20.574 Test_CheckPointer (EURUSD,M1)   Start
2018.09.23 21:56:20.574 Test_CheckPointer (EURUSD,M1)   End
2018.09.23 21:56:20.574 Test_CheckPointer (EURUSD,M1)   POINTER_AUTOMATIC


si una instancia de una clase se declara como:

A *a= new A;

entonces en la ejecución tenemos:

2018.09.23 21:46:42.960 Test_CheckPointer (EURUSD,M1)   Start
2018.09.23 21:46:42.961 Test_CheckPointer (EURUSD,M1)   1 undeleted objects left
2018.09.23 21:46:42.961 Test_CheckPointer (EURUSD,M1)   1 object of type A left
2018.09.23 21:46:42.961 Test_CheckPointer (EURUSD,M1)   32 bytes of leaked memory

es decir, el destructor ni siquiera se inicia y, por tanto, no se libera memoria.


Pero si una instancia de una clase se declara como:

A a= new A;

el constructor se lanza dos veces, el destructor - una vez, pero la memoria no se libera y tenemos el tipo de puntero de objetoPOINTER_AUTOMATIC, aunque estaba destinado a serPOINTER_DYNAMIC

2018.09.23 21:54:24.844 Test_CheckPointer (EURUSD,M1)   Start
2018.09.23 21:54:24.844 Test_CheckPointer (EURUSD,M1)   Start
2018.09.23 21:54:24.844 Test_CheckPointer (EURUSD,M1)   End
2018.09.23 21:54:24.844 Test_CheckPointer (EURUSD,M1)   POINTER_AUTOMATIC
2018.09.23 21:54:24.844 Test_CheckPointer (EURUSD,M1)   1 undeleted objects left
2018.09.23 21:54:24.845 Test_CheckPointer (EURUSD,M1)   1 object of type A left
2018.09.23 21:54:24.845 Test_CheckPointer (EURUSD,M1)   32 bytes of leaked memory


Cómo ejecutar siempre el destructor y ejecutar correctamente el borrado

 

Как добиться всегда выполнения деструктора и правильного выполнения delete.


Ver desde C++ el tema de los punteros inteligentes y adaptarlo para MQL(https://habr.com/post/140222/).
Quizá haya algo en kodobase...

 
Sergey Dzyublik:


Ver desde C++ el tema de los punteros inteligentes y adaptarlo para MQL(https://habr.com/post/140222/).
Quizá haya algo en kodobase...

gracias, pero no vi ninguna respuesta a mis preguntas allí.
No entiendo por qué no se llama al destructor cuandoA *a= new A;

 
Nikolai Semko:

Gracias, pero no he visto ninguna respuesta a mis preguntas.
No entiendo por qué no se llama al destructor cuandoA *a= new A;

Entonces inténtalo así:
class A { public:
         A() { Print( 1, ":", EnumToString(CheckPointer(GetPointer(this)))); }
        ~A() { Print( 2, ":", EnumToString(CheckPointer(GetPointer(this)))); }
};
class B { public:
         B( void *b ) : b( b ) {}
        ~B() { delete b; }
        void *b;
};
A a1;
A *a2 = new A;
B b( a2 );
void OnStart() {}

Resultado:

1:PUNTERO_AUTOMÁTICO
1:PUNTERO_DINÁMICO
2:PUNTERO_DINÁMICO
2:PUNTERO_AUTOMÁTICO

 
Nikolai Semko:

Gracias, pero no he visto ninguna respuesta a mis preguntas.
No entiendo por qué no se llama al destructor cuandoA *a= new A;

Crear con new y borrar con delete

Razón de la queja: