Metatrader 5 - Bir çizelgeyi semboller arasında dolaşırken çok fazla bellek alır

 
Merhaba,

Semboller arasında geçiş yapmak için ayarlanmış bir Uzman Danışmanım var ve çok fazla hafıza çiğniyor.

Bunun, sembollerin yavaş yavaş yükselen Piyasa İzleme'ye girip çıktığı zaman olduğunu fark ettim. Bu nedenle, Market Watch'taki mevcut öğeler arasında dolaşan grafik değil, yeni semboller yüklendiğinde ve kaldırıldığında daha fazladır.

Aşağıdakileri yapmak için ayarlanmıştır:

  1. OnInit, zamanlayıcıyı her 3 saniyede bir ateşlenecek şekilde ayarlar
  2. OnTimer
    1. SymbolTotal() SymbolName() kullanarak listedeki sonraki sembolü alın
    2. Piyasa İzleme'ye yüklemek için SymbolSelect()'i ve mevcut grafiği bir sonraki sembole ayarlamak için ChartSetSymbolPeriod()'u kullanarak grafiği bir sonraki sembole ayarlar
    3. Market Watch'ta kullanılmayan sembolleri kaldırmak için SymbolSelect()'i kullanır

Mümkün olduğu kadar çok özel kodu kaldırdığımda ve mevcut semboller arasında bir çizelgede gezinmek için yukarıdaki adımları kullandığımda, makinemdeki bellek kullanımının artmaya devam ettiğini fark ettim.

CPU sabit kalıyor ve sabit bir hızda, ancak bellek hemen yukarı çıkıyor.

Sorular:

  1. Bu neden oluyor?
  2. Herhangi birinin hafıza çekimini durdurması gereken herhangi bir çözüm veya öneri var mı?
    (yani, mevcut grafiği ChartSetSymbolPeriod() ile kullanmak yerine ChartOpen() ile yeni bir grafik açın)
  3. Etrafta bir iş var mı?
    (yani bu sadece böyle mi çalışıyor)
  4. Başka öneriniz var mı?


Teşekkürler, minnettarım

 
Belki sonsuz bir döngü? Herhangi bir kod olmadan tahmin etmek zor.
 

Evet, sonsuz bir döngü ama fikir bu.

Tüm semboller arasında dolaşmaya devam etmek için.

Aşağıdaki kod her 3 saniyede bir tetiklenir.

İşte kod parçacığı (demo amaçlı olarak hepsi bir arada yöntem):

 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;
   
  }
 
semboller nerede başlatılır?
 

"Semboller" ile ne demek istediğinizden emin değilsiniz, ancak yukarıdaki kod ExecuteTimer() 3 saniyeye ayarlanmış yeni bir Uzman Danışmanda.

İşte kod (bu bir EA'dadır):

int OnInit()
{
//--- zamanlayıcı oluştur
EventSetTimer(3);

//---
dönüş(INIT_SUCCEEDED);
}

 
Merhaba,

Tam betiği ekledim, ekli dosyaya bakın "ForumQuestion1.mq5".

Hatayı yeniden oluşturma adımları:

  1. Metatrader 5 için ekli komut dosyasını Metaeditor'da açın (güvenlidir)
  2. Windows'ta Görev Yöneticisi'ni açın
    1. "Metatrader 5 İstemci Terminali"ni arayın ve bellek miktarını not edin
  3. Komut dosyasını çalıştırın ve Görev Yöneticisi'nde bellek sütununu izleyin

Komut dosyası semboller arasında dolaşırken bellek yavaş yavaş artar.

Dosyalar:
 
gr101 :
Merhaba,

Tam betiği ekledim, ekli dosyaya bakın "ForumQuestion1.mq5".

Hatayı yeniden oluşturma adımları:

  1. Metatrader 5 için ekli komut dosyasını Metaeditor'da açın (güvenlidir)
  2. Windows'ta Görev Yöneticisi'ni açın
    1. "Metatrader 5 İstemci Terminali"ni arayın ve bellek miktarını not edin
  3. Komut dosyasını çalıştırın ve Görev Yöneticisi'nde bellek sütununu izleyin

Komut dosyası semboller arasında dolaşırken bellek yavaş yavaş artar.

Kodunuzu denedim ve hafıza sorunu yaşamadım.

MT5 Yapı 1325.

 

Merhaba Alain,

Cevap için teşekkürler.

Aynı yapıdayım. Hafıza artışı yavaş. Birkaç dakika sürer. Temelde kademeli olarak artar.

Ekli "Memory boost.docx.png" dosyasına bakın, orada zamanla oluştuğunu gösteren bazı ekran görüntüleri var.

Aynı yapı "MT5 Build 1325" üzerindeyim

Makine bilgisi:

  • Windows 8.1 Kurumsal
  • 64 bit işletim sistemi
  • 16Gb RAM
  • i7 işlemci

teşekkürler

Dosyalar:
 
gr101 :

Merhaba Alain,

Cevap için teşekkürler.

Aynı yapıdayım. Hafıza artışı yavaş. Birkaç dakika sürer. Temelde kademeli olarak artar.

Ekli "Memory boost.docx.png" dosyasına bakın, orada zamanla oluştuğunu gösteren bazı ekran görüntüleri var.

Aynı yapı "MT5 Build 1325" üzerindeyim

Makine bilgisi:

  • Windows 8.1 Kurumsal
  • 64 bit işletim sistemi
  • 16Gb RAM
  • i7 işlemci

teşekkürler

Herhangi bir fark yaratırsa, Windows 10'dayım.

Komut dosyanız, önceki gönderimden birkaç dakika önce çalışıyor. Şu anda bellek kullanımı, başlattığımdan daha düşük (300 Mb'ye karşı 280 Mb).

EDIT: Az önce tekrar kontrol ettim ve şimdi 189 Mb !!! hala düşüyor :D

EDIT2: Metaquotes Demo-Server'da çalışıyor.

 

Geri dönüşünüz için teşekkür ederiz.

Sanırım Windows 10'a yükselteceğim ve bunun bir fark yaratıp yaratmadığına bakacağım.

 

Windows Server 12 R2'ye koydum ve bu da belleği yukarı itiyor.

Bunu bir süre izleyeyim ve bu konu hakkında geri bildirimde bulunayım.