Caractéristiques du langage mql5, subtilités et techniques - page 132

 
Igor Makanu:

envelopper dans la classe le calcul de l'indicateur - lier les tampons aux champs de la classe

Hélas...
Ça n'a pas marché. Même si le tampon se trouve à l'intérieur de la classe et du handle, tous les tampons de calcul intermédiaires internes créés restent en RAM même après la suppression de l'instance de la classe.

La mémoire est effacée uniquement en changeant le TF.

La commande de nettoyage de la mémoire par poignée est évidemment absente. Par exemple MemErase( int handle) ;

 
Nikolai Semko:

Hélas...
Ça n'a pas marché. Même si le tampon se trouve à l'intérieur de la classe et du handle, tous les tampons de calcul intermédiaires internes créés restent en RAM même après la suppression de l'instance de la classe.

La mémoire est effacée uniquement en changeant le TF.

Ce qui manque manifestement, c'est une commande destinée à vider la mémoire par poignée. Par exemple MemErase( int handle) ;

1. Avez-vous vérifié les combinaisons d'un pointeur d'objet et d'une instance d'objet (je veux dire *) ?

2. Avez-vous écrit le destructeur et supprimé la taille du tableau dans celui-ci ? (ArrayFree() et ArrayResize(arr,0,0) )

 
Nikolai Semko:

Hélas...
Ça n'a pas marché. Même si le tampon se trouve à l'intérieur de la classe et du handle, tous les tampons de calcul intermédiaires internes créés restent en RAM même après la suppression de l'instance de la classe.

La mémoire est effacée uniquement en changeant le TF.

Ce qui manque manifestement, c'est une commande destinée à vider la mémoire par poignée. Par exemple MemErase( int handle) ;

Et vous n'avez pas utilisé IndicatorRelease ?

Mais je pense quand même que c'est une entreprise vide. Pourquoi en avez-vous besoin ? Pour dessiner des animations ? Et pour le commerce ? Pour faire la moyenne de la moyenne mobile jusqu'à ce qu'elle atteigne une ligne droite ?

 
Nikolai Semko:

Hélas...
Ça n'a pas marché. Même si le tampon se trouve à l'intérieur de la classe et du handle, tous les tampons intermédiaires créés en interne restent dans la RAM, même après la suppression de l'instance de la classe.

La mémoire est effacée uniquement en changeant le TF.

La commande d'effacement de la mémoire par poignée est évidemment absente. Par exemple MemErase( int handle) ;

Le terminal conserve les caches pendant un certain temps, même si le programme ne les utilise pas.

Vous pouvez contrôler combien de temps la mémoire est libérée.

 
Alexey Viktorov:

Avez-vous utilisé IndicatorRelease ?

Mais quand même, je pense que c'est une perte de temps. Dites-moi, pourquoi en avez-vous besoin ? Pour faire des dessins animés ? Et pour le commerce ? Pour faire la moyenne de la moyenne mobile jusqu'à ce qu'elle atteigne une ligne droite ?

Oui, merci, Alexey. J'avais oublié cette fonction. Je l'ai déjà vu, mais je ne l'ai jamais utilisé.

J'ai essayé. Quelque chose ne va pas. Il le supprime, mais après l'avoir supprimé, tout s'arrête.

J'ai simplement ajouté une ligne de code à la fonction DrawSetup() avant le calcul de l'indicateur avec les paramètres suivants.

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);

L'indicateur cesse tout simplement de fonctionner et je n'arrive pas encore à en comprendre la raison.

Alexey Viktorov:

Je pense que c'est une idée futile. Pourquoi en ai-je besoin ? Pour faire des dessins animés ? Et pour le commerce ? Pour faire la moyenne de la moyenne mobile jusqu'à ce qu'elle atteigne une ligne droite ?

Je suis tout à fait d'accord avec vous. C'est juste un jouet inutile.

 
Andrey Khatimlianskii:

Le terminal conserve les caches pendant un certain temps, même si le programme ne les utilise pas.

Vous pouvez mesurer le temps nécessaire pour que la mémoire se libère.

J'ai attendu 6 minutes et toujours rien n'a été effacé.

 
Igor Makanu:

1. Avez-vous vérifié les combinaisons de pointeur d'objet et d'instance d'objet (je veux dire *) ?

2. Avez-vous écrit le destructeur et supprimé la taille du tableau dans celui-ci ? (ArrayFree() et ArrayResize(arr,0,0) )

1. Oui, je l'ai fait par le biais d'un pointeur, nouveau et supprimer.

2. il n'y a donc pas de tableau. C'est-à-dire qu'il y a des tableaux internes mais ils n'ont pas de noms. Il n'y a que le numéro de manche.

Et à chaque itération de la boucle for, la valeur de la variable handle augmente de un. En d'autres termes, les tampons internes sont multipliés et tous les tampons précédents participent au calcul du suivant.

Selon la logique, nous devrions faire IndicatorRelease(handle) ; avant un autre calcul complètement nouveau de l'indicateur, mais j'ai déjà écrit ci-dessus que cela va tuer l'indicateur. La raison n'est pas claire.

 
Nikolai Semko:

Oui, merci, Alexey. J'avais oublié cette fonction. Je l'ai déjà vu, mais je ne l'ai jamais utilisé.

Je l'ai essayé. Il y a quelque chose qui ne va pas. Il le supprime, mais après l'avoir supprimé, tout s'arrête.

J'ai simplement ajouté une ligne de code à la fonction DrawSetup() avant le calcul de l'indicateur avec les paramètres suivants.

L'indicateur cesse tout simplement de fonctionner et je ne comprends pas encore la raison.

Je suis tout à fait d'accord avec vous. C'est juste un jouet inutile.

Ce n'est pas ce que je pensais. Je pense que nous devrions faire un couple de gestionnaires, comme un énumérateur de graphiques.

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

Et une fois que vous avez une nouvelle poignée, la poignée usagée peut être jetée comme une poignée usagée...

 
Alexey Viktorov:

Ce n'est pas ce que je pensais. Je pense qu'il faut faire une ou deux poignées, comme une recherche graphique.

Et une fois que vous avez une nouvelle poignée, la poignée usagée peut être jetée comme la poignée usagée ...

qui ne fonctionnera pas.

 
Nikolai Semko:

Pas du tout.

Pourquoi pas ?