Падение терминала. Перегруз памяти. - страница 2

 
Алексей Тарабанов:

Судя по Вашим таблицам загрузки памяти и распределения процессов по ядрам процессора при запуске терминала и после пробуждения компьютера, причин здесь три:

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

2. Алгоритм распределения ресурсов, реализованный в терминале. При пробуждении компьютера явно применяется другой алгоритм. 

3. Некорректность Ваших действий при запуске большого количества ресурсоемких процессов. 

Как с этим бороться(imheнько): 

1. Перед закрытием терминала удалите все окна, кроме одного. 

2. После открытия терминала откройте ранее удаленные окна. 

ЗЫ: Наталья дело говорит, опять-же imheнько. 

У меня два идентичных по расчетам индикатора высокой вычислительной сложности. Различие в числе отображаемых буферов. У первого их два, у второго - двенадцать. Второй при старте вешает терминал намертво.

Как я это поборол. Установил задержку расчетов этого индикатора в 30 секунд с момента инициализации.

 
Всем большое спасибо за подсказки, буду изучать информацию и что-то думать!
Если у кого нибудь есть еще какие то мысли, с удовольствием с ними ознакомлюсь.
 

Если виснет терминал, то это надо индикатор ремонтировать.
Скорее всего там некорректно оформлен цикл обработки баров в истории,
с этим всегда проблемы, или в тестере медленно ползёт индикатор, или залипает терминал при загрузки.

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

   int counted_bars=IndicatorCounted();
   int i,limit;
   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
      limit = MathMin(Bars-counted_bars,Bars-1);
   if(counted_bars==0) {
      limit--;   // чтобы не выйти за пределы массива при counted_bars==0
      limit-=10; // в расчетах используется смещение на 10 баров вглубь истории, поэтому добавим это смещение при первом расчете
      }else{     // индикатор уже рассчитывался ранее, counted_bars>0                
      limit++;   // при повторных вызовах увеличим limit на 1, чтобы гарантированно обновлять значения индикатора для последнего бара
     } 
     for(i=limit; i>=0; i--) {

//далее код индикатора//
     }

ИЛИ

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,   // Количество просчитанных баров 
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
    int i;                             // Индекс бара   
    i = rates_total-prev_calculated-1; // Индекс первого не посчитанного
    while(i >= 0)                      // Цикл по не посчитанным барам
     {

//далее код индикатора//

      i--;                             // Расчёт индекса следующего бара
     }
   return(rates_total);
  }
 

Как много советов от тех, кто даже не посмотрел код индикатора...


Aleksandr Novikov:

Используя индикатор Portfolio Modeller, периодически сталкиваюсь с проблемой перегрузки памяти или с невозмоностью запустить терминал, т.к. он сразу падает.

Вот пример, когда использовал в 1 терминале 10 графиков и к каждому начал применять шаблон с 7 индикаторами - на 5-6 графике случилась такая лажа

Как вы собираетесь одновременно анализировать 70 портфелей? Зачем?

Разделите их на порции и загружайте последовательно (сменой профиля или шаблона).

Нужно понимать, что для построения портфеля из Х инструментов нужно загрузить в память как минимум Х тайм-серий. Каждому индикатору.

 
Andrey Khatimlianskii:

Как много советов от тех, кто даже не посмотрел код индикатора...


Как вы собираетесь одновременно анализировать 70 портфелей? Зачем?

Разделите их на порции и загружайте последовательно (сменой профиля или шаблона).

Нужно понимать, что для построения портфеля из Х инструментов нужно загрузить в память как минимум Х тайм-серий. Каждому индикатору.

Проблема проявляется только при старте терминала.

После этого работает анализ десятков и сотен портфелей.

 
Mislaid:

Проблема проявляется только при старте терминала.

После этого работает анализ десятков и сотен портфелей.

Тогда, возможно, индикатор можно доработать, чтобы он стартовал "постепенно".

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

 
Andrey Khatimlianskii:

Тогда, возможно, индикатор можно доработать, чтобы он стартовал "постепенно".

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

У меня была подобная проблема. Решение нашлось такое: индикатор начинает полноценно работать через 30 секунд после логина.

 

Замечено что терминал постепенно набирает память по мере работы и не отпускает её, после перезапуска снова всё нормально

 

Индикатор конечно тяжёлый (но тому есть причины) при каждом цикле делается ZeroMemory основных объектов,

интересно что после того как терминал набрал гигабайт памяти и если переключиться на другой шаблон без портфелей вообще то память все равно не отпускается,

поэтому мне кажется (я до конца правда не уверен) что проблема в архитектуре МТ4, а не в индикаторе

 
А еще странно то ,что когда загружаю шаблон с 6-8 индикаторами на 5-7 график, то терминал падает, при том, что проц в этот момент не загружается и до 50% и памяти так же еще более 50% свободной!
У меня тоже есть подозрения, что что-то не так с терминалом.
Пока что ограничился 1 выбором - поставил макс. баров истории и в окне поставил по 1000. 5 графиков, в каждом по 7 индикаторов, с периодом расчета 24 бара Н1 - память держится в районе 350Мб
Было такое, что после падения не мог запустить терминал - он сразу падал. Открытым по счету он был 5-6 из всех открытых. Приходилось закрывать 2-3 терминала, что бы запустить этот и потом уже запускал закрытые.

Вообще странно, что грузится память даже в выходные дни, когда нет потока котировок.
Причина обращения: