В высокочастотных индикаторах MQL5, создающих объекты при каждом тике, накапливаются накладные расходы на выделение памяти и возникает джиттер времени выполнения в OnCalculate(). В этой статье создается обобщенный пул объектов на основе шаблона класса с использованием массива индексов списка свободных элементов, обеспечивающего выполнение операций Acquire() и Release() за время O(1). Архитектура предусматривает защиту от повторного возврата объекта в пул, строгое разделение состояния полезных данных и метаданных пула в методе Reset(), а также список свободных элементов фиксированной вместимости без резервного выделения памяти в куче. Пользовательский индикатор сравнивает два варианта обработки и с помощью GetMicrosecondCount() измеряет разницу накладных расходов на тик.
Каждый вызов оператора new в MQL5 запрашивает непрерывный блок памяти из управляемой кучи терминала. Аллокатор ищет свободный блок достаточного размера, помечает его как занятый и возвращает указатель. Оператор delete, напротив, снова помечает этот блок как доступный. По отдельности эти операции выполняются быстро. Однако непрерывное выполнение операций с высокой частотой приводит к возникновению накладных расходов, которые накапливаются с течением времени.
Основные временные затраты при многократном выполнении new/delete в OnCalculate() связаны не с уплотнением кучи (подробности устройства внутреннего аллокатора терминала MQL5 не документированы публично на таком уровне), а с непосредственными накладными расходами на каждый вызов выделения и освобождения памяти. К ним относятся вызовы конструкторов и деструкторов, служебные операции аллокатора, инициализация памяти и джиттер времени выполнения, возникающие на часто выполняемом участке кода (горячем пути). Даже если отдельные операции выделения памяти в среднем выполняются быстро, непредсказуемость временных затрат на них важна в торговле, где стабильность задержки зачастую ценится выше, чем средняя пропускная способность сама по себе.
Пользовательские индикаторы, выполняющие OnCalculate() при каждом тике, увеличивают эти накладные расходы. Во время важных новостных событий частота поступления тиков может превышать 100 в секунду. При такой частоте аллокатор выполняет две операции с кучей на каждый тик, сопровождаемые созданием и уничтожением объекта. Эта нагрузка приводит к постепенному увеличению разброса времени выполнения в течение торговой сессии.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Опубликована статья Обобщенный пул объектов в MQL5: Снижение накладных расходов на выделение памяти в высокочастотных индикаторах:
Каждый вызов оператора new в MQL5 запрашивает непрерывный блок памяти из управляемой кучи терминала. Аллокатор ищет свободный блок достаточного размера, помечает его как занятый и возвращает указатель. Оператор delete, напротив, снова помечает этот блок как доступный. По отдельности эти операции выполняются быстро. Однако непрерывное выполнение операций с высокой частотой приводит к возникновению накладных расходов, которые накапливаются с течением времени.
Основные временные затраты при многократном выполнении new/delete в OnCalculate() связаны не с уплотнением кучи (подробности устройства внутреннего аллокатора терминала MQL5 не документированы публично на таком уровне), а с непосредственными накладными расходами на каждый вызов выделения и освобождения памяти. К ним относятся вызовы конструкторов и деструкторов, служебные операции аллокатора, инициализация памяти и джиттер времени выполнения, возникающие на часто выполняемом участке кода (горячем пути). Даже если отдельные операции выделения памяти в среднем выполняются быстро, непредсказуемость временных затрат на них важна в торговле, где стабильность задержки зачастую ценится выше, чем средняя пропускная способность сама по себе.
Пользовательские индикаторы, выполняющие OnCalculate() при каждом тике, увеличивают эти накладные расходы. Во время важных новостных событий частота поступления тиков может превышать 100 в секунду. При такой частоте аллокатор выполняет две операции с кучей на каждый тик, сопровождаемые созданием и уничтожением объекта. Эта нагрузка приводит к постепенному увеличению разброса времени выполнения в течение торговой сессии.
Автор: Ushana Kevin Iorkumbul