Metatrader 5 - Consomme beaucoup de mémoire lorsqu'on fait défiler les symboles d'un graphique.

 
Bonjour,

J'ai un conseiller expert qui a été configuré pour faire défiler les symboles et cela consomme beaucoup de mémoire.

J'ai remarqué que c'est lorsque les symboles sont chargés dans et hors du Market Watch que la mémoire augmente lentement, ce n'est donc pas le graphique qui passe en revue les éléments existants dans le Market Watch mais plutôt lorsque de nouveaux symboles sont chargés et supprimés.

Il est configuré pour faire ce qui suit :

  1. OnInit règle le minuteur pour qu'il se déclenche toutes les 3 secondes.
  2. OnTimer
    1. Obtenir le symbole suivant dans la liste en utilisant SymbolTotal() SymbolName()
    2. Définit le graphique sur le symbole suivant en utilisant SymbolSelect() pour le charger dans le Market Watch et ChartSetSymbolPeriod() pour définir le graphique actuel sur le symbole suivant.
    3. Utilise SymbolSelect() pour supprimer tous les symboles inutilisés dans la surveillance du marché.

Lorsque je supprime autant de code personnalisé que possible et que j'utilise simplement les étapes ci-dessus pour faire défiler un graphique à travers les symboles disponibles, je remarque que l'utilisation de la mémoire sur ma machine continue d'augmenter.

Le CPU reste à un taux stable mais la mémoire monte en flèche.

Questions :

  1. Pourquoi cela se produit-il ?
  2. Y a-t-il des solutions de contournement ou des suggestions pour empêcher la mémoire de s'emballer ?
    (par exemple, ouvrir un nouveau graphique avec ChartOpen() plutôt que d'utiliser le graphique existant avec ChartSetSymbolPeriod())
  3. Existe-t-il une solution de contournement ?
    (c.-à-d. est-ce que c'est comme ça que ça fonctionne)
  4. D'autres suggestions ?


Merci beaucoup.

 
Peut-être une boucle sans fin ? Difficile à deviner sans code.
 

Oui, c'est une boucle sans fin, mais c'est l'idée.

Pour continuer à faire défiler tous les symboles.

Le code ci-dessous se déclenche toutes les 3 secondes.

Voici un extrait de code (tout est dans une seule méthode pour les besoins de la démonstration) :

void OnTimer()
  {
      // Find next symbol
      long symbolsTotal = SymbolsTotal(false);
      long count = GlobalVariableGet("testmem");
      if(count >= symbolsTotal)
      {
         count = 0;         
      }                  
      string newSymbol = SymbolName(count, false);
      SymbolSelect(newSymbol, true);
      count++;
      GlobalVariableSet("testmem", count);
      
      // Change chart symbol
      ChartSetSymbolPeriod(0, newSymbol, Period());         
      
      // Remove other symbols from Market Watch
      CArrayString *symbols = new CArrayString();
      for(int i = 0; i < SymbolsTotal(true); i++)
      {
         string symbol = SymbolName(i, true); // Get name from local market watch
         symbols.Add(symbol);
      }           
            
      int total = symbols.Total();
      for(int i = 0; i < total; i++)
      {
         string symbolToRemove = symbols.At(i);
         
         // Is the symbol not the current chart or about to  
         // be added?
         if(newSymbol != symbolToRemove)
         {            
            // Remove from Market Watch
            SymbolSelect(symbolToRemove, false);   
         }         
      }
      
      delete symbols;
   
  }
 
où les symboles sont initiés ?
 

Je ne suis pas sûr de ce que vous entendez par "symboles" mais le code ci-dessus est dans un nouvel Expert Advisor avec la fonction ExecuteTimer() réglée sur 3 secondes.

Voici le code (dans un EA) :

int OnInit()
{
//--- crée le timer
EventSetTimer(3) ;

//---
return(INIT_SUCCEEDED) ;
}

 
Bonjour,

J'ai ajouté le script complet, voir le fichier joint "ForumQuestion1.mq5".

Étapes pour recréer l'erreur :

  1. Ouvrez le script ci-joint dans Metaeditor (c'est sûr) pour Metatrader 5
  2. Ouvrez le Gestionnaire des tâches dans Windows
    1. Recherchez "Metatrader 5 Client Terminal" et notez la quantité de mémoire.
  3. Exécutez le script et observez la colonne de mémoire dans le gestionnaire de tâches.

La mémoire augmente lentement au fur et à mesure que le script parcourt les symboles.

Dossiers :
 
gr101:
Bonjour,

J'ai ajouté le script complet, voir le fichier joint "ForumQuestion1.mq5".

Étapes pour recréer l'erreur :

  1. Ouvrez le script ci-joint dans Metaeditor (c'est sûr) pour Metatrader 5
  2. Ouvrez le Gestionnaire des tâches dans Windows
    1. Recherchez "Metatrader 5 Client Terminal" et notez la quantité de mémoire.
  3. Exécutez le script et observez la colonne de mémoire dans le gestionnaire de tâches.

La mémoire augmente lentement au fur et à mesure que le script parcourt les symboles.

J'ai essayé votre code et je n'ai pas de problème de mémoire.

MT5 Build 1325.

 

Bonjour Alain,

Merci pour la réponse.

Je suis sur le même build. L'augmentation de la mémoire est lente. Cela prend quelques minutes. En fait, elle augmente progressivement.

Voir le fichier joint "Memory increase.docx.png", j'ai quelques captures d'écran qui montrent l'augmentation de la mémoire au fil du temps.

Je suis sur la même version "MT5 Build 1325".

Informations sur la machine :

  • Windows 8.1 Enterprise
  • OS 64bit
  • 16 Go de RAM
  • processeur i7

Merci

Dossiers :
 
gr101:

Bonjour Alain,

Merci pour la réponse.

Je suis sur le même build. L'augmentation de la mémoire est lente. Cela prend quelques minutes. En fait, elle augmente progressivement.

Voir le fichier joint "Memory increase.docx.png", j'ai quelques captures d'écran qui montrent l'augmentation de la mémoire au fil du temps.

Je suis sur la même version "MT5 Build 1325".

Informations sur la machine :

  • Windows 8.1 Enterprise
  • OS 64bit
  • 16 Go de RAM
  • processeur i7

Merci

Je suis sous Windows 10 si cela fait une différence.

Votre script est en cours d'exécution depuis quelques minutes avant mon précédent post. Actuellement l'utilisation de la mémoire est plus faible que lorsque je l'ai lancé (280 Mo contre 300 Mo).

EDIT : Je viens de vérifier à nouveau et c'est maintenant 189 Mb ! !! toujours en baisse :D

EDIT2 : Fonctionne sur le serveur de démonstration de Metaquotes.

 

Merci pour les commentaires.

Je pense que je vais passer à Windows 10 et voir si cela fait une différence.

 

Je l'ai mis sur Windows Server 12 R2 et cela augmente également la mémoire.

Je vais surveiller cela pendant un certain temps et donner un retour d'information sur ce fil.