Обсуждение статьи "Тики из MetaTrader 5 без копирования (Часть 1): Мост к разделяемой памяти на основе интерфейса Arrow C Data Interface"

Опубликована статья Тики из MetaTrader 5 без копирования (Часть 1): Мост к разделяемой памяти на основе интерфейса Arrow C Data Interface:

В этой статье реализуется мост без блокировок для обмена через разделяемую память в MetaTrader 5, который записывает тики в памяти в колоночном формате Apache Arrow через интерфейс Arrow C Data Interface. В ней подробно описаны расположение столбцов, двойная буферизация с использованием seqlock и стратегия формирования пакетов. Вы получите полный исходный код класса писателя, советника для потоковой передачи тиков и скрипта самопроверки, который проверяет корректность работы ещё до подключения читателя на Python.

Если вы когда-нибудь пытались передавать данные тиков из MetaTrader 5 в полноценный аналитический стек на Python в реальном времени, то уже знаете: самое неприятное здесь — не торговая логика, а организация обмена данными. Вы пишете модуль экспорта в CSV, открываете сокет или прибегаете к самодельному решению на основе разделяемой памяти, а затем тратите остаток дня на написание парсера на стороне Python, который преобразует сырые байты обратно в данные, пригодные для pandas. Каждый из этих подходов заставляет платить «налог на преобразование» за каждый тик: сериализация при отправке, десериализация при получении, а где-то между ними — создание отдельного объекта Python для каждого поля каждого тика.

В этой серии из двух частей мы полностью устраняем этот «налог» с помощью интерфейса Arrow C Data Interface — того самого механизма обмена без копирования, который позволяет DuckDB, Polars и pandas передавать данные друг другу без копирования единого байта. MetaTrader 5 записывает тики непосредственно в блок разделяемой памяти, используя колоночную организацию памяти Arrow; Python воссоздаёт настоящие C-структуры ArrowArray/ArrowSchema, указывающие прямо на эту память, и передаёт их в pyarrow, который создаёт RecordBatch без какого-либо цикла разбора данных. В части 1 — этой статье — реализуется сторона MetaTrader 5: колоночная организация памяти, механизм, позволяющий публиковать пакеты без блокировок, советник, передающий тики в реальном времени, и диагностический скрипт, который подтверждает корректность работы стороны MetaTrader 5 независимо от Python, еще до его подключения. В части 2 рассматриваются читатель на Python и тест производительности, который позволяет проверить на реальных числах утверждение о работе без копирования.


Автор: Adedayo David Gbadebo

В чем заключается ожидаемое улучшение по сравнению с «обычными методами»?
Zero-Copy Tick Streaming (Part 1): Bridging MetaTrader 5 to Shared Memory with the Arrow C Data Interface
Zero-Copy Tick Streaming (Part 1): Bridging MetaTrader 5 to Shared Memory with the Arrow C Data Interface
  • 2026.09.08
  • www.mql5.com
This article implements a lock-free shared-memory bridge in MetaTrader 5 that writes ticks in Apache Arrow’s columnar layout via the C Data Interface. It details the column layout, double buffering with a seqlock, and a batching strategy. You get full source for a writer class, a streaming Expert Advisor, and a self-test script that validates correctness before any Python reader is involved.