Mt4 , .hst файлы и offline графики криптовалют

 

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

в частности во первых вопрос - неужели в имени символа реально ограничение 12 байт или символов? в итоге задуманное имя получается обрезанным а то и может не поместиться

или я что то не понимаю ? или придется как то сокращать имя

 
Yurij Izyumov:

в частности во первых вопрос - неужели в имени символа реально ограничение 12 байт или символов?

да, ограничение в 12 символов, заголовок файла .hst в MQL4:

//---- write history file header
   c_copyright="(C)opyright 2003, MetaQuotes Software Corp.";
   FileWriteInteger(ExtHandle, version, LONG_VALUE);
   FileWriteString(ExtHandle, c_copyright, 64);
   FileWriteString(ExtHandle, c_symbol, 12);
   FileWriteInteger(ExtHandle, i_period, LONG_VALUE);
   FileWriteInteger(ExtHandle, i_digits, LONG_VALUE);
   FileWriteInteger(ExtHandle, 0, LONG_VALUE);       //timesign
   FileWriteInteger(ExtHandle, 0, LONG_VALUE);       //last_sync
   FileWriteArray(ExtHandle, i_unused, 0, 13);
//---- write history file

https://docs.mql4.com/ru/files/filewritestring

uint  FileWriteString(
   int           file_handle,    // handle файла
   const string  text_string,    // записываемая строка
   int           length=0        // количество символов
   );

Параметры

file_handle  [in]  Файловый описатель, возвращаемый функцией FileOpen().

text_string  [in]  Строка.

length=0   [in]  Количество символов, которые нужно записать. Параметр необходим для записи строки в файл типа BIN. Если размер не указан, то записывается вся строка без завершающего 0. Если указан размер меньший, чем длина строки, то записывается часть строки без завершающего 0. Если указан размер больший, чем длина строки, то строка дописывается соответствующим количеством нулей. Для файлов типа CSV и TXT этот параметр игнорируется и строка записывается полностью.

FileWriteString - Файловые операции - Справочник MQL4
FileWriteString - Файловые операции - Справочник MQL4
  • docs.mql4.com
Записывает в файл типа BIN, CSV или TXT значение параметра типа string с текущего положения файлового указателя. При записи в файл типа CSV или TXT, если в строке присутствует символ '\n' (LF) без предшествующего символа '\r' (CR), то перед символом '\n' дописывается отсутствующий символ '\r'. [in]  Количество символов, которые нужно записать...
 
Igor Makanu:

да, ограничение в 12 символов, заголовок файла .hst в MQL4:

https://docs.mql4.com/ru/files/filewritestring

Параметры

file_handle  [in]  Файловый описатель, возвращаемый функцией FileOpen().

text_string  [in]  Строка.

length=0   [in]  Количество символов, которые нужно записать. Параметр необходим для записи строки в файл типа BIN. Если размер не указан, то записывается вся строка без завершающего 0. Если указан размер меньший, чем длина строки, то записывается часть строки без завершающего 0. Если указан размер больший, чем длина строки, то строка дописывается соответствующим количеством нулей. Для файлов типа CSV и TXT этот параметр игнорируется и строка записывается полностью.

как используется FileWriteString я понял, вопрос был нельзя ли к примеру просто поставить в 

FileWriteString(ExtHandle, c_symbol, 24);

просто и тем самым удлинить заголовок, я пробовал, но он получается обрезается всё равно до 12 символов, видимо незя, но в доке вроде не написано ничего 

 
Yurij Izyumov:

как используется FileWriteString я понял, вопрос был нельзя ли к примеру просто поставить в 

просто и тем самым удлинить заголовок, я пробовал, но он получается обрезается всё равно до 12 символов, видимо незя, но в доке вроде не написано ничего 

вопрос был вопросом, исходников не наблюдается в топике. модифицируйте стандартный скрипт PeriodConverter или покажите Ваш код и  покажите, как Вы сумели сделать имя инструмента более 12  символов  и терминал сам "обрезал" до 12 символов

если заголовок файла ( file header ) имеет не правильный формат, МТ4 вообще не дает открыть такой график - такого графика не будет в окне: Файл - Открыть автономно

 
Igor Makanu:

вопрос был вопросом, исходников не наблюдается в топике. модифицируйте стандартный скрипт PeriodConverter или покажите Ваш код и  покажите, как Вы сумели сделать имя инструмента более 12  символов  и терминал сам "обрезал" до 12 символов

