Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1473

 

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

В общем то получилось, буковки теперь читабельны.

Вот только из за моего не знания ООП, мой коммент как то не очень хорошо влияет на работу компа,

Через какое то время после запуска советника с комментом на нескольких графиках, происходит что то не хорошее, вплоть до потухания экрана и перезагрузки сервака)))

В логах терминала куча вот таких записей.

MQL5  VirtualAlloc failed in large allocator, size=101104
MemoryException 101142 bytes not available, 0 heapmin result

Подскажите знающие как сделать, чтоб не утекала память.

Подключаемый файл коммента выглядит так:

#include <Canvas\Canvas.mqh>
void Comm(string txt, color clr = clrYellow, int FontSize = 20, string Font = "Consolas", int flag = FW_BOLD)
  {
   CCanvas canvas;

   int shift = 0;
   if(ChartGetInteger(0, CHART_SHOW_ONE_CLICK))
      shift = 60;
   canvas.Erase(0x00FFFFFF);
   canvas.FontNameSet(Font);
   canvas.FontFlagsSet(flag);
   canvas.FontSizeSet(FontSize);

   int width = 0, height = 0;
   string result[];
   int size = StringSplit(txt, StringGetCharacter("\n", 0), result);
   height = (int)(FontSize * 1.8 * size);

   for(int i = 0; i < size; i++)
     {
      int w = canvas.TextWidth(result[i]);
      if(width < w)
         width = w;
     }

   canvas.CreateBitmapLabel(0, 0, "Comment", 5, 20 + shift, width, height, COLOR_FORMAT_ARGB_NORMALIZE);
   for(int i = 0; i < size; i++)
      canvas.TextOut(0, (int)(FontSize * 0.8 * i), result[i], ColorToARGB(clr, 255));

   canvas.Update(true);
  }

Пример использования такой:

#include <Comm.mqh>
//+------------------------------------------------------------------+
void OnTick()
  {
   MqlTick tick;
   SymbolInfoTick(_Symbol, tick);
   if(tick.ask != 0 && tick.bid != 0)
      Comm(StringFormat("ask = %.5f\nbid = %.5f\ntime = %s", tick.ask, tick.bid, TimeToString(tick.time, TIME_DATE | TIME_SECONDS)));
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectDelete(0, "Comment");
   ChartRedraw();
  }
//+------------------------------------------------------------------+


Понятно, что что то делаю не правильно с классом CCanvas, а вот что именно неправильно, я не понимаю.

Файлы:
Comm.mq5  2 kb
Comm.mqh  2 kb
 
Aleksandr Slavskii #:

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

В общем то получилось, буковки теперь читабельны.

Вот только из за моего не знания ООП, мой коммент как то не очень хорошо влияет на работу компа,

Через какое то время после запуска советника с комментом на нескольких графиках, происходит что то не хорошее, вплоть до потухания экрана и перезагрузки сервака)))

В логах терминала куча вот таких записей.

Подскажите знающие как сделать, чтоб не утекала память.

Подключаемый файл коммента выглядит так:

Пример использования такой:


Понятно, что что то делаю не правильно с классом CCanvas, а вот что именно неправильно, я не понимаю.

Если вас интересует код без библиотеки  CCanvas, но с объектом  OBJ_BITMAP_LABEL посмотрите мой код… 

ClosingLots
ClosingLots
  • www.mql5.com
Индикатор информер.
 
Alexey Viktorov #:

Если вас интересует код без библиотеки  CCanvas, но с объектом  OBJ_BITMAP_LABEL посмотрите мой код… 

Спасибо, красивое решение, мне понравилось.


Но, "у самурая нет цели, только путь",  мне само решение как сделать коммент менее важно, чем узнать в чём моя ошибка при использовании класса.

 
Aleksandr Slavskii #:

Спасибо, красивое решение, мне понравилось.


Но, "у самурая нет цели, только путь",  мне само решение как сделать коммент менее важно, чем узнать в чём моя ошибка при использовании класса.

Сколько, в каком количестве создаётся BitmapLabel ? (Ctrl+B --> Все)

 
Artyom Trishkin #:

Сколько, в каком количестве создаётся BitmapLabel ? (Ctrl+B --> Все)

На одном графике, один объект.

А как их может создаться больше одного? Имя то у всех создаваемых объектов одинаковое - "Comment" .


Забыл написать.

Проблема вылазит на супер убогом серваке, с одним ядром и с памятью в 1гб. И то не сразу, а по прошествии какого то времени.

Но я думаю, что если бы с кодом было всё нормально, то проблемы бы не было. Чем то забивается оперативная память, я не могу понять чем.

Почему мне важно это понять?  

Мощности сервака можно докупить, можно докупить память на комп, можно бесконечно апгрейдиться, но это ни как не сделает мой код правильным.

 
Aleksandr Slavskii #:

На одном графике, один объект.

А как их может создаться больше одного? Имя то у всех создаваемых объектов одинаковое - "Comment" .


Забыл написать.

Проблема вылазит на супер убогом серваке, с одним ядром и с памятью в 1гб. И то не сразу, а по прошествии какого то времени.

