Ошибки, баги, вопросы - страница 2556

 
@Ilyas

Данный индикатор крашит систему.
Причем с изменением разрешения экрана и с мигающими пикселями и необходимой перезагрузкой компьютера.
Причем, если не вызывать казалось бы безобидную функцию Crash(), то краша нет.
Воспроизводится следующим образом:

  • запускаем индикатор
  • начинаем менять таймфрейм, пока не начнуться какие-то тормоза
  • после этого пытаемся свернуть МТ5

 



Воспроизводил данный краш каждый раз, когда так делал ( 6-8 раз)

Файлы:
AnyTF.mq5  10 kb
iCanvas.mqh  21 kb
 
на LTSC не крашится, в логе ошибка: MemoryException 4424265936 bytes not available, 0 heapmin result

все таки крашнулась, после еще нескольких смен ТФ, и еле загрузилась система, колесо загрузки раз 100 оборотов сделало, думал не загрузится, лучше не проверять)
 
Fast235:
на LTSC не крашится, в логе ошибка: MemoryException 4424265936 bytes not available, 0 heapmin result

все таки крашнулась, после еще нескольких смен ТФ, и еле загрузилась система, колесо загрузки раз 100 оборотов сделало, думал не загрузится, лучше не проверять)

Да, краш очень жесткий. Лучше не рисковать.
Все дело в памяти конечно.
Если подчищать ручками память вот так:

int OnInit()
  {
   ChartSetInteger(0,CHART_FOREGROUND,false);
   if(erase)
      ChartSetInteger(0,CHART_SHOW,false);
   Canvas.Erase();
   Canvas.Comm("Идет загрузка всех тиков. Подождите пожалуйста");
   Canvas.Update();
   N=CopyTicks(_Symbol,ticks,COPY_TICKS_ALL,(TimeCurrent()-Weeks*7*24*60*60)*1000,INT_MAX);
   Print("Скачено "+string(N)+" тиков");
   if(N>0) N=CalculateNewTF(ticks,bars,TF);
   ArrayFree(ticks);
   Print("Сформировано "+string(N)+" баров");
   if(N>0) ShowBars(bars);
   Crash();
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason) 
  {
    ArrayFree(bars); 
    if(erase) ChartSetInteger(0,CHART_SHOW,true); 
  }

то краша тоже не происходит. Во всяком случае у меня не получилось.
Но ведь при смене ТФ должна происходить автоматическая очистка массивов

И не понятно, при чем тогда здесь функция Crash(), без выполнения которой нет краша, ведь она считывает только лишь информацию о индикаторах.
Возможно выполнение этой функции тормозит OnDeinit при смене ТФ и поэтому МТ5 не успевает подчистить память. 
Уже давно проблемы с асинхронностью OnDeinit. Непорядок! Ведь не должна же рушится система из-за асинхронности...

 

Почему когда скролишь чарт с индикаторами процессор грузит ядро на 100%?

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

 
Aleksey Vyazmikin:

Почему когда скролишь чарт с индикаторами процессор грузит ядро на 100%?

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

Загрузка процессора при отрисовке чартов прямо зависит от производительности видеокарты.

На старых ноутбуках со слабыми картами или на серверах без видеокарт/драйверов неминуемо будет мгновенный, но короткий скачок загрузки CPU.

Ну и сам CPU нужен помощнее, чтобы сьедать повышенные запросы без следа.
 
Renat Fatkhullin:

Загрузка процессора при отрисовке чартов прямо зависит от производительности видеокарты.

На старых ноутбуках со слабыми картами или на серверах без видеокарт/драйверов неминуемо будет мгновенный, но короткий скачок загрузки CPU.

Ну и сам CPU нужен помощнее, чтобы сьедать повышенные запросы без следа.

Речь идет о процессоре FX-8350 и видеокарте Radeon HD 7950. У меня нет ощущения, что видеокарта нагружается от MT5.

 
Nikolai Semko:

Да, краш очень жесткий. Лучше не рисковать.
Все дело в памяти конечно.
Если подчищать ручками память вот так:

то краша тоже не происходит. Во всяком случае у меня не получилось.
Но ведь при смене ТФ должна происходить автоматическая очистка массивов! 

И не понятно, при чем тогда здесь функция Crash(), без выполнения которой нет краша, ведь она считывает только лишь информацию о индикаторах.
Возможно выполнение этой функции тормозит OnDeinit при смене ТФ и поэтому МТ5 не успевает подчистить память. 
Уже давно проблемы с асинхронностью OnDeinit. Непорядок! Ведь не должна же рушится система из-за асинхронности...

1) нужно вот здесь урезать осетра с INT_MAX (2 млрд):

CopyTicks(_Symbol,ticks,COPY_TICKS_ALL,(TimeCurrent()-Weeks*7*24*60*60)*1000,INT_MAX);

это мы поправим со своей стороны тоже

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

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

4) используйте ООП, он хотя бы даст возможность правильно описывать и контролировать ресурсы

 

А вот и скрин загрузки системы при скроле - ГП почти в состоянии мертвеца - почему не нагружается?


 
Aleksey Vyazmikin:

Речь идет о процессоре FX-8350 и видеокарте Radeon HD 7950. У меня нет ощущения, что видеокарта нагружается от MT5.

Однако это так. Видеокарта сильно влияет на скорость отрисовки, так как именно она используется при отрисовке.

В вашем вопросе недостает информации об окружении, в котором происходит скроллинг.

Например:

  • сколько индикаторов, какого они типа -сложность отрисовки совершенно разная
  • сколько программ на чарте
  • реагируют ли программы на эвенты, особенно перемещения, мышь и тд - они могут в своих потоках создать движуху
  • скроллинг до левого края чарта, что вызывает автоматическую подкачку и перестроение данных
  • количество графических объектов в видимой зоне и всего на чарте, включая скрытые

Если же ситуация стабильна, все данные посчитаны и нет наведенных запросов, то сама видеокарта и CPU ответственны за нагрузку.


Так как вы ясно указали "скачок до 100% на ОДНО ЯДРО, а не на все ядра", то это абсолютно нормальная ситуация. Компьютер делает свое дело - он нагружает выбранное ядро и при этом у него CPU usage = 12.5% от всех 8 ядер, а не 100%.

 
Renat Fatkhullin:

1) нужно вот здесь урезать осетра с INT_MAX (2 млрд):

это мы поправим со своей стороны тоже

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

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

4) используйте ООП, он хотя бы даст возможность правильно описывать и контролировать ресурсы

В продолжение этой же темы, посмотрите пожалуйста это сообщение - не ясно, откуда берутся эти тики, когда биржа закрыта - обращаться к брокеру или бирже?

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

MQL5 Свои таймфрэймы

Aleksey Vyazmikin, 2019.09.07 09:50

Да, действительно, есть какие то мусорные тики с нулевыми значениями, при этом они до открытия рынка (рынок открывается в 10:00) образовываются... И во время клиринга ещё бывают.