По моему тут нет ошибки. По умолчанию есть общий доступ к файлу без ограничений.
Пользователь сам должен решить, как синхронизировать доступ.
По моему тут нет ошибки. По умолчанию есть общий доступ к файлу без ограничений.
Ну ошибкой это сложно назвать. Но обычное умолчание это разрешение совместного доступа при чтении и запрещение при записи.
А еще фишка в том, что нельзя убрать совместный доступ вообще, а это уже проблема. В стандартных средствах MQL нет никакого подобия семафора, посему вероятность коллизии всегда существует.
Если в этой проблеме поискать выгоду, то получается, что несколько скриптов (индикаторов, советников) могут параллельно писать информацию в один файл, что может понадобиться, например, при распределенном сборе информации для последующего анализа.
Ну ошибкой это сложно назвать. Но обычное умолчание это разрешение совместного доступа при чтении и запрещение при записи.
А еще фишка в том, что нельзя убрать совместный доступ вообще, а это уже проблема. В стандартных средствах MQL нет никакого подобия семафора, посему вероятность коллизии всегда существует.
Синхронизацию можно через глобальные переменные сделать.
Ну ошибкой это сложно назвать. Но обычное умолчание это разрешение совместного доступа при чтении и запрещение при записи.
А еще фишка в том, что нельзя убрать совместный доступ вообще, а это уже проблема. В стандартных средствах MQL нет никакого подобия семафора, посему вероятность коллизии всегда существует.
Семафор всегда можно сделать. Но коллизии могут быть всегда
Нельзя. Мы уже говорили об этом. Заново начинать не собираюсь.
Можно. Даже с обработкой ошибок коллизий. Только на фиг это надо. Атомарно не получится. Будет слишком наворочено. Проще на уровне ядра критическими секция ми, мьютексами и т.п. в С++.
Хотя, можно, как-то WinAPI-функциями синхронизации в MQL4 попробывать.
bool GlobalVariableSetOnCondition( string name, double value, double check_value)
Устанавливает новое значение существующей глобальной переменной, если текущее значение переменной равно значению третьего параметра check_value. Если переменной не существует, функция сгенерирует ошибку ERR_GLOBAL_VARIABLE_NOT_FOUND (4058) и вернет FALSE. При успешном выполнении функция возвращает TRUE, иначе FALSE. Для того, чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError(). Если текущее значение глобальной переменной отличается от check_value, функция вернет FALSE.
Функция обеспечивает атомарный доступ к глобальной переменной, поэтому она может быть использована для организации семафора при взаимодействии нескольких одновременно работающих экспертов в пределах одного клиентского терминала.
Эта функция действительно позволяет организовать семафор.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Ндааа, шестой год уже программирую на MQL4, а иной раз голову поломать приходится конкретно. И кажется вроде знаешь уже язык - не должно быть сюрпризов. Ан нет - не тут то было.
Пишем скрипт, который открывает файл, записывает в него строку (как доказательство что файл реально был открыт), спит 15 секунд (этого времени нам хватит вполне для дальнейшего эксперимента), затем закрывает файл и и выдаёт сообщение, что удержание файла в открытом состоянии закончено.
Теперь, если в момент, пока скрипт спит и удерживает файл в открытом состоянии попытаться открыть для записи этот же файл из другого скрипта, то по логике вещей, терминал должен отреагировать на это отрицательно (ну чтоб не получилось, что пока один советник что-то пишет в файл, другой перехватывает инициативу, быстренько дописывает и сматывается. в результате первый советник допишет своё, сохранится и запись второго советника исчезнет). Проверяем этот момент. Пишем ДЛЛ-ку которая проверяет занятость файлов:
Теперь пишем скрипт для проверки занятости файла:
А теперь открываем терминал и в папке файлов создаём документ 1.txt. Далее в терминале кидаем скрипт "OpenFile" на график и тут же кидаем на другой график скрипт "SkolkoZanjat". Опа, скрипт выдаёт информацию, что файл свободен. Это значит, что сие может стать источником не малых бед, если советники не используют между собой семафор доступа.
Разработчики, добавьте пожалуйста в справку метаэдитора информацию, что если файл открыт функцией FileOpen(), то другой советник (индикатор/скрипт) имеет право открыть его же и пока первый копается, внести в него изменения.