Как перед запуском эксперта можно почистить данные (возможно оставшиеся) от его предыдущего запуска?

 

Как перед запуском эксперта можно почистить данные от его предыдущего запуска? Например, если по каким-то причинам (может просто аварийным), от предыдущего запуска остались глобальные переменные терминала, объекты на графике или его файлы. То есть эксперт выгрузился, а OnDeinit не сработал или сработал некорректно. 

Понятно, что в идеальном случае, при самом первом запуске советника надо было бы просто проверить наличие этих самых данных и переменных и удалить их, но похоже определить этот самый первый запуск не представляется возможным, так как код вызываемый из самого эксперта подразумевает, что эксперт собственно уже запущен. А постановка самой задачи (удалить переменные и файлы от предыдущего запуска), не позволяет использовать и их.   

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Глобальные переменные - Переменные - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
В начале OnInit() вызвать OnDeinit() или какую-то его часть, оформленную в виде функции. Вроде нет никакой проблемы...
 
Ihor Herasko #:
В начале OnInit() вызвать OnDeinit() или какую-то его часть, оформленную в виде функции. Вроде нет никакой проблемы...

Не могу осознать, что это даст. Написать функцию, удаляющую все эти лишние данные особых проблем нет. Вопрос в том, как сделать так, чтобы она вызвалась лишь перед самым первым запуском советника. Если я вставлю ее в OnDeint или в начале OnInit, она будет запускаться каждый раз при запуске этих функций и данные тогда будут удалятся постоянно.

 
leon_17 #:

Не могу осознать, что это даст. Написать функцию, удаляющую все эти лишние данные особых проблем нет. Вопрос в том, как сделать так, чтобы она вызвалась лишь перед самым первым запуском советника. Если я вставлю ее в OnDeint или в начале OnInit, она будет запускаться каждый раз при запуске этих функций и данные тогда будут удалятся постоянно.

Вы сами писали, что данные остаются по причине того, что OnDeinit не отработала. Следовательно с вызовом той функции из OnDeinit у Вас недолжно возникнуть проблем.
Проблема в OnInit, как мне видится, заключается в том, что эта функция вызывается не только при старте советника, но и при смене параметров. Чтобы отследить старт, достаточно завести static переменную, которую инициализировать значением, соответствующим старту советника, а в OnInit менять это значение на другое. При смене параметров, значение этой переменной не будет соответствовать стартовому, т.о. сможете отделить старт от смены параметров.
 
Sergey Gridnev #:
Вы сами писали, что данные остаются по причине того, что OnDeinit не отработала. Следовательно с вызовом той функции из OnDeinit у Вас недолжно возникнуть проблем.
Проблема в OnInit, как мне видится, заключается в том, что эта функция вызывается не только при старте советника, но и при смене параметров. Чтобы отследить старт, достаточно завести static переменную, которую инициализировать значением, соответствующим старту советника, а в OnInit менять это значение на другое. При смене параметров, значение этой переменной не будет соответствовать стартовому, т.о. сможете отделить старт от смены параметров.

Ну, убирать за собой советник должен не на каждый запуск OnDeinit, а только при своей выгрузке. И эти события нумеруются через параметр int reason OnDeinit. Выгрузка там обрабатывается, а вот загрузка нового с нуля, нет.

Насчет приема со static переменной тоже не до конца понял. Как например это решит проблему, если терминал будет банально перезапущен с уже работающим советником?

 
leon_17 #:


Насчет приема со static переменной тоже не до конца понял. Как например это решит проблему, если терминал будет банально перезапущен с уже работающим советником?


А что должен сделать советник в этой ситуации? Должен ли он подчистить то, что осталось от работы до перезапуска?
 
leon_17 #:

Не могу осознать, что это даст. Написать функцию, удаляющую все эти лишние данные особых проблем нет. Вопрос в том, как сделать так, чтобы она вызвалась лишь перед самым первым запуском советника. Если я вставлю ее в OnDeint или в начале OnInit, она будет запускаться каждый раз при запуске этих функций и данные тогда будут удалятся постоянно.

Вы можете ввести контроль первого запуска через файл. Например, при запуске советник ищет файл GBPUSD.lock, если его нет - значит запуск первый. Далее создает этот файл и выполняет функцию чистки. Если файл есть - пропускает этот этап.