Особенности языка mql5, тонкости и приёмы работы - страница 204

 
Andrey Khatimlianskii:

Никто не гарантировал, что будут прерваны (или не будут запущены) другие обработчики событий.

После алерта же происходит и деинит и инит, правда?

Да, идет полная перезагрузка. Просто таймер (даже секундный) нарывается - особенность, не баг.

 
fxsaber:

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

Однако, это происходит из-за таймера.

Эту особенность можно использовать для решения простой по формулировке, но сложной по реализации задачи.

// Если произошла смена счета, советник выгружается.

const bool Init = EventSetMillisecondTimer(1);

void OnTimer()
{
  static const long Account = AccountInfoInteger(ACCOUNT_LOGIN);
  
  if (Account != AccountInfoInteger(ACCOUNT_LOGIN))
    ExpertRemove();
}
 
fxsaber:

Эту особенность можно использовать для решения простой по формулировке, но сложной по реализации задачи.

Почему нельзя просто проверять смену счета на входе каждой On-функции?

Зачем миллисекундный таймер? Он все равно не прервет выполнение программы, если перелогин произойдет в процессе работы.

 
Andrey Khatimlianskii:

Почему нельзя просто проверять смену счета на входе каждой On-функции?

Зачем миллисекундный таймер? Он все равно не прервет выполнение программы, если перелогин произойдет в процессе работы.

Попробуйте. По ссылке выше длинное обсуждение этой темы.

 
fxsaber:

Да, идет полная перезагрузка. Просто таймер (даже секундный) нарывается - особенность, не баг.

После команды ExpertRemove() просто взводится стоп-флаг и советник продолжает работать до следующего тика. На новом тике, встретив взведённый стоп-флаг, советник выгружается. Значит - пока не пришёл новый тик, все On-функции продолжают работать в штатном режиме.

Соответственно, если мы не можем получить программно состояние этого флага (не искал специально эту возможность), то нам нужно иметь глобально свой флаг. Перед командой ExpertRemove() взводим собственный флаг, а в каждой On-функции проверяем его. Если флаг взведён - уходим. Тогда и таймер не будет исполнять код, в него заложенный.

Или я не так всё понял и вопрос в другом?

 
Artyom Trishkin:

После команды ExpertRemove() просто взводится стоп-флаг и советник продолжает работать до следующего тика. На новом тике, встретив взведённый стоп-флаг, советник выгружается. Значит - пока не пришёл новый тик, все On-функции продолжают работать в штатном режиме.

Соответственно, если мы не можем получить программно состояние этого флага (не искал специально эту возможность), то нам нужно иметь глобально свой флаг. Перед командой ExpertRemove() взводим собственный флаг, а в каждой On-функции проверяем его. Если флаг взведён - уходим. Тогда и таймер не будет исполнять код, в него заложенный.

Или я не так всё понял и вопрос в другом?

Не в курсе, решение какой задачи описали.

 
Artyom Trishkin:

После команды ExpertRemove() просто взводится стоп-флаг и советник продолжает работать до следующего тика. На новом тике, встретив взведённый стоп-флаг, советник выгружается. Значит - пока не пришёл новый тик, все On-функции продолжают работать в штатном режиме.

Соответственно, если мы не можем получить программно состояние этого флага (не искал специально эту возможность), то нам нужно иметь глобально свой флаг. Перед командой ExpertRemove() взводим собственный флаг, а в каждой On-функции проверяем его. Если флаг взведён - уходим. Тогда и таймер не будет исполнять код, в него заложенный.

Или я не так всё понял и вопрос в другом?

Не на новом тике, а на ближайшем return;

Поставь ExpertRemove() в OnInit() и пошагово проверь в отладке.

 
Alexey Viktorov:

Не на новом тике, а на ближайшем return;

Поставь ExpertRemove() в OnInit() и пошагово проверь в отладке.

Да, ошибся. Любое следующее событие уже не будет выполняться. Давненько в справку не глядел по не нужным мне функциям :)

 
fxsaber:

Не в курсе, решение какой задачи описали.

Смысл ответа не понятен. Ну и ладно.

 
Artyom Trishkin:

Смысл ответа не понятен.

ExpertRemove не вызывал.