Errores, fallos, preguntas - página 2297

 
Nikolai Semko:

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

https://www.mql5.com/ru/docs/basis/variables/object_live

Todos los objetos creados por la expresión puntero_objeto=nuevoNombre_clase deben ser destruidos posteriormente por el operador delete(puntero_objeto). Si, por alguna razón, esta variable no fue destruidapor el operador de borrado, el mensaje sobre ella aparecerá en el diario "Expertos". Es posible declarar varias variables y asignarlas todas al mismo puntero de objeto.

Документация по MQL5: Основы языка / Переменные / Создание и уничтожение объектов
Документация по MQL5: Основы языка / Переменные / Создание и уничтожение объектов
  • www.mql5.com
После загрузки на исполнение mql5-программы каждой переменной выделяется память в соответствие с типом переменной. Переменные делятся на два типа по уровню доступа - глобальные переменные и локальные переменные, и по классам памяти: входные параметры mql5-программы, статические и автоматические. Каждая переменная при необходимости...
 

Pido a MQL que compruebe la función OnTimer().

Por alguna razón no funciona en el probador de estrategias para MT4 (no hay errores, simplemente no se ejecuta nada dentro de esta función), mientras que en línea está bien.

Para MT5 la función funciona tanto en el probador como en línea.

Gracias.

 
Se dedica mucho tiempo a Incorrect-Init
Core 1  pass 114 tested with error "incorrect input parameters" in 0:00:00.218

En OnInit sólo se comparan dos números, y se tarda más tiempo en una pasada incorrecta que en una pasada completa. ¿Por qué?


Vamos a ejecutar este Asesor Experto en la optimización completa

input int Range = 0; // задать Оптимизацию 1 .. 10000

int OnInit() { return(INIT_PARAMETERS_INCORRECT); }


Obtenemos el resultado del trabajo de 8 Agentes

Tester  optimization finished, total passes 10000
Statistics      optimization done in 2 minutes 24 seconds


Aquí está nuestro Asesor Experto ahora

input int Range = 0; // задать Оптимизацию 1 .. 10000

void OnInit() {}
Tester  optimization finished, total passes 10000
Statistics      optimization done in 0 minutes 31 seconds


Por fin, como éste

input int Range = 0; // задать Оптимизацию 1 .. 10000

void OnInit() { ExpertRemove(); }
Tester  optimization finished, total passes 10000
Statistics      optimization done in 2 minutes 19 seconds


Dos salidas

  1. Incorrect-Init y ExpertRemove son iguales en términos de velocidad.
  2. Una ejecución en vacío es ~5 veces más rápida que una salida de OnInit.


En cuanto al segundo punto, está claro que hay algún tipo de error. Es más beneficioso en términos de tiempo realizar una ejecución en vacío, en lugar de salir de OnInit. Por favor, corríjalo porque las ventajas de Incorrect-Init y ExpertRemove se perderán casi por completo.

 

La pestaña de favoritos con EAs/indicadores/scripts y cuentas sólo se recuerda después de salir del terminal. Por ello, una salida anormal (apagado) reinicia esta pestaña. ¿Es posible guardarlo al cambiarlo?

A veces se entiende claramente que sería muy práctico que se pudieran añadir carpetas a los favoritos.

 
A100:
Entonces inténtalo así:

Resultado:

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

Gracias. Toda una solución.

Pero probablemente sea mejor que el compilador no diga palabrotas:

class B  { public:
                     B(void *b) {d=b;}
                    ~B() { delete d; }
   void             *d; };

¿Es un error o qué?
Cuando se crea una instancia de una clase mediante new , no se llama al destructor.

¿Es la única solución crear una clase especial para llamar al destructor? ¿O podemos prescindir de ella?

 
Andrey Barinov:

Crear con new y borrar con delete

La cuestión es poner delete en un destructor, pero al crear una instancia de una clase mediante new (A *a=newA ;) no se llama al destructor.

 
aleger:

¿Es posible, y si es así, cómo, derivar en cualquier indicador ZigZag los valores correspondientes de los extremos del precio Alto y Bajo,

asegurando su unión estable y su proximidad a las partes superiores e inferiores formadas?

Ver ejemplo deOBJ_TEXT

 

Gracias.
Eso es exactamente lo que dice aquí.

Все объекты, созданные выражением указатель_объекта=new Имя_Класса, обязательно должны быть впоследствии уничтожены оператором delete(указатель_объекта). 
Если по каким то причинам такая переменная по окончании работы программы не была уничтожена оператором delete, то об этом будет выведено сообщение в журнал "Эксперты". 
Можно объявить несколько переменных и всем им присвоить указатель одного объекта.
Если динамически создаваемый объект имеет конструктор, то этот конструктор будет вызван в момент выполнения оператора new. Если объект имеет деструктор, 
то деструктор будет вызван в момент выполнения оператора delete.

Así que no es un error, es una característica que resulta en un círculo vicioso.
Si quiero automatizar el proceso de borrado de un objeto dinámico, el destructor es llamado sólo en el momento del borrado, por lo que es inútil poner el borrado en el propio destructor.
Pero la automatización puede ser implementada a través de otra instancia de otra clase, como @A100 sugirióaquí.

 
aleger:

Gracias por el consejo. Ya estoy agotado de leer y probar y probar y leer. Me gustaría ver un ejemplo de funcionamiento del ZigZag...

¡Como en mi avatar con un zigzag, pero con un atado de extremos superiores DERECHO, porque el atado de extremos inferiores está bien!

La forma de vinculación con k=(WindowPriceMax()-WindowPriceMin())/30 no funciona cuando el tamaño de la ventana cambia mucho, me gustaría otra cosa...


En el ejemplo deOBJ_TEXT, tanto la parte superior como la inferior se unen. Siga el enlace, ejecute el ejemplo...

 
Nikolai Semko:

Así que no es un error, sino una característica, lo que resulta en un círculo vicioso.

Ya se le ha dicho antes que la forma de resolver el control de los recursos asignados no manejables es utilizar punteros inteligentes. La analogía completa con C++.
Quizás el problema es que la solución no se presentó en bandeja de plata, lo siento.


Todo el mundo puede escribir "shared_ptr" en la búsqueda del sitio y seguir el primer resultado, no es difícil, recomiendo encarecidamente probarlo.