Как улучшить память, которую могут использовать графики MT5?

 
Как улучшить память, которую могут использовать графики MT5?

Когда я использую MQL5 для написания индикаторов, мне нужно создавать большое количество графических объектов на диаграммах MT5, и когда эти графические объекты достигают определенного количества, мои диаграммы становятся очень застойными, и моя компьютерная память 32G полностью поддерживает работу этих объектов диаграмм, поэтому я анализирую, что некоторые параметры конфигурации MT5 могут ограничивать размер памяти, которую может использовать диаграмма, и как улучшить память, которую может использовать диаграмма MT5? Обращайтесь к мастерам здесь, спасибо! Мой график выглядит следующим образом:


Файлы:
123.png  91 kb
 
Используйте канвас: можно рисовать один объект поверх всего графика или отдельные объекты по свечам (можно динамически создавать только для видимой части графика).
 

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

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

Так же проверьте в коде наличие повторного построения объектов при каждом тике\новом баре.

Ещё объекты можно создавать, только если цена достаточно близко к ним подошла.

Вместо линий, можете использовать прямоугольник - судя по плотности линий он может заменить много линий

Про ограничение памяти я не понял. Терминал не использует всю доступную ОЗУ?

 
Aleksey Vyazmikin #:

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

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

Так же проверьте в коде наличие повторного построения объектов при каждом тике\новом баре.

Ещё объекты можно создавать, только если цена достаточно близко к ним подошла.

Вместо линий, можете использовать прямоугольник - судя по плотности линий он может заменить много линий

Про ограничение памяти я не понял. Терминал не использует всю доступную ОЗУ?

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

 
Stanislav Korotky #:
Используйте канвас: можно рисовать один объект поверх всего графика или отдельные объекты по свечам (можно динамически создавать только для видимой части графика).

Можно ли создавать динамические графические объекты? Автоматически отображать видимую часть диаграммы

 
xiezhiqi #:

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

Как я понял, вариант уменьшения числа объектов не рассматриваете и свой код находите оптимальным.

Вы говорите, что ОЗУ достаточно много свободного, но компьютер тормозит, вероятно, дело в ЦПУ. Какая у Вас модель?

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

 
Aleksey Vyazmikin #:

Как я понял, вариант уменьшения числа объектов не рассматриваете и свой код находите оптимальным.

Вы говорите, что ОЗУ достаточно много свободного, но компьютер тормозит, вероятно, дело в ЦПУ. Какая у Вас модель?

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

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

 
xiezhiqi #:

Можно ли создавать динамические графические объекты? Автоматически отображать видимую часть диаграммы

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

Day Of Week, Week Of Year and other marks in Data Window and on chart
Day Of Week, Week Of Year and other marks in Data Window and on chart
  • www.mql5.com
WeekDays indicator displays Day Of Week, Week Of Year, Day Of Year or Bar Index in the Data Window, and optionally in labels on the chart.
 
Canvas для того и придумали, чтобы наносить на график бесконечное количество графики с копеечным затратом мощности 
 

В книге есть другой пример - индикатора с объектами-канвасами (там применен подход с одним объектом на свечу, но канвас можно наложить на график как угодно, хоть один большой) для отрисовки гистограмм объемов.

Учебник по MQL5: Расширенные средства языка / Ресурсы / Прикладное применение графических ресурсов в трейдинге
Учебник по MQL5: Расширенные средства языка / Ресурсы / Прикладное применение графических ресурсов в трейдинге
  • www.mql5.com
Чтобы у вас не создалось впечатление, что ресурсы подходят только для украшений, покажем, как на их основе можно разработать инструмент, полезный...
 
xiezhiqi #:

Станислав дал хорошие примеры.
Только важно сделать акцент на одной неприятной особенности работы с Canvas. 
Стоит избегать частого исользования функций ChartGet...(т.е. кешировать их) и вообще не использовать XY функций ( ChartTimePriceToXYChartXYToTimePrice) для пересчета координат пиксели XY <-> Price-Time
Дело в том, что в силу исторических событий они весьма медлительные (выполняются несколько миллисекунд). Если их кэшировать и писать свои функции пересчета XY<-> Price-Time, то можно добиться ускорения в сотни тысяч раз (не преувеличиваю), что избавит Вас от серьезных лагов, которые часто случаются у тех, кто не знает этой особенности.
Вот пример из CodeBase моей библиотеки iCanvas, где решена эта проблема:

#include <Canvas\iCanvas_CB.mqh> //https://www.mql5.com/ru/code/22164
input int Step = 50;

//+------------------------------------------------------------------+
int OnInit() {
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {}
//+------------------------------------------------------------------+
void OnTick() {
   Draw();
}
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam) {
   if (id == CHARTEVENT_CHART_CHANGE || id == CHARTEVENT_MOUSE_MOVE) Draw();
}
//+------------------------------------------------------------------+
void Draw() {
   static uint last = 0;         //
   uint cur = GetTickCount();    //  Needed to optimize performance
   if (cur-last<25) return;      //  Especially important for the tester
   last = cur;                   //
   if (Canvas.tester) ChartChanged();   // for correct work in the tester.
   Canvas.Erase(0x00FFFFFF);   // this mask is needed for correct font output
   Canvas.CurentFont("Calibri Light", 16,16,0xFF000000);
   for (int shift = -1000; shift<=1000; shift+=Step ) {
      uint clr = (Canvas.Grad((shift+1000.0)/2000.0) & 0x00FFFFFF)|0x40000000;
      int bar = Round(Canvas.Bar(double(_MouseX+shift)));
      double price  = iHigh(_Symbol,PERIOD_CURRENT,bar);
      int x = int(Canvas.X(double(bar)));
      int y = (int)_Y(price);
      Canvas.FillRectangleA(x,y,x+150,y-60,clr);

      _CommXY(x+5,y-55,"high = "+DoubleToString(price,_Digits));
      _Comment("bar = "+(string)bar);
      _Comment("time = " + TimeToString(iTime(_Symbol,PERIOD_CURRENT,bar)));
   }
   Canvas.Update();
}



Easy Canvas
Easy Canvas
  • www.mql5.com
Данная библиотека и класс iCanvas упростит написание программ с применением Canvas.
Файлы: