Кажется, что часть объектов можно просто удалить, когда они уже не представляют ценности.
Если индикатор рисует глубоко в истории, то есть смысл ограничить глубину в коде, или уменьшить число баров в терминале.
Так же проверьте в коде наличие повторного построения объектов при каждом тике\новом баре.
Ещё объекты можно создавать, только если цена достаточно близко к ним подошла.
Вместо линий, можете использовать прямоугольник - судя по плотности линий он может заменить много линий
Про ограничение памяти я не понял. Терминал не использует всю доступную ОЗУ?
Кажется, что часть объектов можно просто удалить, когда они уже не представляют ценности.
Если индикатор рисует глубоко в истории, то есть смысл ограничить глубину в коде, или уменьшить число баров в терминале.
Так же проверьте в коде наличие повторного построения объектов при каждом тике\новом баре.
Ещё объекты можно создавать, только если цена достаточно близко к ним подошла.
Вместо линий, можете использовать прямоугольник - судя по плотности линий он может заменить много линий
Про ограничение памяти я не понял. Терминал не использует всю доступную ОЗУ?
Большое спасибо за вашу помощь, в моей программе нет повторно созданных графических объектов, количество исторических столбов фьючерсных сортов также ограничено, использование линий также является последним средством, потому что прямоугольник не очень гибкий, компьютер имеет много остаточной памяти, когда график терминала MT5 очень застрял, спасибо здесь!
Большое спасибо за вашу помощь, в моей программе нет повторно созданных графических объектов, количество исторических столбов фьючерсных сортов также ограничено, использование линий также является последним средством, потому что прямоугольник не очень гибкий, компьютер имеет много остаточной памяти, когда график терминала MT5 очень застрял, спасибо здесь!
Как я понял, вариант уменьшения числа объектов не рассматриваете и свой код находите оптимальным.
Вы говорите, что ОЗУ достаточно много свободного, но компьютер тормозит, вероятно, дело в ЦПУ. Какая у Вас модель?
В любом случае, мне кажется, что в коде избыточные циклы перебора и модификации всех объектов. Возможно, есть смысл запоминать имена объектов и не искать их повторно перебором. Так же, если объект уже не нужно модифицировать по логике индикатора, то можно перестать с ним работать, создав список таких объектов.
Как я понял, вариант уменьшения числа объектов не рассматриваете и свой код находите оптимальным.
Вы говорите, что ОЗУ достаточно много свободного, но компьютер тормозит, вероятно, дело в ЦПУ. Какая у Вас модель?
В любом случае, мне кажется, что в коде избыточные циклы перебора и модификации всех объектов. Возможно, есть смысл запоминать имена объектов и не искать их повторно перебором. Так же, если объект уже не нужно модифицировать по логике индикатора, то можно перестать с ним работать, создав список таких объектов.
Компьютер быстро, просто диаграмма MT5 очень застряла, все графические объекты имеют имена, но диаграмма MT5 не может нести больше объектов
Можно ли создавать динамические графические объекты? Автоматически отображать видимую часть диаграммы
Разумеется, можно. Посмотрите в качестве примера вот этот мой индикатор, выводящий метки дней недели только в видимой части графика.
- www.mql5.com
В книге есть другой пример - индикатора с объектами-канвасами (там применен подход с одним объектом на свечу, но канвас можно наложить на график как угодно, хоть один большой) для отрисовки гистограмм объемов.
- www.mql5.com
Станислав дал хорошие примеры.
Только важно сделать акцент на одной неприятной особенности работы с Canvas.
Стоит избегать частого исользования функций ChartGet...(т.е. кешировать их) и вообще не использовать XY функций ( ChartTimePriceToXY, ChartXYToTimePrice) для пересчета координат пиксели 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(); }

- www.mql5.com
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Когда я использую MQL5 для написания индикаторов, мне нужно создавать большое количество графических объектов на диаграммах MT5, и когда эти графические объекты достигают определенного количества, мои диаграммы становятся очень застойными, и моя компьютерная память 32G полностью поддерживает работу этих объектов диаграмм, поэтому я анализирую, что некоторые параметры конфигурации MT5 могут ограничивать размер памяти, которую может использовать диаграмма, и как улучшить память, которую может использовать диаграмма MT5? Обращайтесь к мастерам здесь, спасибо! Мой график выглядит следующим образом: