Características del lenguaje mql5, sutilezas y técnicas - página 132

 
Igor Makanu:

envolver en clase el cálculo del indicador - vincular los topes a los campos de la clase

Por desgracia...
No funcionó. Aunque el búfer esté dentro de la clase y el manejador, todos los búferes de cálculo intermedios internos creados permanecen en la RAM incluso después de que se elimine la instancia de la clase.

La memoria se borra sólo al cambiar el TF.

Evidentemente, falta el comando de limpieza de memoria por asa. Por ejemplo MemErase( int handle);

 
Nikolai Semko:

Por desgracia...
No funcionó. Aunque el búfer esté dentro de la clase y el manejador, todos los búferes de cálculo intermedios internos creados permanecen en la RAM incluso después de que se elimine la instancia de la clase.

La memoria se borra sólo al cambiar el TF.

Lo que evidentemente falta es un comando destinado a limpiar la memoria por la manija. Por ejemplo MemErase( int handle);

1. ¿has comprobado las combinaciones de un puntero de objeto y una instancia de objeto (me refiero a *)?

2. ¿escribiste el destructor y borraste el tamaño del array en él? (ArrayFree() y ArrayResize(arr,0,0) )

 
Nikolai Semko:

Por desgracia...
No funcionó. Aunque el búfer esté dentro de la clase y el manejador, todos los búferes de cálculo intermedios internos creados permanecen en la RAM incluso después de que se elimine la instancia de la clase.

La memoria se borra sólo al cambiar el TF.

Lo que evidentemente falta es un comando destinado a limpiar la memoria por la manija. Por ejemplo MemErase( int handle);

¿Y no has utilizado el IndicatorRelease?

Pero sigo pensando que es una empresa vacía. ¿Para qué lo necesitas? ¿Para dibujar animaciones? ¿Y para el comercio? ¿Promediar la media móvil hasta alcanzar una línea recta?

 
Nikolai Semko:

Por desgracia...
No funcionó. Incluso si el buffer está dentro de la clase y el handle, todos los buffers intermedios creados internamente permanecen en la RAM incluso después de que la instancia de la clase sea eliminada.

La memoria se borra sólo al cambiar el TF.

Evidentemente, falta el comando de borrado de memoria por asa. Por ejemplo MemErase( int handle);

El terminal almacena las cachés durante algún tiempo, aunque el programa no las utilice.

Se puede captar el tiempo de liberación de la memoria.

 
Alexey Viktorov:

¿Has utilizado IndicatorRelease?

Pero aun así, creo que es una pérdida de tiempo. Dime, ¿para qué lo necesitas? ¿Para dibujar caricaturas? ¿Y para el comercio? ¿Promediar la media móvil hasta alcanzar una línea recta?

Sí, gracias, Alexey. Me había olvidado de esta función. Lo he visto antes, pero nunca lo he usado.

Lo he probado. Algo va mal. Lo borra, pero después de borrarlo, todo se detiene.

Simplemente añadí una línea de código a la función DrawSetup() antes del cálculo del indicador con los siguientes parámetros.

IndicatorRelease(handle);
handle=iMA(_Symbol,_Period,per1,0,MaMethod,PriceBase);
for(int i=0;i<N;i++) handle=iMA(_Symbol,_Period,per2,0,MaMethod,handle);

El indicador simplemente deja de funcionar y todavía no puedo entender la razón.

Alexey Viktorov:

Creo que es una idea inútil. ¿Para qué lo necesito? ¿Para dibujar caricaturas? ¿Y para el comercio? ¿Promediar la media móvil hasta alcanzar una línea recta?

Estoy absolutamente de acuerdo con usted. Es un juguete inútil.

 
Andrey Khatimlianskii:

El terminal conserva las cachés durante un tiempo, aunque el programa no las utilice.

Puedes cronometrar el tiempo que tarda la memoria en liberarse.

Esperé 6 minutos y todavía no se aclaró nada.

 
Igor Makanu:

1. ¿comprobó las combinaciones de puntero de objeto e instancia de objeto (me refiero a *)?

2. ¿escribiste el destructor y borraste el tamaño del array en él? (ArrayFree() y ArrayResize(arr,0,0) )

1. Sí, lo hice a través de un puntero, nuevo y borrado.

2. Así que no hay ninguna matriz. Es decir, hay matrices internas pero no tienen nombres. Sólo existe el número de la manilla.

Y en cada iteración del bucle for, el valor de la variable handle aumenta en uno. Es decir, los buffers interiores se multiplican y todos los anteriores participan en el cálculo del siguiente.

Según la lógica, deberíamos hacer IndicatorRelease(handle); antes de otro cálculo completamente nuevo del indicador, pero ya escribí arriba que eso matará al indicador. No está claro por qué.

 
Nikolai Semko:

Sí, gracias, Alexey. Me había olvidado de esa función. Lo he visto antes, pero nunca lo he usado.

Lo he probado. Algo va mal. Lo borra, pero después de borrarlo, todo se detiene.

Simplemente añadí una línea de código a la función DrawSetup() antes del cálculo del indicador con los siguientes parámetros.

El indicador simplemente deja de funcionar y todavía no puedo entender la razón.

Estoy absolutamente de acuerdo con usted. Es sólo un juguete inútil.

Eso no es lo que estaba pensando. Creo que deberíamos hacer un par de manejadores, como un enumerador de gráficos

currChart=ChartNext(prevChart); // на основании предыдущего получим новый график

Y una vez que obtenga un nuevo mango, el mango usado se puede tirar como el usado ...

 
Alexey Viktorov:

Eso no es lo que estaba pensando. Creo que hay que hacer un par de puñados, como una búsqueda gráfica

Y una vez que tenga un nuevo mango, el usado puede ser desechado como el usado ...

que no funcionará.

 
Nikolai Semko:

De ninguna manera

¿Por qué no?
Razón de la queja: