...(использование стандартных буферов не обсуждается)...
Здравствуйте!
Индикатор пишет в файл, а советник должен читать (использование стандартных буферов не обсуждается)
Но почему-то советник прочитывает всегда один и тот же текст, хотя индикатор на каждом тике пишет новый и использует FileFlush(FileHandle);
Вот так открывается файл в советнике:
FileHandle = FileOpen(FileName, FILE_TXT|FILE_SHARE_READ|FILE_READ |FILE_WRITE|FILE_SHARE_WRITE);
Вот так открывается файл в индикаторе:
FileHandle = FileOpen(FileName, FILE_TXT|FILE_WRITE|FILE_SHARE_WRITE|FILE_SHARE_READ);
Вот как идёт чтение в советнике:
Sleep(10);
FileSeek(FileHandle, SEEK_SET, 0);
for(int i=0; i<howManyLines; i++) {
string l = FileReadString(FileHandle);
...
Почему может прочитываться один и тот же текст на каждом тике, если в файле текст меняется (я проверял)
Файлик после чтения закрываете?
И попробуйте закомментить FileSeek
И вот это лучше уж так: FileHandle = FileOpen(FileName, FILE_TXT|FILE_SHARE_READ|FILE_SHARE_WRITE);
И коль индикатор только читает, то лучше так: FileOpen(FileName, FILE_TXT|FILE_SHARE_READ);
После прочтения нужно:
Файлик после чтения закрываете?
И попробуйте закомментить FileSeek
И вот это лучше уж так: FileHandle = FileOpen(FileName, FILE_TXT|FILE_SHARE_READ|FILE_SHARE_WRITE);
И коль индикатор только читает, то лучше так: FileOpen(FileName, FILE_TXT|FILE_SHARE_READ);
После прочтения нужно:
FILE_TXT|FILE_SHARE_READ - даёт ошибку 5004 - (cannot open file)
Открытие, закрытие файлов довольно таки дорогая по времени операция. Хотелось бы, чтобы процесс шёл максимально быстро. То есть по сути я хочу образовать трубку.
Не найдётся ли у вас реально работающего примера трубки?
1) FILE_TXT|FILE_SHARE_READ - даёт ошибку 5004 - (cannot open file)
2) Открытие, закрытие файлов довольно таки дорогая по времени операция. Хотелось бы, чтобы процесс шёл максимально быстро. То есть по сути я хочу образовать трубку.
Не найдётся ли у вас реально работающего примера трубки?
1) Уже ближе к теме выявления проблемы. Разбирайтесь тогда - почему не открывается файл. Команда должна работать без ошибки.
Подозреваю, что у Вас советник также не закрывает файл после его модификации. Не закрытый файл уже не открыть индикатором.
В советник пишем такое:
FileHandle = FileOpen(FileName, FILE_TXT|FILE_SHARE_READ|FILE_SHARE_WRITE);
2) шлюз? неее, такое не дам, хотя и есть. Пишите сами:

