формат файла *.hst

 

Насколько я знаю, формат hst файлов в mt4 и mt5 различались. После обновления mt4 до последних версий, его формат файла стал такой же как и в mt5. 

Раньше что бы прочитать файл 4 версии, в delphi описывал структуру:

  TRateInfo = packed record                 // 44 байта - бар

ctm : cardinal;                         // текущее время в секундах         // время

open : double;                          // цена открытия                    // open

low : double;                           // минимум                          // low

high : double;                          // максимум                         // high

close : double;                         // закрытие                         // close

tick_volume : double;                   // обьем                            // volume

  end;

 Результатом была строка :

(944006400, 1,0085, 1,0076, 1,0095, 1,009, 94) 

 Теперь результат совсем другой:

(1355439600, 1,05702231308677e+304, -7,18914053781088e-206, 1,05702244376515e+304, -358361,312442158, 6,85934648557025e-312) 

Подскажите как можно прочитать файл *.hst новой версии?
 
savabaka:

Насколько я знаю, формат hst файлов в mt4 и mt5 различались. После обновления mt4 до последних версий, его формат файла стал такой же как и в mt5. 


Разработчики придерживаются такой позиции:

нечего лезть в наши файлы, нечего знать структуры их внутреннего представления и нечего там ковыряться,

потому как руки у большинства из вас всё ещё кривы, напартачите, а потом вопросов кучу задаёте.

 

Терминал предоставляет доступ к своей базе данных по символам не прямой, а через свою обработку:

фактически же предоставляется доступ к их копии в ОЗУ по запросу программы MQL.

 

Ничто не мешает (при желании) пересохранить эти данные в свой собственный формат данных и использовать в своих целях.

Я, например, конвертирую структуру MqlRates в свою собственную:

//---------------------------------------------------------------------
// Структура для хранения исходных исторических данных по символу в файле
//---------------------------------------------------------------------
struct Source
{
  uint  time;
  float open;
  float high;
  float low;
  float close;
        Source(void):time(0),open(0.0),high(0.0),low(0.0),close(0.0){};
  void  Empty(void)
  {
    time=UINT_MAX;
    open=FLT_MAX;
    high=FLT_MAX;
    low=FLT_MAX;
    close=FLT_MAX;
  }
  bool IsEmpty(void)
  {
    if(time==UINT_MAX && open==FLT_MAX && high==FLT_MAX && low==FLT_MAX && close==FLT_MAX) {return(true);}
    return(false);
  }
};

Такие лишние "телодвижения" приходится делать потому, что терминал НЕ ЗАГРУЖАЕТ в ОЗУ данные в количестве, превышающем параметр "Max bars in chart".

 И если мне нужны глубокие (например, по M1) данные для расчётов, а терминал стоит на VPS, где надо экономить ресурсы, то сделать это не получится!

Выход один: загружать их из своих собственных БД. 

 

Не совсем понятно. Сам терминал берет эти же котировки из это го же файла. Его структура соответственно определена изначальна. Возможно она и изменилась (незначительно)

struct MqlRates
  {
   datetime time;         // время начала периода
   double   open;         // цена открытия
   double   high;         // наивысшая цена за период
   double   low;          // наименьшая цена за период
   double   close;        // цена закрытия
   long     tick_volume;  // тиковый объем
   int      spread;       // спред
   long     real_volume;  // биржевой объем

  }; 

Были добавлены 2 параметра по сравнению с 4 версией. Я предполагаю что просто была изменена еще кодировка файла, так как раньше я использовал Ansi и файл читался, а теперь соответственно не может прочитать те же самые данные и выдает непонятные числа. Я просто пытался уже использовать unicode, но пока ничего не получилось.
 
savabaka:

Не совсем понятно. Сам терминал берет эти же котировки из это го же файла. Его структура соответственно определена изначальна. Возможно она и изменилась (незначительно)

struct MqlRates
  {
   datetime time;         // время начала периода
   double   open;         // цена открытия
   double   high;         // наивысшая цена за период
   double   low;          // наименьшая цена за период
   double   close;        // цена закрытия
   long     tick_volume;  // тиковый объем
   int      spread;       // спред
   long     real_volume;  // биржевой объем

  }; 

Были добавлены 2 параметра по сравнению с 4 версией. Я предполагаю что просто была изменена еще кодировка файла, так как раньше я использовал Ansi и файл читался, а теперь соответственно не может прочитать те же самые данные и выдает непонятные числа. Я просто пытался уже использовать unicode, но пока ничего не получилось.

База данных терминала MT5 - это файлы *.hcc и *.hc

Файлы  *.hcc скачиваются с сервера, а файлы *.hc формируются уже самим терминалом из файлов *.hcc

Подробности тут

А структура MqlRates дана пользователям разработчиками для доступа к историческим данным (но не к святыням *.hcc и *.hc). Прямого доступа к файлам  *.hcc и *.hc нет.

В структуру MqlRates копируются данные из ОЗУ, куда они предварительно будут загружены из *.hc, а при отсутствии последних - из *.hcc (с одновременным преобразованием к *.hc)

 
Эту статью я читал. Но там же сказано про файлы *.hcc и *.hc и не слово не сказано про файлы *.hst. А они тоже присутствуют в данном терминале и в них именно храниться история оп таймфреймам.
 
savabaka:
Эту статью я читал. Но там же сказано про файлы *.hcc и *.hc и не слово не сказано про файлы *.hst. А они тоже присутствуют в данном терминале и в них именно храниться история оп таймфреймам.
Не могу сказать точно (не занимался изучением МТ4 и MQL4), но файлы *.hst в МТ4 использовались для построения офф-лайн графиков. В МТ5 такого формата нет. И офф-лайн графиков тоже...
 

Структуру файлов для MT4 лучше искать на форуме MQL4.

https://www.mql5.com/en/forum/149178 

.hst file format . . . Old and New (Jan 2014) - MQL4 forum
  • www.mql5.com
.hst file format . . . Old and New (Jan 2014) - MQL4 forum
Причина обращения: