Новая версия платформы MetaTrader 5 build 5120: улучшения и исправления - страница 5

 
Evgeny Vlasov #:
Добрый день. После обновления до 5120 перестала работать оптимизация, раньше история записывалась на диск (8 Тб), распределяясь по агентам и после записи запускалось многопоточная оптимизация, а сейчас происходит 100%-ое заполнение оперативки и файла подкачки и выходит запись - не хватает памяти. При этом оперативки 128 Гб, а файл подкачки еще на 250 Гб. Агент тестирования при настройке сдачи в аренду мощностей перестал видеть ядра (потоки) их всего 72, а показывает то 4 то 32... Я даже систему переустановил, но не помогло. Работает все кроме оптимизации.

С таким размером памяти и количеством ядер этого размера подкачки может реально не хватать. Да и на каждое ядро для тестирования рекомендуется 2 Гб памяти.

Надо попробовать активировать гораздо бОльшую подкачку и начать с меньшего количества включенных ядер, постепенно увеличивая. А включив все ядра, уменьшать размер подкачки.

У меня бывало, требовалось в 4x подкачки к оперативке.

 
Edgar Akhmadeev #:

С таким размером памяти и количеством ядер этого размера подкачки может реально не хватать. Да и на каждое ядро для тестирования рекомендуется 2 Гб памяти.

Надо попробовать активировать гораздо бОльшую подкачку и начать с меньшего количества включенных ядер, постепенно увеличивая. А включив все ядра, уменьшать размер подкачки.

У меня бывало, требовалось в 4x подкачки к оперативке.

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

 
Evgeny Vlasov #:
До обновления всего хватало

Всегда что-то происходит впервые. От релиза к релизу происходят изменения, которые могут перейти установленную вами планку. Стоит попытаться нащупать эту планку и сделать запас. Это лучше, чем ждать решения от разработчиков.

 
Evgeny Vlasov #:
Добрый день. После обновления до 5120 перестала работать оптимизация, раньше история записывалась на диск (8 Тб), распределяясь по агентам и после записи запускалось многопоточная оптимизация, а сейчас происходит 100%-ое заполнение оперативки и файла подкачки и выходит запись - не хватает памяти. При этом оперативки 128 Гб, а файл подкачки еще на 250 Гб. Агент тестирования при настройке сдачи в аренду мощностей перестал видеть ядра (потоки) их всего 72, а показывает то 4 то 32... Я даже систему переустановил, но не помогло. Работает все кроме оптимизации.

Что-то они поменяли. Вот в английской ветке тоже жалуются (автоперевод):

Forum on trading, automated trading systems and testing trading strategies

MetaTrader 5 Platform update build 5120: Improvements and fixes

Brendan Burwood, 2025.06.18 00:28

Кто-то забыл выключить переключатель DEBUG при компиляции последней версии?!?!

Тестер стратегий в этой новой сборке работает всего на ТРЕТЬ скорости предыдущей версии!!

Недавно мне удалось выявить одну из основных причин, по которой мой советник по силе валюты работал медленно на старой версии во время оптимизации — использование полосы пропускания ЦП и оперативной памяти.

После небольшой оптимизации мне удалось запустить 6 агентов во время тестирования, используя менее 30 ГБ/с пропускной способности ЦП-ОЗУ, возвращая результат (за 3-летний период) примерно каждые 18 СЕКУНД.


Я только что начал оптимизацию этой новой версии и КРАЙНЕ разочарован!!


Используя 6 агентов, как и прежде, за тот же 3-летний период, потребовалось почти ПОЛЧАСА, чтобы вернуть первый результат от каждого из них! Максимальная пропускная способность CPU-RAM составила ~37 ГБ/с за все время

Мне пришлось вернуться всего к ДВУМ агентам, чтобы увидеть, как использование полосы пропускания упало ниже максимума! Сейчас оно находится в диапазоне 25-30 ГБ/с и, по оценкам, потребуются сотни часов (несколько НЕДЕЛЬ!!), чтобы сделать то, что занимало менее 80 часов в предыдущей версии!

Я лишь внес незначительные изменения в несколько строк кода для этой версии, скомпилированного в предыдущей версии до моей перезагрузки/обновления несколько часов назад, но ничего существенно не изменило потребности или использование полосы пропускания оперативной памяти программой.


