Читання файлу hst історії котирувань metatrader 4

Файли історії котирувань Metatrader 4 мають розширення .hst і знаходяться в папці даних торгового терміналу, в каталозі history. Вони згруповані в підкаталогах, імена яких збігаються з назвами серверів, наприклад: ForexClub-MT4 Demo Server або Alpari-ECN-Live. Імена файлів починаються з назви торгового інструменту, далі вказується таймфрейм (кількість хвилин), наприклад, для часового таймфрейма: EURUSD60.hst. для денного: GBPUSD1440.hst.

Запис котирувань в ці файли виробляється в відкладеному режимі, останні дані будуть гарантовано скинуті з оперативної пам'яті в файл тільки при закритті терміналу Metatrader. Іншими словами, тут ми будемо розглядати тільки роботу з історичними даними, а котирування в реальному часі доведеться отримувати іншим способом.

Число барів / свічок, що зберігаються в файлах .hst. встановлюється параметром Макс. барів історії у вікні налаштувань терміналу, яке викликається при виконанні команди головного меню Сервіс ‣ Налаштування (вкладка Графіки).

Каталог даних торгового терміналу Metatrader 4 відкривається за допомогою команди головного меню: Файл ‣ Відкрити каталог даних. Для зручності скопіюємо який-небудь файл .hst в папку Temp на диску D.

Для роботи з цим файлом відкриємо його для читання в двійковому режимі:

Формат файлу .hst описаний в розділі Формат файлу історії котирувань HST в Metatrader 4. На самому початку файлу .hst зберігається заголовок довжиною 148 байт для службових даних. Перші 4 байта заголовка містять номер версії формату даних. У старих білдах (до 509) використовувався формат 400. У нових білдах - формат 401. Нам необхідно з'ясувати номер формату, тому що від нього залежить кількість і розмір полів у файлі.

Для читання даних з файлу будемо використовувати метод read (n). де n - число байт, які ми хочемо прочитати. Для розпакування даних будемо використовувати функцію unpack модуля struct. її перший параметр - рядок формату ( "i" для цілих 4-байтних чисел, "L" - для беззнакових 4-байтних цілих, "Q" - для беззнакових 8-байтних цілих, "d" - для речових 8-байтних чисел, символ "<" в начале строки формата указывает, что первым хранится младший байт многобайтного целого числа), второй параметр – исходные данные. Функция unpack всегда возвращает в качестве результата кортеж (tuple), поэтому надо явно указать, что мы хотим записать в переменную не весь кортеж, а его первый элемент (приходится ставить запятую после имени переменной перед знаком присваивания или явно обращаться к нулевому элементу кортежа):

Далі Новомосковський з заголовка файлу .hst рядок копірайту (64 байта); найменування торгового інструменту (тікер, 12 байт); номер таймфрейма (4 байта); кількість десяткових знаків в котируваннях (4 байта); час створення файлу (4 байта); час останньої синхронізації даних (4 байта) і 52 байта невикористаних даних (зарезервованих для майбутніх потреб).

Для нового формату довжина запису 60 байт (додався 4-байтний спред і 8-байтний реальний обсяг, дата і час тепер займають також 8 байт).

Фрагмент програми на мові Python для читання котирувань з файлу .hst старого і нового форматів:

Тут ми обмежилися читанням 5 записів і перервали цикл.

Залишилося оформити читання даних з файлу .hst у вигляді окремої функції, щоб її було зручно використовувати в подальшому. Надаємо це Новомосковсктелю як вправа.