Особенности языка mql5, тонкости и приёмы работы - страница 132

 
Igor Makanu:

оберните в класс рассчет индикатора -  буфера привяжите к полям класса

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

Память вычищается только сменой ТФ. 

Явно не хватает команды очистки памяти по хэндлу. Например MemErase( int handle);

 
Nikolai Semko:

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

Память вычищается только сменой ТФ. 

Явно не хватает команды очистки памяти по хэндлу. Например MemErase( int handle);

1. комбинации указатель на обьект и экземпляр обекта (я про * ) - проверяли?

2. деструктор писали и удаляли в нем размер массива? (ArrayFree() и ArrayResize(arr,0,0)  )

 
Nikolai Semko:

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

Память вычищается только сменой ТФ. 

Явно не хватает команды очистки памяти по хэндлу. Например MemErase( int handle);

А IndicatorRelease не применяли?

Но всё-же я думаю это пустая затея. Вот скажите зачем это может понадобиться? Мультики рисовать? А для торговли? Усреднять Moving Average пока не вытянется в прямую линию?

 
Nikolai Semko:

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

Память вычищается только сменой ТФ. 

Явно не хватает команды очистки памяти по хэндлу. Например MemErase( int handle);

Терминал хранит кэши какое-то время, даже если программа их не использует.

Можно засечь, через сколько времени освобождается память.

 
Alexey Viktorov:

А IndicatorRelease не применяли?

Но всё-же я думаю это пустая затея. Вот скажите зачем это может понадобиться? Мультики рисовать? А для торговли? Усреднять Moving Average пока не вытянется в прямую линию?

Да, спасибо, Алексей. Забыл я про эту функцию. Видел ее раньше, но никогда ее не использовал.

Попробовал. Что-то происходит не так. Удалять то она удаляет, но после ее удаления все стопориться.

Просто добавил одну строку кода в функцию DrawSetup() перед расчетом индикатора со следующими параметрами.

IndicatorRelease(handle);
handle=iMA(_Symbol,_Period,per1,0,MaMethod,PriceBase);
for(int i=0;i<N;i++) handle=iMA(_Symbol,_Period,per2,0,MaMethod,handle);

Индикатор попросту перестает работать и понять причину не могу пока.

Alexey Viktorov:

Но всё-же я думаю это пустая затея. Вот скажите зачем это может понадобиться? Мультики рисовать? А для торговли? Усреднять Moving Average пока не вытянется в прямую линию?

Абсолютно с Вами согласен. Это просто бесполезная игрушка.

 
Andrey Khatimlianskii:

Терминал хранит кэши какое-то время, даже если программа их не использует.

Можно засечь, через сколько времени освобождается память.

Ждал 6 минут - так и не почистилось ничего.

 
Igor Makanu:

1. комбинации указатель на обьект и экземпляр обекта (я про * ) - проверяли?

2. деструктор писали и удаляли в нем размер массива? (ArrayFree() и ArrayResize(arr,0,0)  )

1. Да, делал через указатель, new и delete.

2. Так нет массива никакого. Т.е. есть внутренние массивы, но их имён то нет. Только номер хэндла.

Причем на каждой итерации цикла for значение переменной handle увеличивается на единицу. Т.е. внутренние буферы размножаются и все предыдущие участвуют в расчете следующего. 

По логике нужно делать IndicatorRelease(handle); перед следующим полностью новым расчетом индикатора, но я уже писал выше, что это убивает индикатор. Почему - не ясно. 

 
Nikolai Semko:

Да, спасибо, Алексей. Забыл я про эту функцию. Видел ее раньше, но никогда ее не использовал.

Попробовал. Что-то происходит не так. Удалять то она удаляет, но после ее удаления все стопориться.

Просто добавил одну строку кода в функцию DrawSetup() перед расчетом индикатора со следующими параметрами.

Индикатор попросту перестает работать и понять причину не могу пока.

Абсолютно с Вами согласен. Это просто бесполезная игрушка.

Я немного не так думал. Мне кажется надо сделать пару хендлов, по типу перебора графиков

currChart=ChartNext(prevChart); // на основании предыдущего получим новый график

И получив новый хендл использованный можно выбросить как и использованный ...

 
Alexey Viktorov:

Я немного не так думал. Мне кажется надо сделать пару хендлов, по типу перебора графиков

И получив новый хендл использованный можно выбросить как и использованный ...

не прокатит

 
Nikolai Semko:

не прокатит

Почему?
Причина обращения: