Metatrader 5 - Richiede molta memoria quando si scorre un grafico attraverso i simboli

 
Ciao,

Ho un Expert Advisor che è stato impostato per ciclare attraverso i simboli e mastica molta memoria.

Ho notato che è quando i simboli vengono caricati dentro e fuori dal Market Watch che la memoria aumenta lentamente, quindi non è il grafico che cicla attraverso gli elementi esistenti nel Market Watch, ma più quando vengono caricati e rimossi nuovi simboli.

È impostato per fare quanto segue:

  1. OnInit imposta il timer per sparare ogni 3 secondi
  2. OnTimer
    1. Ottieni il prossimo simbolo nella lista usando SymbolTotal() SymbolName()
    2. Imposta il grafico sul prossimo simbolo usando SymbolSelect() per caricarlo nel Market Watch e ChartSetSymbolPeriod() per impostare il grafico corrente sul prossimo simbolo
    3. Utilizza SymbolSelect() per rimuovere qualsiasi simbolo inutilizzato nel Market Watch

Quando rimuovo tutto il codice personalizzato possibile e uso solo i passi di cui sopra per ciclare un grafico attraverso i simboli disponibili, noto che l'utilizzo della memoria sulla mia macchina continua ad aumentare.

La CPU rimane e un tasso costante ma la memoria schizza verso l'alto.

Domande:

  1. Perché succede questo?
  2. C'è qualche soluzione o suggerimento che qualcuno ha per evitare che la memoria salga?
    (per esempio aprire un nuovo grafico con ChartOpen() invece di usare il grafico esistente con ChartSetSymbolPeriod())
  3. C'è un work around?
    (cioè questo è solo il modo in cui funziona)
  4. Qualche altro suggerimento?


Grazie mille

 
Forse un ciclo infinito? Difficile da indovinare senza codice.
 

Sì, è un ciclo senza fine, ma questa è l'idea.

Per continuare a scorrere tutti i simboli.

Il codice qui sotto spara ogni 3 secondi.

Ecco un frammento di codice (è tutto in un metodo per scopi dimostrativi):

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;
   
  }
 
dove sono iniziati i simboli?
 

Non sono sicuro di cosa intendi per "simboli" ma il codice qui sopra è in un nuovo Expert Advisor con ExecuteTimer() impostato a 3 secondi.

Ecco il codice (questo è in un EA):

int OnInit()
{
//--- crea il timer
EventSetTimer(3);

//---
return(INIT_SUCCEED);
}

 
Ciao,

Ho aggiunto lo script completo nel file allegato "ForumQuestion1.mq5".

Passi per ricreare l'errore:

  1. Aprire lo script allegato in Metaeditor (è sicuro) per Metatrader 5
  2. Aprire Task Manager in Windows
    1. Cercare "Metatrader 5 Client Terminal" e notare la quantità di memoria
  3. Eseguire lo script e guardare la colonna della memoria in Task Manager

La memoria aumenta lentamente man mano che lo script scorre i simboli.

File:
 
gr101:
Ciao,

Ho aggiunto lo script completo nel file allegato "ForumQuestion1.mq5".

Passi per ricreare l'errore:

  1. Aprire lo script allegato in Metaeditor (è sicuro) per Metatrader 5
  2. Aprire Task Manager in Windows
    1. Cercare "Metatrader 5 Client Terminal" e notare la quantità di memoria
  3. Esegui lo script e guarda la colonna della memoria in Task Manager

La memoria aumenta lentamente man mano che lo script passa attraverso i simboli.

Ho provato il tuo codice e non ho problemi di memoria.

MT5 Build 1325.

 

Ciao Alain,

Grazie per la risposta.

Sono sulla stessa build. L'aumento della memoria è lento. Ci vuole qualche minuto. Fondamentalmente aumenta gradualmente.

Vedi il file allegato "Memory increase.docx.png", ho alcuni screenshot che mostrano l'aumento nel tempo.

Sono sulla stessa build "MT5 Build 1325"

Informazioni sulla macchina:

  • Windows 8.1 Enterprise
  • 64bit OS
  • 16Gb RAM
  • processore i7

Grazie

File:
 
gr101:

Ciao Alain,

grazie per la risposta.

Sono sulla stessa build. L'aumento della memoria è lento. Ci vogliono alcuni minuti. Fondamentalmente aumenta gradualmente.

Vedi il file allegato "Memory increase.docx.png", ho alcuni screenshot che mostrano l'aumento nel tempo.

Sono sulla stessa build "MT5 Build 1325".

Informazioni sulla macchina:

  • Windows 8.1 Enterprise
  • 64bit OS
  • 16Gb RAM
  • processore i7

Grazie

Sono su Windows 10 se questo fa qualche differenza.

Il tuo script è in esecuzione da alcuni minuti prima del mio post precedente. Attualmente l'utilizzo della memoria è inferiore a quando l'ho avviato (280 Mb contro 300 Mb).

EDIT: Ho appena controllato di nuovo ed è ora 189 Mb!!! ancora in diminuzione :D

EDIT2: In esecuzione su Metaquotes Demo-Server.

 

Grazie per il feedback.

Penso che aggiornerò a Windows 10 e vedrò se questo fa la differenza.

 

L'ho messo su Windows Server 12 R2 e anche questo spinge la memoria in alto.

Lasciatemi monitorare questo per un po' e dare un feedback su questo thread.