Итог: что-то изменилось в тестере стратегий и ЗНАЧИТЕЛЬНО увеличило использование пропускной способности ЦП и ОЗУ, что ЗНАЧИТЕЛЬНО замедляет тестирование до такой степени, что оно становится практически непригодным для советника, основанного на силе валют, который рассматривает 28 валютных пар!

Пожалуйста, разберитесь с этой крупной регрессией быстро! Это отнимает много времени, вероятно, не только у меня!


 
Edgar Akhmadeev #:

Всегда что-то происходит впервые. От релиза к релизу происходят изменения, которые могут перейти установленную вами планку. Стоит попытаться нащупать эту планку и сделать запас. Это лучше, чем ждать решения от разработчиков.

))) Это не техническая помощь, это воспитательный момент, за таким содействием я не обращался. А если серьезно, то тестирование работало 2 года и вопрос не в нехватке памяти, а в глюке терминала и фиксить нужно программу, а не подстраиваться под ошибки разработчиков. Тем более в релизе версии ничего не сказано о новых требованиях к памяти.

 
Evgeny Vlasov #:
Это не техническая помощь, это воспитательный момент
Evgeny Vlasov #:
не подстраиваться под ошибки разработчиков

Можно сидеть и ждать, когда разработчики пофиксят. Но лучше ждать, но не сидеть, а подставлять костыли, чем мы годами занимаемся. Потом они отвалятся сами - помните "Беги, Форрест!"

 
MetaQuotes #:

Проверьте в 5125, пожалуйста.

Уже исправили.

Проверил.

template <typename T>
bool Check( T &Array[], const T Value )
{
  ResetLastError();
  const int Size = ArrayInitialize(Array, Value);
  
  bool Res = !_LastError && (Size == ArraySize(Array));
  
  for (uint i = Size; Res && (bool)i--;)
    Res = (Array[i] == Value);
    
  return(Res);
}

template <typename T>
bool Check( T &Array[] )
{
  return(Check(Array, (T)1) && Check(Array, (T)2));
}

template <typename T>
bool Check()
{
  T Array[];
  T Array2[100];
  
  ArrayResize(Array, 1000);
  const bool Res = Check(Array) && Check(Array2);
  
  ArrayResize(Array, 2000);  
  
  return(Res && Check(Array));
}

#define PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{
  PRINT(Check<char>());
  PRINT(Check<short>());
  PRINT(Check<int>());
  PRINT(Check<long>());
  PRINT(Check<float>());
  PRINT(Check<double>());

  PRINT(Check<uchar>());
  PRINT(Check<ushort>());
  PRINT(Check<uint>());
  PRINT(Check<ulong>());
  PRINT(Check<datetime>());
  PRINT(Check<color>());

  PRINT(Check<ENUM_DEAL_TYPE>());  
}

Правильно отрабатывает. Спасибо.

 
Edgar Akhmadeev #:

С таким размером памяти и количеством ядер этого размера подкачки может реально не хватать. Да и на каждое ядро для тестирования рекомендуется 2 Гб памяти.

Надо попробовать активировать гораздо бОльшую подкачку и начать с меньшего количества включенных ядер, постепенно увеличивая. А включив все ядра, уменьшать размер подкачки.

У меня бывало, требовалось в 4x подкачки к оперативке.

Видимо проблема с перерасходом памяти тут:
https://www.mql5.com/ru/forum/487790/page30#comment_56921440

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

Похоже, что сделали многопоток для тестера, чтобы ускорить, расчет одним потоком, но забыли про оптимизацию. В основном ведь ей занимаются, а не 1 проходом тестера.
Вот каждый агент и грузил проц под 100% до беты 5104.
Предполагаю, что и прочие ресурсы стали потреблять больше, для каждого прохода тестера (в том числе и память, которой стало не хватать, и котировки не скидывает на диск - это тоже быстро).

"Хотели как лучше, а получилось как всегда"
Новая версия платформы MetaTrader 5 build 5100: Переход на Git и хаб разработчиков MQL5 Algo Forge, темная тема и улучшения интерфейса - Попробуйте, пожалуйста.
Новая версия платформы MetaTrader 5 build 5100: Переход на Git и хаб разработчиков MQL5 Algo Forge, темная тема и улучшения интерфейса - Попробуйте, пожалуйста.
  • 2025.06.10
  • Ihor Herasko
  • www.mql5.com
