Сброс памяти на iCustom.

 

Пытаюсь оптимизировать Memory usage на iCustom. Пока ничего не получается. Memory на каждой итерации добавляется и не знаю как сбросить. Memory сбрасывается только после завершение цикла. По экспериментам заметил, если принудительно останавливать Script, то в таком случае Memory даже не сбрасывается. Как сбросить Memory на каждой итерации?


//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double Output1,Output0;
   for(int i=3; i<=1000; i+=1)
     {
      Output1=iCustom(NULL,0,"Bulls.ex4",i,0,0);
      Print("-------------------i: ",i," Output0: ",Output0,"Output1: ",Output1);
     }

PlaySound("alert2.wav");
  }
//+------------------------------------------------------------------+
#s3gt_translate_tooltip_mini { display: none !important; }
 
Подождать "некоторое время" (по заявлениям разработчиков). Память, используемая графиками и индикаторами, не освобождается сразу после прекращения работы программы, которая из вызвала. Они продолжают работать на тот случай, если к ним снова обратится какая-то программа. После истечения этого "некоторого времени" без обращений к данным память освобождается. Можно попытаться опытным путем вычислить это время.
 
Ihor Herasko:
Подождать "некоторое время" (по заявлениям разработчиков). Память, используемая графиками и индикаторами, не освобождается сразу после прекращения работы программы, которая из вызвала. Они продолжают работать на тот случай, если к ним снова обратится какая-то программа. После истечения этого "некоторого времени" без обращений к данным память освобождается. Можно попытаться опытным путем вычислить это время.

Спасибо, тогда попробую каждую итерацию замедлить. Посмотрим что получится.


По времени не удалось сбросить ( Sleep на 10 минут). Но я заметил что, как только Free Memory=0, так начинается деинициализация индикатора, получается инициализации с новыми параметрами и деинициализация с старыми параметрами (наверно). Вообще-то по справочнику деинициализация должна произойти сразу же после смены входных параметров но как видно здесь так не получается, только когда Free Memory=0.

 
Nauris Zukas:

Пытаюсь оптимизировать Memory usage на iCustom. Пока ничего не получается. Memory на каждой итерации добавляется и не знаю как сбросить. Memory сбрасывается только после завершение цикла. По экспериментам заметил, если принудительно останавливать Script, то в таком случае Memory даже не сбрасывается. Как сбросить Memory на каждой итерации?


#s3gt_translate_tooltip_mini { display: none !important; }

Очень интересно, как вы пытаетесь это делать, если какие-либо средства для этого отсутствуют вообще?

 
Dmitry Fedoseev:

Очень интересно, как вы пытаетесь это делать, если какие-либо средства для этого отсутствуют вообще?

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

//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double Output1,Output0;
   for(int i=3; i<=399; i+=1)
     {
      Output1=iCustom(NULL,0,"Bulls.ex4",i,0,0);
      Print("-------------------i: ",i," Output0: ",Output0,"Output1: ",Output1);
      if(i%200==0)
        {
         Print("----          -----i: ",i," Wait some time ");
         uint minits=10*60;
         Sleep(minits*1000);
        }
     }

   PlaySound("alert2.wav");
  }
//+------------------------------------------------------------------+

До 200 итерации нарастил память (Memory) потом ждал и смотрел когда упадет память. Но так и не упала.

Меняя время задержки я заметил что всегда после 258 итерации начинается деинициализация индикатора (даже без задержки тоже), получается последовательно деинициализация и инициализация. Тогда я заметил что, как только Free Memory=0 так и все происходит. У меня RAM 8G, наверно с 16G деинициализация только после завершение цикла началось.

Пока нет соображении еще как сбросить.

 
Выгрузить скрипт и подождать 5 минут.
 
Andrey Khatimlianskii:
Выгрузить скрипт и подождать 5 минут.

Спасибо, но данный способ мне не поможет. В цикле перебирается параметры которые потом сортируется. Здесь можно посмотреть как это выглядит. Мои компьютер может обрабатывать 70К баров (мне хватает), если больше то memory error, не хочется если у клиента слабенький компьютер то вылетал на меньше баров.

YouTube
  • www.youtube.com
Enjoy the videos and music you love, upload original content, and share it all with friends, family, and the world on YouTube.
 
Nauris Zukas:

Спасибо, но данный способ мне не поможет. В цикле перебирается параметры которые потом сортируется. Здесь можно посмотреть как это выглядит. Мои компьютер может обрабатывать 70К баров (мне хватает), если больше то memory error, не хочется если у клиента слабенький компьютер то вылетал на меньше баров.

Правильнее всего перенести расчеты в советника/скрипт и оптимизировать в нем.

Но и вариант с выгрузкой срипта я бы не отбрасывал, просто это должен быть отдельный скрипт (загружать его из основного).

 
Nauris Zukas:

Спасибо, но данный способ мне не поможет. В цикле перебирается параметры которые потом сортируется. Здесь можно посмотреть как это выглядит. Мои компьютер может обрабатывать 70К баров (мне хватает), если больше то memory error, не хочется если у клиента слабенький компьютер то вылетал на меньше баров.

А может эксперта сделать и оптимизировать параметры обычным образом? Сделки не делать, а в деините писать в файл результат, потом обработать их.

 
Dmitry Fedoseev:

А может эксперта сделать и оптимизировать параметры обычным образом? Сделки не делать, а в деините писать в файл результат, потом обработать их.

Я пока хочу ещё подумать над индикатором, так как здесь есть преимущество - за один подход могу и пройтись по всем валютным парам и по таймфреймам.

Я думал над изменением размера буфера после вывода результатов но по справочнику этот вариант отпадает: "Для индикаторных буферов все операции по изменению размера производит исполняющая подсистема терминала.". А может есть вариант как после вывода результатов вообще уничтожить этот буфер? Пока только не нашёл способ как это сделать.

 
Andrey Khatimlianskii:

Но и вариант с выгрузкой срипта я бы не отбрасывал, просто это должен быть отдельный скрипт (загружать его из основного).

Надо будет подумать.

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