МТ4: Как определить, что эксперт уже запущен? - страница 2

 
Boris.Kurbin:

На самом деле выгрузить мне не подходит.

Мне нужно, чтобы при попытке запустить вторую копию эксперта, он сообщил об этом и ничего не делал.

Тогда метку в оперативной памяти

Я не умею такое, но на форуме где-то есть

 
Renat Akhtyamov:

Тогда метку в оперативной памяти

Я не умею такое, но на форуме где-то есть

Смотрите. Допустим я сохранил где-то на каком чарте у меня запущен эксперт. Потом терминал у меня аварийно завершился.

Метка с ID чарта у меня осталась, он ее не стер при деинициализации. Не понятно как мне потом проверить действительно ли на этом чарте работает эксперт.

 
Конечно можно в метку писать текущее время и постоянно ее обновлять, но какой-то это странный способ, через задний проход.
 

при запуске эксперт создает в терминале глобальную переменную, остальные копии проверяют есть ли эта переменная, если есть - значит выходим, если нет - создаем и запускаемся

при деинциализации переменную удалять

 
Taras Slobodyanik:

при запуске эксперт создает в терминале глобальную переменную, остальные копии проверяют есть ли эта переменная, если есть - значит выходим, если нет - создаем и запускаемся

при деинциализации переменную удалять

Если терминал аварийно завершит работу, то переменная останется. Что делать в этом случае?

 
Boris.Kurbin:
Конечно можно в метку писать текущее время и постоянно ее обновлять, но какой-то это странный способ, через задний проход.

Только хотел этот способ написать, т. к. сам его использую. Правда, у меня два отличия:

  1. Вместо глобальной переменной используется графический объект. 
  2. Обновление времени в объекте происходит раз в минуту. Если время в объекте отличается больше, чем на 1 минуту, значит, объект невалидный.
 
Ihor Herasko:

Только хотел этот способ написать, т. к. сам его использую. Правда, у меня два отличия:

  1. Вместо глобальной переменной используется графический объект. 
  2. Обновление времени в объекте происходит раз в минуту. Если время в объекте отличается больше, чем на 1 минуту, значит, объект невалидный.

Похоже, что другого способа нет.

 
Taras Slobodyanik:

при запуске эксперт создает в терминале глобальную переменную, остальные копии проверяют есть ли эта переменная, если есть - значит выходим, если нет - создаем и запускаемся

при деинциализации переменную удалять

Это уже обсуждалось недавно: https://www.mql5.com/ru/forum/228820 Только нужно создавать временную глобальную переменную. Тогда не страшны проблемы с крахом терминала.

Как советнику проконтролировать свои дубли на других графиках?
Как советнику проконтролировать свои дубли на других графиках?
  • 2018.02.28
  • www.mql5.com
МТ4 Задача - чтобы советник закрывающий все ордера всех пар, стоял один на терминал...
 

Создавайте временную глобальную переменную с именем содержащим ChartId. Например "MY_EA_WORKING_<ChartId>"

В содержимое раз в секунду кладите текущее время.

ChartId всех графиков можно определить из любого эксперта. Перебираете соответствующие глобальные переменные и видите, где есть работающие эксперты.

Если даже эксперт упадет из-за ошибки - переменная есть, но по содержимому видно, что эксперт не работает.

При проверке необходимо учитывать небольшое запаздывание между выполнением экспертов на разных графиках и подтормаживание компьютера. По опыту приходится ставить 4-6 секунд, иначе при пиковой загрузке компьютера иногда можно посчитать, что проверяемого эксперта нет.

 
Boris.Kurbin:

Подскажите, пожалуйста, как из эксперта определить, что он уже запущен на другом чарте?

Для МТ5 я знаю как это сделать. Нужен способ для МТ4.

Вот очень краткое описание способа, который исключает повторный запуск одного и того же эксперта. Использую и в MT4, и в MT5
int SeansNum; // Номер сеанса работы этой макропрограммы. Пишется в файл, затем периодически 
// проверяется. Если номер сменился, значит, есть второй экземпляр, этому надо прекратить работу. Номер 
// назначается на 1 больше, чем был в файле. Если файла не было, назначается 1
Причина обращения: