Потребление памяти терминалом - страница 2

 
Не все так просто и однозначно считается.

Пустой терминал не означает отсутствия поднятых баз данных чартов(приходят тики и минутная база апдейтится). Удаление индикаторов освобождает ресурсы, но нужно принимать во внимание работу преаллоцируемых кешей и пулов памяти. Они не позволяют однозначно говорить "это стоит столько ресурсов".

В сложной системе, оптимизированной для максимальной производительности обычно используется правило "скорость в обмен на память". Так и в МТ5.
 

У меня вот этот тестовый скрипт съел всю мою свободную память ~5GB.

Для этого запускал его последовательно 7-8 раз.

Подождал обещанную минуту и ничего. Память не освободилась.

Видимо я чего-то не знаю, но такие объемы лучше высвобождать сразу, а то ПК виснет.

Код: 

//+------------------------------------------------------------------+
//|                                                       GetMem.mq5 |
//|                                                        avoitenko |
//|                        https://www.mql5.com/en/users/avoitenko |
//+------------------------------------------------------------------+
#property copyright "avoitenko"
#property link      "https://www.mql5.com/en/users/avoitenko"
#property version   "1.00"
#include <Canvas\Canvas.mqh>
#define COUNT 100
CCanvas canvas[];
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   if(ArrayResize(canvas,COUNT)!=COUNT)return;
   for(int i=0;i<COUNT;i++)
     {
      if(canvas[i].CreateBitmap("my_bmp_"+IntegerToString(i),0,0,1000,1000,COLOR_FORMAT_XRGB_NOALPHA))
         canvas[i].Destroy();
     }
  }
//+------------------------------------------------------------------+
 
С этим примером разберемся обязательно.
 

Вопрос немного не по теме... а что так тормозит iCustom? Вызываю её, правда, несколько десятков раз. Отчего загрузка пользовательского индикатора идёт очень долго...

Сделал профилирование кода, так на эти функции ушло под 97% времени...

 
denkir: Вопрос немного не по теме... а что так тормозит iCustom? Вызываю её, правда, несколько десятков раз. Отчего загрузка пользовательского индикатора идёт очень долго...
 В OnInit() вызываете?
 
Yedelkin:
 В OnInit() вызываете?
Ага.
 
Renat:
Не все так просто и однозначно считается.

Я, собственно, поэтому и не оформлял ни каких претензий, просто поделился наблюдениями.

Свою проблему решил, оптимизировав вызов индикаторов, и отказавшись от ай-кастумов.

Способы вызова индикаторов в MQL5
Способы вызова индикаторов в MQL5
  • 2010.03.09
  • KlimMalgin
  • www.mql5.com
C появлением новой версии языка MQL, не только изменился подход к работе с индикаторами, но и появились новые способы создания индикаторов. Кроме того, появилась дополнительная гибкость при работе с индикаторными буферами - теперь вы можете самостоятельно указать нужное направление индексации и получать ровно столько значений индикатора, сколько вам требуется. В этой статье рассмотрены базовые методы вызова индикаторов и получения данных из индикаторных буферов.
 
denkir: Ага.
Ну, если в OnInit(), то, полагаю, вполне нормально. На форуме несколько раз поднималась тема про загрузку пользовательских индикаторов, в которой объяснялось, что при загрузке индикатора "поднимается", образно говоря, куча всяких пластов - данные/потоки и пр. Для такой загрузки требуется и время, и ресурсы. В связи с чем советовалось запускать в OnInit().
 
Yedelkin:
Ну, если в OnInit(), то, полагаю, вполне нормально. На форуме несколько раз поднималась тема про загрузку пользовательских индикаторов, в которой объяснялось, что при загрузке индикатора "поднимается", образно говоря, куча всяких пластов - данные/потоки и пр. Для такой загрузки требуется и время, и ресурсы...

Да, не обращал особого внимания, пока сам не столкнулся с этой проблемой. Про пласты, согласен.

...В связи с чем советовалось запускать в OnInit().

Тут не понял логику Вашего рассуждения.
 
denkir: Тут не понял логику Вашего рассуждения.
Да логика-то не моя :) Всего лишь пробую изложить. Заключается она в том, что если для загрузки индикатора требуется и время, и ресурсы (с чем никто не и спорит), то желательно сделать это однократно при запуске программы, которая вызывает эти самые индикаторы. Т.е. в OnInit().  Образно говоря, "потерпеть пять минут при запуске основной программы, а потом спокойно пользоваться". В качестве контрпримера рассматривался реальный  случай, когда пользователь запускал индикаторы с помощью  iCustom чуть ли не на каждом тике.