Ошибки, баги, вопросы - страница 3593
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Попробовал, не помогло.
DL 0 23:51:40.684 TestScript (EURUSD,H4) Date3=1970.01.01 00:00:00
PG 0 23:51:40.684 TestScript (EURUSD,H4) date is 1970.01.01 00:00:00
тогда откройте файл в HEX редакторе и посмотрите первый байт. что там у вас.
потому-что вот тут:
там пробела вроде как не должно быть...может там у вас какой-то служебный символ попался. Может BOM
и ещё раз: не надо Print...
PrintFormat("Str[0]=<<%s>>",Str[0]); // и будет отчётливо видно, есть там лишние "пустые" символы или нет
Не читается дата записанная в файл. Что не так?
Вывод:
LJ 0 12:44:54.122 TestScript (EURUSD,H4) -----
NS 0 12:44:54.122 TestScript (EURUSD,H4) Date1=2024.11.28 09:22:00
QS 0 12:44:54.122 TestScript (EURUSD,H4) Str= 1732785720 2024.11.28 09:22
QQ 0 12:44:54.122 TestScript (EURUSD,H4) Date2=1970.01.01 00:00:00
CL 0 12:44:54.122 TestScript (EURUSD,H4) StrStr[0]= 1732785720 StrStr[1]=2024.11.28 StrStr[2]=09:22
DJ 0 12:44:54.122 TestScript (EURUSD,H4) Date3=1970.01.01 00:00:00
>>>К разработчикам<<<
Кажется нашел проблемное место. Открыл текстовый файл в 16-ричном коде. Обнаружил пару байт, в самом начале файла, 'FF' и 'FE'. Они дают лишний/неизвестный знак к числу '1732785720'. Очевидно, что StringToInteger() возвращает по ошибке "неизвестной цифры" ноль. Поэтому ноль и выводится...
Интересно, что если убрать строку:
то все начинает работать нормально. Если же принудительно перевести указатель файла на ноль, тогда и происходит ошибка чтения из текстового файла.
PS
Пробовал в МТ4, там без проблем, ни каких лишних байт не пишется.
Пробовал удалить байты "в ручную", после этого файл читается без сбоев.
Пробовал создавать тестовый файл в блокноте и в word, таких байт в начале не обнаружено.
>>>К разработчикам<<<
Кажется нашел проблемное место. Открыл текстовый файл в 16-ричном коде. Обнаружил пару байт, в самом начале файла, 'FF' и 'FE'. Они дают лишний/неизвестный знак к числу '1732785720'. Очевидно, что StringToInteger() возвращает по ошибке "неизвестной цифры" ноль. Поэтому ноль и выводится...
Интересно, что если убрать строку:
то все начинает работать нормально. Если же принудительно перевести указатель файла на ноль, тогда и происходит ошибка чтения из текстового файла.
PS
Пробовал в МТ4, там без проблем, ни каких лишних байт не пишется.
Пробовал удалить байты "в ручную", после этого файл читается без сбоев.
Пробовал создавать тестовый файл в блокноте и в word, таких байт в начале не обнаружено.
Попробуйте при открытии файла добавлять флаг FILE_ANSI.
Попробуйте при открытии файла добавлять флаг FILE_ANSI.
FILE_ANSI помогает. Лишних байт нет.
FILE_ANSI добавлять при записи и при чтении.
На картинке:
Верх) при записи и чтении
Низ) только при записи
Обнаружил пару байт, в самом начале файла, 'FF' и 'FE'. Они дают лишний/неизвестный знак к числу '1732785720'.
Это тот самый BOM (https://ru.wikipedia.org/wiki/Маркер_последовательности_байтов)
для уверенности ВСЕГДА задавайте все нужные флаги открытия файла. Не полагайтесь на умолчания.
---
уже привычка, для записи в текстовый файл писать FileOpen(fileName,FILE_WRITE|FILE_SHARE_READ|FILE_TXT|FILE_ANSI,';',CP_UTF8)
"файл для записи, разрешено одновременно чтение, интерпретировать как текст, с однобайтной кодировкой, разделитель полей ';', кодировка utf-8"
а при открытии файла на чтение всегда проверять есть-ли там BOM в начале. Потому что файл может быть чёрти где пересохранён с этим дурацким маркером
Тут слушок прошёл, что в госдуме обсуждали необходимость закрыть цирки.
Да и пусть закрывают… На форуме почитать и в цирк ходить не надо. ТРИ страницы обсуждение и никто не задался вопросом: А зачем преобразовывать тип datetime в int? Что вы хотите увидеть если 8ми байтный тип перевести в 4х байтный… Зачем строку переводить в int и затем в дату? Почему не перевести строку в дату???
Сбой чтения/записи текстового файла решается добавлением флага FILE_ANSI.
Сбой чтения\записи решается правильным преобразованием данных.
Тут слушок прошёл, что в госдуме обсуждали необходимость закрыть цирки.
Да и пусть закрывают… На форуме почитать и в цирк ходить не надо. ТРИ страницы обсуждение и никто не задался вопросом: А зачем преобразовывать тип datetime в int? Что вы хотите увидеть если 8ми байтный тип перевести в 4х байтный… Зачем строку переводить в int и затем в дату? Почему не перевести строку в дату???
у вас классика утреннего бреда...надо высыпаться :-)
тип datetime и так целое число, 64 бита. И нигде автор в 32 бита его не преобразует.
datetime как целое число преобразуют в строку (IntegerToString(long x,..)) и это число записывают в файл. Потому-что в виде числа оно стандартно и портабельно, это unixtime то есть кол-во секунд с 1970г, а в текстовом представлении MQL оно только в MQL.
на досуге попробуйте привести штатный datetime в столь-же штатный SQLite datetime.