если заголовок файла ( file header ) имеет не правильный формат, МТ4 вообще не дает открыть такой график - такого графика не будет в окне: Файл - Открыть автономно

к примеру вот так . исходник приложил

string   c_symbol=Symbol()+"_DlinnyeBukvy";
   int      i_period=Period()*InpPeriodMultiplier;
   int      i_digits=Digits;
.......
   FileWriteString(ExtHandle,c_copyright,64);
   FileWriteString(ExtHandle,c_symbol,24);
   FileWriteInteger(ExtHandle,i_period,LONG_VALUE);

и получаю в итоге что на скриншоте


Файлы:
 
Yurij Izyumov:

к примеру вот так . исходник приложил

и получаю в итоге что на скриншоте


ну и правильно терминал Вам написал, ту просто нужно понимать, что обычно header файла делают "жестким" и тогда программы которые читают заголовок файла действуют по определенному алгоритму не "парясь" в правильности что там в заголовке правильно лежит или нет

т.е. вот Вы взяли увеличили строку с именем инструмента до 6+13 = 19 символов (на евро проверял) :

string   c_symbol=Symbol()+"_DlinnyeBukvy";

и потом увеличили в заголовке файла длину поля до 24-х знаков:

FileWriteString(ExtHandle,c_symbol,24);

и терминал пропустил эту конструкцию, НО Вы теперь в следующем поле сдвинули всю информацию на 12 байт, но терминал же об этом не знает? header же здесь "жесткий", а не динамический? (динамический имею в виду,, что бывают конструкции заголовка, где будут данные при чтении корректироваться) 

т.е. вот конкретно что имеем В Вашем примере:

// пока без изменений
FileWriteInteger(ExtHandle, version, LONG_VALUE);
   FileWriteString(ExtHandle, c_copyright, 64);
// было 12 байт, у Вас 24 теперь!
   FileWriteString(ExtHandle, c_symbol, 12);
// вот тут терминал будет читать следующие 12 байт, и прочтет их как тип long
// и поэтому Вы испортили период ТФ, это на скрине у Вас видно
   FileWriteInteger(ExtHandle, i_period, LONG_VALUE);
// вот тут опять все смещено, испортили _Digits
   FileWriteInteger(ExtHandle, i_digits, LONG_VALUE);
   FileWriteInteger(ExtHandle, 0, LONG_VALUE);       //timesign
// тут испортили время синхронизации
   FileWriteInteger(ExtHandle, 0, LONG_VALUE);       //last_sync
   FileWriteArray(ExtHandle, i_unused, 0, 13);

т.е. дополнительным смещением Вы заставили терминал читать некорректную информацию, но он думает, что раз ошибок нет, значит так задумано, и все что не прочитал терминал ушло в последние 13 байт, которые не используются в header

 
Igor Makanu:

ну и правильно терминал Вам написал, ту просто нужно понимать, что обычно header файла делают "жестким" и тогда программы которые читают заголовок файла действуют по определенному алгоритму не "парясь" в правильности что там в заголовке правильно лежит или нет

т.е. вот Вы взяли увеличили строку с именем инструмента до 6+13 = 19 символов (на евро проверял) :

string   c_symbol=Symbol()+"_DlinnyeBukvy";

и потом увеличили в заголовке файла длину поля до 24-х знаков:

FileWriteString(ExtHandle,c_symbol,24);

и терминал пропустил эту конструкцию, НО Вы теперь в следующем поле сдвинули всю информацию на 12 байт, но терминал же об этом не знает? header же здесь "жесткий", а не динамический? (динамический имею в виду,, что бывают конструкции заголовка, где будут данные при чтении корректироваться) 

т.е. вот конкретно что имеем В Вашем примере:

т.е. дополнительным смещением Вы заставили терминал читать некорректную информацию, но он думает, что раз ошибок нет, значит так задумано, и все что не прочитал терминал ушло в последние 13 байт, которые не используются в header

то есть кратко говоря - имя символа больше 12 знаков не может быть - верно ? 

 
Yurij Izyumov:

то есть кратко говоря - имя символа больше 12 знаков не может быть - верно ? 

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

 
Igor Makanu:

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

Благодарю !

Причина обращения: