Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Justinas Shimkus
179
Justinas Shimkus 2016.11.15 16:58 

Добрый день. 

Мой советник медленно, но верно увеличивает съедаемый объем оперативной памяти (прирост порядка 100 Мб/час). Какие самые очевидные причины ?

Добавлю: использую 5 валютных пар (хотя, что на одной, что на пяти), 6000 баров на каждом графике (установлено в терминале), использую 3 индикатора (в них массивы на 6000 элементов), использую несколько статических массивов и один динамический из MqlRates, несколько десятков переменных.

Быть может, есть какие-то само-собой разумеющиеся способы завершения OnTick() для освобождения памяти

Уже спасибо. 

fxsaber
5291
fxsaber 2016.11.15 17:16  
При снятии советника в журнале есть что-то подобное?
1 undeleted objects left
1 object of type A left
32 bytes of leaked memory
Justinas Shimkus
179
Justinas Shimkus 2016.11.15 17:28  

Нет, только такое:

FF 0 19:23:11.890 Terminal InstaTrader 5 build 1455 started

QM 0 19:23:11.898 Terminal Windows 10 Pro ..

OG 0 19:23:11.898 Terminal C:\...

GK 0 19:23:12.428 Experts expert InDayTrade (EURUSD,M1) loaded successfully

HK 0 19:23:12.821 Network '9377468': authorized on InstaForex-Server through MetaTrader 5 Access Server 1950 (ping: 155.70 ms)

OD 0 19:23:12.821 Network '9377468': previous successful authorization performed from 62.63.81.32 on 2016.11.15 17:21:13

CE 0 19:23:16.303 Network '9377468': terminal synchronized with InstaForex Companies Group

LQ 0 19:23:16.303 Network '9377468': trading has been enabled - hedging mode

EP 0 19:23:22.012 Experts expert Test1 (EURUSD,M1) removed

IQ 0 19:23:22.504 Terminal exit initiated

RK 0 19:23:22.836 Network '9317868': disconnected from InstaForex-Server

OP 0 19:23:23.381 Terminal stopped 

fxsaber
5291
fxsaber 2016.11.15 18:33  
Justinas Shimkus:

Нет, только такое:

Это вкладка Журнал. А что во вкладке (рядом) Эксперты?
Justinas Shimkus
179
Justinas Shimkus 2016.11.15 18:35  
fxsaber:
Это вкладка Журнал. А что во вкладке (рядом) Эксперты?
Никаких строчек не появляется.
fxsaber
5291
fxsaber 2016.11.15 18:37  
Justinas Shimkus:

Мой советник медленно, но верно увеличивает съедаемый объем оперативной памяти (прирост порядка 100 Мб/час). Какие самые очевидные причины ?

Либо баг терминала, либо массивы растут. Отключайте часть функционала советника и смотрите на изменения. Так получится локализовать проблему.
Justinas Shimkus
179
Justinas Shimkus 2016.11.15 19:36  
fxsaber:
Либо баг терминала, либо массивы растут. Отключайте часть функционала советника и смотрите на изменения. Так получится локализовать проблему.
Да, попробую, спасибо. А насчет массивов, как можно вообще удалить статический массив из памяти ?
fxsaber
5291
fxsaber 2016.11.15 19:42  
Justinas Shimkus:
Да, попробую, спасибо. А насчет массивов, как можно вообще удалить статический массив из памяти ?

ArrayResize(Array, 0);  
// или
ArrayFree(Array);

Если статический вот это

int Array[] = {1, 2};
то никак.
Andrey Khatimlianskii
56450
Andrey Khatimlianskii 2016.11.16 13:33  

Проверьте кол-во и тип передаваемых в iCustom параметров. Если что-то не совпадает с реальностью, каждый вызов может создавать свою копию индикатора.

100 Мб/час — это много. 

fxsaber
5291
fxsaber 2016.11.16 13:38  
Andrey Khatimlianskii:

Проверьте кол-во и тип передаваемых в iCustom параметров. Если что-то не совпадает с реальностью, каждый вызов может создавать свою копию индикатора.

Кстати, да, хорошее предположение.
Justinas Shimkus
179
Justinas Shimkus 2016.11.17 16:39  
Andrey Khatimlianskii:


Проверьте кол-во и тип передаваемых в iCustom параметров. Если что-то не совпадает с реальностью, каждый вызов может создавать свою копию индикатора.

100 Мб/час — это много. 

Да, я закомментил индикаторы iCustom и прирост занимаемой оперативной памяти прекратился. В коде индикаторов нашел строчки начинающиеся на input и перенес их в советника. Объявил перемененные и перечислил их в iCustom в той же последовательности и тем же типом, что и в коде индикатора. Получилось например, это:

   uchar ExtPeriodNP=255;
   uchar MinAmplitudeNP=20;
   uchar MinMotionNP=0;
   bool UseSmallerTFforEBNP=true;  
    
   ZZHandle=iCustom(NULL,PERIOD_M1,"Downloads\\AlexSTAL_ZigZagProf",ExtPeriodNP,MinAmplitudeNP,MinMotionNP,UseSmallerTFforEBNP);

 Первые четыре строчки скопировал из кода индикатора.

Это не помогло, потребление памяти все росло. Я добавил IndicatorRelease(ZZHandle) в конце OnTick() и потребляемая память перестала расти, но выросла нагрузка на процессор - я так понимаю, он каждый тик пересчитывает заново значения индикатора в каждом баре.

Вроде, проблема с памятью решена, но решена крайне криво. Потому, добавлю вопрос - что понимается под "кол-во и тип передаваемых в iCustom параметров" ? 

Уже спасибо. 

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий