Обсуждение статьи "Анализ CSV-данных (Часть 1): Механизм экспорта CSV при многоядерной оптимизации в MQL5"

 

Опубликована статья Анализ CSV-данных (Часть 1): Механизм экспорта CSV при многоядерной оптимизации в MQL5:

При многоядерной оптимизации в MetaTrader 5 результаты могут незаметно теряться, когда параллельные агенты одновременно обращаются к одному CSV-файлу. Повторно используемый механизм экспорта MQL5 применяет итерационную спин-блокировку, чтобы надёжно открыть файл и добавлять строки без потерь. Он сохраняет пользовательские метрики, включая коэффициент Сортино, среднюю продолжительность сделки и показатели качества сигналов — запаздывание и частота ложных переворотов (whipsaws) — в сводном CSV-файле для последующей аналитической обработки.

Это центральная техническая проблема системы, и её необходимо понять до рассмотрения решения.

Когда Тестер стратегий MetaTrader 5 выполняет оптимизацию с включённым параметром «Использовать многоядерную обработку», отдельные комбинации параметров распределяются между несколькими параллельно работающими агентами. Каждый агент запускает независимый экземпляр советника с определённым набором параметров. По завершении каждого прогона для этого экземпляра вызывается OnDeinit().

Если оптимизация охватывает несколько типов фильтров или диапазонов параметров, несколько агентов могут почти одновременно дойти до вызова OnDeinit(). Когда они пытаются открыть один и тот же CSV-файл для записи, происходит следующее:

  1. Агент A вызывает FileOpen() для файла MultiFilter_InSample_EURUSD_H1.csv. Операционная система предоставляет ему блокировку на запись, и дескриптор файла становится действительным.
  2. Через несколько микросекунд агент B вызывает FileOpen() для того же файла. Поскольку агент A удерживает блокировку на запись, агент B получает INVALID_HANDLE. Функция GetLastError() обычно возвращает код ERR_CANNOT_OPEN_FILE (5004).
  3. Вызов экспорта у агента B завершается без явного сообщения об ошибке. Вся строка результатов, соответствующая полному проходу оптимизации, безвозвратно теряется.

Рис. 1. Конфликт параллельного доступа при многоядерной оптимизации.


Автор: Ushana Kevin Iorkumbul

 
Вам совершенно не нужны такие вещи, как «Parallel File-Lock» — просто отправляйте данные с агентов в виде фреймов и сохраняйте их в общий CSV-файл из одного места — терминала с графиком, на котором запущен ваш советник в режиме фреймов.