Как избежать "MetaTrader not responding" при обработки больших объёмов данных?

 

Обработка данных проходит на индикаторе OnDeinit().

1. Пока проходит обработка данных платформа зависает (not responding). Поставил счётчик времени в внутри первого уровня цикла, но время прохождения между циклами вижу я только по окончание теста, когда терминал отвисает (Running). Какие решение? Пример кода:

 for(int i=0; i<=N; i++)
  {
   Print(" 1 LEVEL Optim time: ",DoubleToStr((GetTickCount()-Time11)/1000,1)," sek");
   for(int i1=0; i1<=N1; i1++)
     {
      for(int i2=0; i2<=N2; i2++)
        {
         //....

Вывод в журнале:

0    17:07:47.971    2016.06.03 23:59:59  TW49FI_1.0 EURUSD,M1:  1 LEVEL Optim time: 0.0 sek
0    17:07:52.618    2016.06.03 23:59:59  TW49FI_1.0 EURUSD,M1:  1 LEVEL Optim time: 4.0 sek
0    17:07:57.242    2016.06.03 23:59:59  TW49FI_1.0 EURUSD,M1:  1 LEVEL Optim time: 9.0 sek
0    17:08:01.885    2016.06.03 23:59:59  TW49FI_1.0 EURUSD,M1:  1 LEVEL Optim time: 13.0 sek
0    17:08:06.575    2016.06.03 23:59:59  TW49FI_1.0 EURUSD,M1:  1 LEVEL Optim time: 18.0 sek
0    17:08:11.270    2016.06.03 23:59:59  TW49FI_1.0 EURUSD,M1:  1 LEVEL Optim time: 23.0 sek
0    17:08:15.949    2016.06.03 23:59:59  TW49FI_1.0 EURUSD,M1:  1 LEVEL Optim time: 27.0 sek
0    17:08:20.655    2016.06.03 23:59:59  TW49FI_1.0 EURUSD,M1:  1 LEVEL Optim time: 32.0 sek
0    17:08:25.375    2016.06.03 23:59:59  TW49FI_1.0 EURUSD,M1:  1 LEVEL Optim time: 37.0 sek
0    17:08:30.117    2016.06.03 23:59:59  TW49FI_1.0 EURUSD,M1:  1 LEVEL Optim time: 42.0 sek
0    17:08:34.851    2016.06.03 23:59:59  TW49FI_1.0 EURUSD,M1:  1 LEVEL Optim time: 46.0 sek 


2. Почему CPU и RAM так мало нагружаются при обработки таких больших объёмов данных?

 

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

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

fxsaber, 2017.11.29 12:41

Наверное, лучший способ получить данные от асинхронных Copy-функций (CopyRates, CopyTicks и т.д.) - через EventChartCustom.

Особенно актуально для индикаторов.

Это же касается и ресурсоемких задач. Как только отработали заданное количество времени, прерываете (запоминая текущие значения) и вызываете EventChartCustom. Затем в OnChartEvent ловите свое кастомное событие и продолжаете с места разрыва.И так до тех пор, пока не будет все посчитано.

OnTimer в данном случае возможен, но явно избыточен.

 
fxsaber:

Это же касается и ресурсоемких задач. Как только отработали заданное количество времени, прерываете (запоминая текущие значения) и вызываете EventChartCustom. Затем в OnChartEvent ловите свое кастомное событие и продолжаете с места разрыва.И так до тех пор, пока не будет все посчитано.

OnTimer в данном случае возможен, но явно избыточен.

EventChartCustom в моем варианте не подойдёт,как я уже писал, вся обработка данных начинается только на OnDeinit() когда данные собраны и график я закрываю. Понимаю что надо как-то притормозить каждый цикл, но как это сделать пока не понятно.
Что там по второму вопросу, почему так мало нагружаются CPU и RAM?

 
Nauris Zukas:

EventChartCustom в моем варианте не подойдёт,как я уже писал, вся обработка данных начинается только на OnDeinit() когда данные собраны и график я закрываю. Понимаю что надо как-то притормозить каждый цикл, но как это сделать пока не понятно.

В OnDeinit должен срабатывать таймаут в индикаторах. Если этого не происходит, в СД. Т.е в OnDeinit ничего долгого в индикаторах не посчитать из-за архитектурных особенностей.

Что там по второму вопросу, почему так мало нагружаются CPU и RAM?

Загружено полностью одно ядро CPU, т.к. расчеты не распараллеливаются. 100% - это все ядра загружены. RAM зависит от количества данных.

 
fxsaber:

В OnDeinit должен срабатывать таймаут в индикаторах. Если этого не происходит, в СД. Т.е в OnDeinit ничего долгого в индикаторах не посчитать из-за архитектурных особенностей.

Загружено полностью одно ядро CPU, т.к. расчеты не распараллеливаются. 100% - это все ядра загружены. RAM зависит от количества данных.

Ясно, спасибо. Тогда буду переносить обработку на OnCalculate() и на последних свечах начать обработку. Кстати, может есть какой-то способ узнать последнюю свечу графика тестирования?

 
Nauris Zukas:

есть какой-то способ узнать последнюю свечу графика тестирования?

Вроде, нет такой возможности.

 
fxsaber:

Вроде, нет такой возможности.

Ясно, спасибо.

 
Nauris Zukas:

Ясно, спасибо. Тогда буду переносить обработку на OnCalculate() и на последних свечах начать обработку. Кстати, может есть какой-то способ узнать последнюю свечу графика тестирования?


Используйте OnTester()

 
Ihor Herasko:

Используйте OnTester()

Индикатор.

 
fxsaber:

Индикатор.


Вызвать из советника.

 
Ihor Herasko:

Вызвать из советника.

Тогда это не будет иметь отношения к ветке.

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