Но я думаю, что если бы с кодом было всё нормально, то проблемы бы не было. Чем то забивается оперативная память, я не могу понять чем.

Почему мне важно это понять?  

Мощности сервака можно докупить, можно докупить память на комп, можно бесконечно апгрейдиться, но это ни как не сделает мой код правильным.

А что есть в журнале при снятии советника с графика? Обычно там пишется какие объекты утекают, что даёт направление поиска

 
Artyom Trishkin #:

А что есть в журнале при снятии советника с графика? Обычно там пишется какие объекты утекают, что даёт направление поиска

Угу. Логи я удалил. Но не беда, повторить не долго. Сейчас запущу советник на серваке, утром (может раньше) будут логи.

Но насколько я помню, не смог в них найти указание на то куда утекает память.

И советник не удаляется с графика, скорее всего просто перезагружается сервак, так как в логах отсутствует запись о закрытии терминала. Но это не точно.

 
Aleksandr Slavskii #:

Угу. Логи я удалил. Но не беда, повторить не долго. Сейчас запущу советник на серваке, утром (может раньше) будут логи.

Но насколько я помню, не смог в них найти указание на то куда утекает память.

И советник не удаляется с графика, скорее всего просто перезагружается сервак, так как в логах отсутствует запись о закрытии терминала. Но это не точно.

Вы не поняли смысла моего вопроса. Не нужно ждать на сервере, когда там закончится память и он лопнет.

Если в коде есть утечка объектов, то на домашнем локальном компьютере при запущенном советнике перекомпилируйте его - в логи должно быть выведено сообщение о количестве и типе утекаемых объектов. Ну либо запустите его на графике и снимите сразу - тоже должно появиться сообщение об утечке, если она, конечно, есть.

 
Artyom Trishkin #:

Вы не поняли смысла моего вопроса. Не нужно ждать на сервере, когда там закончится память и он лопнет.

Если в коде есть утечка объектов, то на домашнем локальном компьютере при запущенном советнике перекомпилируйте его - в логи должно быть выведено сообщение о количестве и типе утекаемых объектов. Ну либо запустите его на графике и снимите сразу - тоже должно появиться сообщение об утечке, если она, конечно, есть.

Ничего не пишет при компиляции. Удаляет и ставит по новой. Всё. 

NM      0       00:18:47.545    Experts expert Comm (SBRF-12.23,M1) removed
JI      0       00:18:47.547    Experts expert Comm (SBRF-12.23,M1) loaded successfully
KQ      0       00:18:47.560    Experts expert Comm (RTS-12.23,M1) removed
EE      0       00:18:47.562    Experts expert Comm (RTS-12.23,M1) loaded successfully

На серваке ещё пока работает. Подожду, может там в логах, что то напишет.

 
Aleksandr Slavskii #:

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

Через какое то время после запуска советника с комментом на нескольких графиках, происходит что то не хорошее, вплоть до потухания экрана и перезагрузки сервака)))

Понятно, что что то делаю не правильно с классом CCanvas, а вот что именно неправильно, я не понимаю.

Кажется понял. Поправьте если понял не правильно.

У меня в коде на каждом тике создаётся ресурс с разными именами. 

код из канваса

      //--- generate resource name
      m_rcname="::"+name+(string)ChartID()+(string)(GetTickCount()+MathRand());
      //--- initialize data with zeros
      ArrayInitialize(m_pixels,0);
      //--- create dynamic resource
      if(ResourceCreate(m_rcname,m_pixels,width,height,0,0,0,clrfmt))

А при следующем обновлении картинки этот ресурс судя по всему не удаляется.

Объект один и тот же, ресурсы к нему лепятся разные.

В общем переделал код. 

вроде так он должен быть правильным.

#include <Canvas\Canvas.mqh>
//+------------------------------------------------------------------+
void Comm(string txt, color clr = clrYellow, int FontSize = 20, string Font = "Consolas", int flag = FW_BOLD)
  {
   int shift = 0;
   if(ChartGetInteger(0, CHART_SHOW_ONE_CLICK))
      shift = 60;

   CCanvas canvas;
   canvas.FontNameSet(Font);
   canvas.FontFlagsSet(flag);
   canvas.FontSizeSet(FontSize);

   int width = 0, height = 0;
   string result[];
   int size = StringSplit(txt, StringGetCharacter("\n", 0), result);
   height = (int)(FontSize * 1.8 * size);

   for(int i = 0; i < size; i++)
     {
      int w = canvas.TextWidth(result[i]);
      if(width < w)
         width = w;
     }

   if(ObjectFind(0, "Comment") < 0)
      canvas.CreateBitmapLabel(0, 0, "Comment", 5, 20 + shift, width, height, COLOR_FORMAT_ARGB_NORMALIZE);
   else
      canvas.Attach(0, "Comment", width, height, COLOR_FORMAT_ARGB_NORMALIZE);
   canvas.Erase(0x00FFFFFF);

   for(int i = 0; i < size; i++)
      canvas.TextOut(0, (int)(FontSize * 0.8 * i), result[i], ColorToARGB(clr, 255));

   canvas.Update(true);
  }
//+------------------------------------------------------------------+
Причина обращения: