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

 
fxsaber #:

У меня никакого влияния от количества блоков.


Таким образом создал блоки.


Так их читаю.

Решил все таки установить ImDisk, дал ему 36 Гб памяти и протестировал на 36 агентах с 1 до 36 блоков памяти, (при 36 агентах каждому агенту по 1 блоку).
1 блок памяти
2 блока памяти
3 блока памяти
4 блока памяти
9 блоков памяти
18 блоков памяти
36 блоков памяти
Agents = 36
Performance = 5.5 Ticks(millions)/sec.
Total time in sek: 76
Agents = 36
Performance = 15.8 Ticks(millions)/sec.
Total time in sek: 28
Agents = 36
Performance = 20.9 Ticks(millions)/sec.
Total time in sek: 16
Agents = 36
Performance = 13.7 Ticks(millions)/sec.
Total time in sek: 24
Agents = 36
Performance = 9.2 Ticks(millions)/sec.
Total time in sek: 45
Agents = 36
Performance = 5.8 Ticks(millions)/sec.
Total time in sek: 60
Agents = 36
Performance = 4.8 Ticks(millions)/sec.
Total time in sek: 65
Agents = 72
Performance = 1.9 Ticks(millions)/sec.
Total time in sek: 87
Agents = 72
Performance = 11.4 Ticks(millions)/sec.
Total time in sek: 22
Agents = 72
Performance = 11.2 Ticks(millions)/sec.
Total time in sek: 19
Agents = 72
Performance = 6.3 Ticks(millions)/sec.
Total time in sek: 28
Agents = 72
Performance = 3.6 Ticks(millions)/sec.
Total time in sek: 47
Agents = 72
Performance = 5.3 Ticks(millions)/sec.
Total time in sek: 32
Agents = 72
Performance = 3.4 Ticks(millions)/sec.
Total time in sek: 47

У меня получилось что 3 блока лучше всего по общему времени работы 16 сек и по Performance. Экономия памяти 36/3=12 раз и быстрее в 4 раза.
А 1 блок памяти на всех соизмерим с вариантом, если у каждого агента свой блок памяти. Возможно это связано с тем, что у меня 2 процессора и 2 канала в памяти.

Тестировал с советником из вашего последнего поста. Только подправил счетчик агентов:   return(FrameAdd(StringSubstr(TerminalInfoString(TERMINAL_DATA_PATH), -3), Amount, Value, Data));
и добавил счетчик общего времени. Эксперт приложил.
Скрипт на 36 блоков памяти:

void OnStart(){
  MqlTick Ticks[];
  if (CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, D'2025.01.01' * 1000) > 0)
    for (int i = 0; i < 36; i++){FileSave("RAMDrive\\Ticks" + (string)i + ".bin", Ticks, FILE_COMMON);}
}
Обновление:
провел тест для 72 агентов - он оказался медленнее 36 агентов на 20%. Т.е. то, что лучше проводить тесты на физических ядрах снова подтвердилось.
Файлы:
test2.mq5  6 kb
 
Forester #:
А 1 блок памяти на всех соизмерим с вариантом, если у каждого агента свой блок памяти.

Похоже, это просто особенности RAMDrive и нюансы работы с файлами. Нужен другой механизм.

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

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

fxsaber, 2025.06.25 13:32

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

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

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

 
Forester #:

Только подправил счетчик агентов:   return(FrameAdd(StringSubstr(TerminalInfoString(TERMINAL_DATA_PATH), -3), Amount, Value, Data));

Я специально оставил вариант с передачей полного пути, т.к. это более универсально - вычислительные фермы/облако будет учитываться.
 
Forester #:

Путь обрезается

Посмотрел формат фрейма.

struct FRAME
{
  ulong Pass;
  long ID;
  short String[64];
  double Value;
  int SizeOfArray;
  long Tmp[2];
Да, длинные строки обрезаются. В Документации об этом ни слова.
Frames
Frames
  • www.mql5.com
Чтение фреймов из mqd-файлов результатов Оптимизации.
 
fxsaber #:

У меня такой путь не обрезается.

У меня так
    Print(Name) ;
C:\Users\server\AppData\Roaming\MetaQuotes\Tester\D0E8209F77C8C

Видимо надо склеивать номер и сетевой путь
 
Forester #:
Видино надо склеивать номер и сетевой путь

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

 
fxsaber #:

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

Похоже, достаточно использовать msvcrt::memcpy для единократной записи и далее множества чтений. С указателями только нужно разобраться.

 
fxsaber #:
Попробовал незамысловатую реализацию такого единого хранения тиков для всех локальных агентов.

отличный

 

а что с использованием оперативной памяти в агентах тестирования?

Раньше хватало 2гб на ядро, теперь каждое ядро жрет около 4гб. это норма? 

 

Ребята, вы одно чините, два ломаете. Пожалуйста, возьмитесь за ум, почините софт. Невозможно работать, из-за ваших "нововведений" мы не можем работать!


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


И главное что вы сделали - убрали возможность работы старых версий тестера. на версии 4885 еще как-то работало, на версии 5ххх не работает ничего!!