Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Решил довести-таки эксперимент до логического конца. Нужно было выяснить следующий момент: если файл открыт первым скриптом, то второму скрипту есть добро открыть его для записи, или только для чтения? Для этого изменил коды скриптов. В первом изменил время сна и текст вписываемой в файл строки. Во второй скрипт добавил функцию Кима, добавляющую строку в конец файла. (см. коды ниже). Кинул первый скрипт на график. Щёлкнул правой кнопкой мыши по графику и убедился, что в контекстном меню присутствует сообщение о выполняющемся скрипте. Переключился на другой график, кинул на него второй скрипт, получил Алерт, что файл свободен. Открыл наш 1.txt - строка второго скрипта на месте - пока первый скрипт спал, второй скрипт добавил в файл строку, сохранился и выгрузился из оперативной памяти. Закрыл 1.txt. Переключился на график с первым скриптом, дождался алерта с сообщением, что удержание файла закончено. Открыл снова документ 1.txt. Результат - ну просто сказка с грустным концом. Сообщение первого скрипта добавилось не в последнюю строку, а заменило собой кусок сообщения второго скрипта. От сообщения второго скрипта остались только две буквы на следующей строчке. На следующей потому, что первый скрипт помимо самой строки добавил и служебные символы конца строки и перевода каретки на новую строку (символ абзаца).
Вывод, нельзя открывать файл для записи, если он уже открыт другой программой языка MQL4.
Эта функция действительно позволяет организовать семафор.
А покажите-ко кто-нибудь на примере кода, в чём изюминка той самой семафорной функци? Что-то её надобность вот так сходу и не видна. Я. например, сделал семафор и без неё и он вполне работает. Мож я чего-то недопонимаю. Если нужно, то код своего семафора покажу - не вопрос - да и нет там ни чего сверхъестественного - всё просто как три копейки.
Семафор на неатомарном уровне - не семафор. Обязательно будут коллизии.
Столкновения интересов советников будут в любом случае, если они используют доступ к одному и тому же текстовому документу. Есть очень малая доля вероятности, что тик по двум валютным парам придёт миллисекунда в миллисекунду (в чём я вообще сомневаюсь). И тогда два эксперта попытаются одновременно внести изменения в текстовый документ. Скажите, как может помочь в этом случае функция GlobalVariableSetOnCondition() ? Да ни как - два эксперта одновременно попытаются изменить значение переменной глобального уровня.
Вот мой код семафора, который использую я. Скажите, задействование функции GlobalVariableSetOnCondition() лучше, чем это, код будет короче, проще?
После этого блока кода нужно просто не забыть перед каждым ретурном, прерывающим работу советника, установить переменную глобального уровня в отрицательное положение.Столкновения интересов советников будут в любом случае, если они используют доступ к одному и тому же текстовому документу. Есть очень малая доля вероятности, что тик по двум валютным парам придёт миллисекунда в миллисекунду (в чём я вообще сомневаюсь). И тогда два эксперта попытаются одновременно внести изменения в текстовый документ. Скажите, как может помочь в этом случае функция GlobalVariableSetOnCondition() ? Да ни как - два эксперта одновременно попытаются изменить значение переменной глобального уровня.
Вот мой код семафора, который использую я. Скажите, задействование функции GlobalVariableSetOnCondition() лучше, чем это, код будет короче, проще?
После этого блока кода нужно просто не забыть перед каждым ретурном, прерывающим работу советника, установить переменную глобального уровня в отрицательное положение.Дело не в том, когда тики прийдут на советники, а в том, чтобы доступ к файлу был по очереди без одновременности. Сихронизация на атомарном уровне (на уровне ядра) это обеспечивает.
А можно более развёрнутый ответ? Ну как для ребёнка.