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.
... 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.
void f()
{
for ( int i = 0;; )
{
Print( i );
int i = 5; //Warning: declaration of 'i' hides local declarationPrint( 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)
deleteGetPointer(this);};
};
A a;
voidOnStart()
{
}
2018.09.2321:46:42.960 Test_CheckPointer (EURUSD,M1) Start
2018.09.2321:46:42.961 Test_CheckPointer (EURUSD,M1) 1 undeleted objects left
2018.09.2321:46:42.961 Test_CheckPointer (EURUSD,M1) 1 object of type A left
2018.09.2321: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.2321:54:24.844 Test_CheckPointer (EURUSD,M1) Start
2018.09.2321:54:24.844 Test_CheckPointer (EURUSD,M1) Start
2018.09.2321:54:24.844 Test_CheckPointer (EURUSD,M1) End
2018.09.2321:54:24.844 Test_CheckPointer (EURUSD,M1) POINTER_AUTOMATIC2018.09.2321:54:24.844 Test_CheckPointer (EURUSD,M1) 1 undeleted objects left
2018.09.2321:54:24.845 Test_CheckPointer (EURUSD,M1) 1 object of type A left
2018.09.2321:54:24.845 Test_CheckPointer (EURUSD,M1) 32 bytes of leaked memory
Cómo ejecutar siempre el destructor y ejecutar correctamente el borrado
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.
Posiblemente surja mediante el uso de un algoritmo de optimización genética.
De media, MT4-Tester tarda entre 1,5 y 2 veces menos en procesar un tick que MT5.
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
¿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:
Al ejecutarlo tenemos, como era de esperar:
si una instancia de una clase se declara como:
A *a= new A;entonces en la ejecución tenemos:
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
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...
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;
Gracias, pero no he visto ninguna respuesta a mis preguntas.
No entiendo por qué no se llama al destructor cuandoA *a= new A;
Resultado:
1:PUNTERO_AUTOMÁTICO
1:PUNTERO_DINÁMICO
2:PUNTERO_DINÁMICO
2:PUNTERO_AUTOMÁTICO
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