Когда пишутся 5 тысяч бар, помогает прочитать/пропустить первые 8 байт. Дальше правильно считывается массив структуры.
Если 200 с копейками баров, то пропуск первых 8-ми байт приводит к тому, что на чтение последнего элемента последнего члена массива не хватает байт в файле. Если пропустить первые 4 байта - то криво читаются бары.
В общем, в начале что-то записано размером в 8 байт, если массив баров от 200 с копейками до 5000. И больше 4, но меньше 8 байт, если массив 200 с лишним баров.
Пишется что-то плавающей длины.
Что за функция перед вызовом FileWriteArray?
pipewrite(IntegerToString(size));
Что за функция перед вызовом FileWriteArray?
Отправляет размер массива. И в проге считывается до чтения массива. Отправляется в виде string. Перед ним передается длина этой string целым числом. В проге считывается соответственно. Хвостов не должно оставаться - это стандартный способ обмена, всегда работает без проблем.
В общем, при размере массива из 256 баров (по 36 байт каждый), перед массивом пишется 7 байт чего-то... Когда больше - 8.
256 - это у меня так попалось. Четкой границы перехода с 8 на 7 байт не знаю.
В доках нет ни слова о структуре файла после записи, значит нет никаких гарантий. Может размер, может признак таймсерии, а может завтра ещё что-нибудь добавят. Я бы формировал файл самостоятельно через FileWriteStruct.
А FileWriteStruct ниче лишнего не пишет?
Отправляет размер массива. И в проге считывается до чтения массива. Отправляется в виде string. Перед ним передается длина этой string целым числом. В проге считывается соответственно. Хвостов не должно оставаться - это стандартный способ обмена, всегда работает без проблем.
В общем, при размере массива из 256 баров (по 36 байт каждый), перед массивом пишется 7 байт чего-то... Когда больше - 8.
256 - это у меня так попалось. Четкой границы перехода с 8 на 7 байт не знаю.
Похоже, это таки мой хвост. После запроса длины массива. 4 байта - целое, длина стринга. И плюс длина стринга, в которой число - размер массива.
Так что это мой косяк!
Спасибо за помощь!
Отправляет размер массива. И в проге считывается до чтения массива. Отправляется в виде string. Перед ним передается длина этой string целым числом. В проге считывается соответственно. Хвостов не должно оставаться - это стандартный способ обмена, всегда работает без проблем.
В общем, при размере массива из 256 баров (по 36 байт каждый), перед массивом пишется 7 байт чего-то... Когда больше - 8.
256 - это у меня так попалось. Четкой границы перехода с 8 на 7 байт не знаю.
Получается мешанина из форматов - текстовый и бинарный.
Запишите вместо <длина строки целым число><строка произвольной длины><массив структур>
<размер массива целым числом><массив структур>
Со структурой я бы тоже немного поработал. Дату-время в структуре представить не в виде int32(int), а в виде int64(long), тем более, что тип datetime в MQL4 - 8-байтовый. В таком случае размер структуры будет кратным 8 и все её члены во всех элементах массива всегда будут выровнены на границу 8
Советы правильные. С датой так и сделаю. Просто подстраивался под то, что уже было в программе.
"Запишите вместо <длина строки целым число><строка произвольной длины><массив структур>
<размер массива целым числом><массив структур>" - у меня строится полноценное API , <длина строки целым число><строка произвольной длины> - это стандартный "протокол" обмена. Менять пока не вижу смысла. В советнике около 4 тысяч строк, в API не меньше.
Вообще, на самом деле текстового формата нет. Все передается в бинарном потоке. Просто "протокол" идет строками. А массив в строку не зашьешь, поэтому он как-бы идет вне протокола.
Я по-другому вышел из положения:
int u; u = br.ReadInt32();//в пайпе остается ответ от запроса длины массива: int - размер string br.ReadBytes(u);//и string - длина в виде строки
Таким образом сдвигаю указатель на конец ответа с длиной массива, и потом начинаю читать сам массив.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Передаю с помощью FileWriteArray массив структур Bar. Пишу в Pipe.
Перед передачей массива FileWriteArray(ExtPipe, s, 0, WHOLE_ARRAY)
передаю размер массива pipewrite(IntegerToString(size)); своей функцией
Читаю из проги на C#
Так вот, при чтении в первых байтах записано что-то, но не первый член структуры первого члена массива, а нечто мне не известное.
Поясните, плиз, что пишет FileWriteArray в начале файла?