Metatrader 5 - занимает много памяти при циклическом переходе по символам на графике

 
Привет,

У меня есть советник, который настроен на циклический перебор символов, и он жрет много памяти.

Я заметил, что это происходит, когда символы загружаются в Обзор рынка и удаляются из него, что медленно увеличивается. Так что это не график циклически перебирает существующие элементы в Обзоре рынка, а больше, когда новые символы загружаются и удаляются.

Он настроен на выполнение следующих действий:

  1. OnInit устанавливает таймер на срабатывание каждые 3 секунды
  2. OnTimer
    1. Получение следующего символа в списке с помощью SymbolTotal() SymbolName()
    2. Устанавливает график на следующий символ, используя SymbolSelect() для загрузки в Market Watch и ChartSetSymbolPeriod() для установки текущего графика на следующий символ.
    3. Использует SymbolSelect() для удаления всех неиспользуемых символов в Market Watch.

Когда я удаляю как можно больше пользовательского кода и просто использую описанные выше шаги для циклического просмотра графика через доступные символы, я замечаю, что использование памяти на моей машине продолжает расти.

Процессор остается на стабильном уровне, но память растет.

Вопросы:

  1. Почему это происходит?
  2. Есть ли какие-нибудь обходные пути или предложения, чтобы остановить увеличение памяти?
    (например, открыть новый график с помощью ChartOpen() вместо того, чтобы использовать существующий график с помощью ChartSetSymbolPeriod()).
  3. Есть ли обходной путь?
    (т.е. это просто так работает).
  4. Есть еще какие-нибудь предложения?


Большое спасибо

 
Может быть, бесконечный цикл? Трудно предположить без кода.
 

Да, это бесконечный цикл, но в этом и заключается идея.

Чтобы постоянно перебирать все символы.

Код ниже срабатывает каждые 3 секунды.

Вот фрагмент кода (все в одном методе для демонстрации):

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;
   
  }
 
где зарождаются символы?
 

Не уверен, что вы подразумеваете под "символами", но код выше находится в новом эксперте с ExecuteTimer(), установленным на 3 секунды.

Вот код (это в советнике):

int OnInit()
{
//--- создаем таймер
EventSetTimer(3);

//---
return(INIT_SUCCEEDED);
}

 
Привет,

Я добавил полный текст скрипта в прикрепленный файл "ForumQuestion1.mq5".

Шаги для воссоздания ошибки:

  1. Откройте прилагаемый скрипт в Metaeditor (это безопасно) для Metatrader 5
  2. Откройте диспетчер задач в Windows
    1. Найдите "Клиентский терминал Metatrader 5" и обратите внимание на количество памяти
  3. Запустите скрипт и следите за колонкой памяти в диспетчере задач.

Память медленно увеличивается по мере того, как скрипт перебирает символы.

Файлы:
 
gr101:
Здравствуйте,

Я добавил полный текст скрипта в прикрепленный файл "ForumQuestion1.mq5".

Шаги для воссоздания ошибки:

  1. Откройте прилагаемый скрипт в Metaeditor (это безопасно) для Metatrader 5
  2. Откройте диспетчер задач в Windows
    1. Найдите "Клиентский терминал Metatrader 5" и обратите внимание на количество памяти
  3. Запустите скрипт и посмотрите столбец памяти в диспетчере задач.

Память медленно увеличивается по мере того, как скрипт перебирает символы.

Я попробовал ваш код и не испытываю проблем с памятью.

MT5 Build 1325.

 

Привет Ален,

Спасибо за ответ.

У меня такая же сборка. Увеличение памяти происходит медленно. Это занимает несколько минут. В основном она увеличивается постепенно.

См. прикрепленный файл "Memory increase.docx.png", там есть несколько скриншотов, показывающих увеличение памяти со временем.

Я нахожусь на той же сборке "MT5 Build 1325".

Информация о машине:

  • Windows 8.1 Enterprise
  • 64-битная ОС
  • 16Gb RAM
  • процессор i7

Спасибо

Файлы:
 
gr101:

Привет, Ален,

Спасибо за ответ.

У меня такая же сборка. Увеличение памяти происходит медленно. Это занимает несколько минут. В основном она увеличивается постепенно.

См. прикрепленный файл "Memory increase.docx.png", там есть несколько скриншотов, показывающих увеличение памяти со временем.

Я на той же сборке "MT5 Build 1325".

Информация о машине:

  • Windows 8.1 Enterprise
  • 64-разрядная ОС
  • 16 Гб ОЗУ
  • процессор i7

Спасибо

Я на Windows 10, если это имеет значение.

Ваш скрипт запущен за несколько минут до моего предыдущего сообщения. В настоящее время использование памяти ниже, чем когда я его запускал (280 Мб против 300 Мб).

EDIT: Я только что проверил еще раз и сейчас 189 Мб!!! все еще уменьшается :D

EDIT2: Работает на демо-сервере Metaquotes.

 

Спасибо за обратную связь.

Думаю, я обновлю Windows 10 и посмотрю, изменит ли это ситуацию.

 

Я установил его на Windows Server 12 R2, и это также увеличило объем памяти.

Позвольте мне понаблюдать за этим некоторое время и оставить отзыв в этой теме.