- www.mql5.com
Если требуется максимальное быстродействие, то зачем использовать индикатор. Он ведь работает в интерфейсном потоке, то есть ждет перерисовку всех видимых окон терминала, а это чаще всего миллисекунды, а то и десятки миллисекунд. Тогда как обмен между памятью и файловыми буферами операционной системы занимает микросекунды, если передается несколько сот байт данных. Также как и сброс содержимого этих буферов в буферы контроллера жесткого диска, который и считается самой затратной по времени частью операции закрытия файла, расположенного на жестком диске. О том, что открытие файла занимает какое-то заметное время, не слышал.
Еще мне вспоминается, что Ренат Фатхуллин сообщал о том, что после очередного увеличения быстродействия файловых операций функция FileFlush в большинстве случаев стала ничего не делать. Однако в документации это не отражено, может быть, сейчас снова что-нибудь делает всегда или почти всегда. В тот момент я проверил, закрыть и снова открыть файл оказалось весьма быстро, и перестал вообще использовать FileFlush. Возможно, его сообщение относилось только к MQL4, но я на всякий случай так поступил в программах на обоих языках, MQL4 и MQL5.
У человека проблема описана в 1-ом посте.
Очевидно, что файл читается советником только первый раз, когда индикатор его еще не занял для записи.
Поэтому в индикаторе надо файл закрыть после модификации. Если файл не закрывать, то изменения возможно советник не заметит.
Далее - на второй раз советник уже получает ошибку открытия файла. Соответственно - файл опять же по просту не закрыт индикатором
Далее, команда FileFlush в конечном итоге погубит жесткий диск. Поэтому не советую.
Итак, файл нужно открывать в советнике так:
FileHandle = FileOpen(FileName, FILE_TXT|FILE_READ);
а в индикаторе так:
FileHandle = FileOpen(FileName, FILE_TXT|FILE_READ|FILE_WRITE);
И в конце, в обоих случаях закрыть
FileClose(FileHandle);
Поскольку файл каждый раз закрывается, то скорее всего контрольная сумма не понадобится. Просто нужно проверить, будет ли возвращать "true" FileOpen(). Ну и функция обработки ошибок нужна будет.
Вот тогда будет надежно.
//я там повыше думал что советник изменяет файл. прошу прощения
Почему может прочитываться один и тот же текст на каждом тике, если в файле текст меняется (я проверял)
Чтение/запись происходит в буфер. Поэтому данные не меняются.
new-rena правильно пишет, что файлы нужно закрывать.
Правильно было написать FileSeek(FileHandle, 0, SEEK_SET);
но, поскольку SEEK_SET = 0, то фактически ошибки нет.
У человека проблема описана в 1-ом посте.
Очевидно, что файл читается советником только первый раз, когда индикатор его еще не занял для записи.
Поэтому в индикаторе надо файл закрыть после модификации. Если файл не закрывать, то изменения возможно советник не заметит.
Далее - на второй раз советник уже получает ошибку открытия файла. Соответственно - файл опять же по просту не закрыт индикатором
Далее, команда FileFlush в конечном итоге погубит жесткий диск. Поэтому не советую.
Итак, файл нужно открывать в советнике так:
FileHandle = FileOpen(FileName, FILE_TXT|FILE_READ);
а в индикаторе так:
FileHandle = FileOpen(FileName, FILE_TXT|FILE_READ|FILE_WRITE);
И в конце, в обоих случаях закрыть
FileClose(FileHandle);
Поскольку файл каждый раз закрывается, то скорее всего контрольная сумма не понадобится. Просто нужно проверить, будет ли возвращать "true" FileOpen(). Ну и функция обработки ошибок нужна будет.
Вот тогда будет надежно.
//я там повыше думал что советник изменяет файл. прошу прощения
Все так. Я считаю, что в советниках можно открыть совместный доступ на чтение.
С контрольной суммой чисто моя заморочка. Она возникла из необходимости открыть совместный доступ на чтение в советнике и в индикаторе. То есть, когда открыт совместный доступ в индикаторе и в советниках, возникает проблема корректности прочитанных данных. Меня это вынудил сделать Excel. Он падает с критической ошибкой, если файл кем-то открыт, а к нему нет совместного доступа.

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте!
Индикатор пишет в файл, а советник должен читать (использование стандартных буферов не обсуждается)
Но почему-то советник прочитывает всегда один и тот же текст, хотя индикатор на каждом тике пишет новый и использует FileFlush(FileHandle);
Вот так открывается файл в советнике:
FileHandle = FileOpen(FileName, FILE_TXT|FILE_SHARE_READ|FILE_READ |FILE_WRITE|FILE_SHARE_WRITE);
Вот так открывается файл в индикаторе:
FileHandle = FileOpen(FileName, FILE_TXT|FILE_WRITE|FILE_SHARE_WRITE|FILE_SHARE_READ);
Вот как идёт чтение в советнике:
Sleep(10);
FileSeek(FileHandle, SEEK_SET, 0);
for(int i=0; i<howManyLines; i++) {
string l = FileReadString(FileHandle);
...
Почему может прочитываться один и тот же текст на каждом тике, если в файле текст меняется (я проверял)