Вместо переключателей вдруг появились метки выбора. 10 08 в указанное место массива по смещению и количеству элементов массива. Еще разрешили перегрузку по знаку int uint для ArraySwap. Мы еще разрешим ряд безопасных перегрузок к следующему релизу в пятницу
 
MetaQuotes #:

Проверьте в 5125, пожалуйста.

Уже исправили.

ArrayFree правильно работает? Билд 5125, код в эксперте:

int OnInit()
  {
        array();
  }
//--------------------------------------------------------------------------------------------------------------------------------------+
void array()
  {
        double values[]; int k = 100;
        ArrayResize(values,k);
        Print("before for values[k - 1] = ",values[k - 1]);
//---
        for(char j = 0; j < k; j++) values[j] = 2.0 * (j + 1);
//---
        Print("after  for values[k - 1] = ",values[k - 1]);
        ArrayFree(values);
  }
//--------------------------------------------------------------------------------------------------------------------------------------+

При запуске терминала всё верно:

2025.06.18 21:57:22.873 Heiken Ashi Scan (GBPUSD,H4)    before for values[k - 1] = 0.0
2025.06.18 21:57:22.873 Heiken Ashi Scan (GBPUSD,H4)    after  for values[k - 1] = 200.0

При смене ТФ значение на максимальном индексе до for сохранилось:

2025.06.18 21:57:50.136 Heiken Ashi Scan (GBPUSD,H6)    before for values[k - 1] = 200.0
2025.06.18 21:57:50.136 Heiken Ashi Scan (GBPUSD,H6)    after  for values[k - 1] = 200.0

Даже после последующей перекомпиляции эксперта значение на максимальном индексе до for сохраняется:
2025.06.18 21:59:24.361 Heiken Ashi Scan (GBPUSD,H8)    before for values[k - 1] = 200.0
2025.06.18 21:59:24.361 Heiken Ashi Scan (GBPUSD,H8)    after  for values[k - 1] = 200.0

При смене ТФ может быть 0 и после сразу 200 снова:

2025.06.18 22:00:13.426 Heiken Ashi Scan (GBPUSD,H8)    before for values[k - 1] = 0.0
2025.06.18 22:00:13.426 Heiken Ashi Scan (GBPUSD,H8)    after  for values[k - 1] = 200.0
2025.06.18 22:00:14.113 Heiken Ashi Scan (GBPUSD,H12)   before for values[k - 1] = 200.0
2025.06.18 22:00:14.113 Heiken Ashi Scan (GBPUSD,H12)   after  for values[k - 1] = 200.0

Может появиться непонятно какое значение (график GBPUSD, похоже на котировку):

2025.06.18 22:01:23.017 Heiken Ashi Scan (GBPUSD,M4)    before for values[k - 1] = 1.3547799999999999
2025.06.18 22:01:23.017 Heiken Ashi Scan (GBPUSD,M4)    after  for values[k - 1] = 200.0

Первые 2 вывода смена ТФ, а после перекомпиляция эксперта:

2025.06.18 22:03:00.663 Heiken Ashi Scan (GBPUSD,H2)    before for values[k - 1] = 0.0
2025.06.18 22:03:00.663 Heiken Ashi Scan (GBPUSD,H2)    after  for values[k - 1] = 200.0
2025.06.18 22:03:01.133 Heiken Ashi Scan (GBPUSD,H3)    before for values[k - 1] = 200.0
2025.06.18 22:03:01.133 Heiken Ashi Scan (GBPUSD,H3)    after  for values[k - 1] = 200.0
2025.06.18 22:03:06.853 Heiken Ashi Scan (GBPUSD,H3)    before for values[k - 1] = 1.3547799999999999
2025.06.18 22:03:06.853 Heiken Ashi Scan (GBPUSD,H3)    after  for values[k - 1] = 200.0

Что нет так? Почему не 0 значение всегда до запуска цикла for?

 

Просьба быть ближе к воспроизводимости и прикладывать детали.

Нельзя же сложные процессы общими словами описывать.