ChartSaveTemplate + парсинг имени советника.
Дельно, спасибо.
Вот такой вариант, все очень просто при помощи временной глобальной переменной которая не сохраняется при перезагрузках терминала
string GlVarName = "MMwork_Yes"; bool bGlVarDelete = true; int OnInit() { //------------------------------------ Uniq if(GlobalVariableCheck(GlVarName) ) { Alert("!!! Expert is already running !!!"); bTrade = false; bGlVarDelete = false; return(0); // ExpertRemove(); }else { Print(">>> GlobalVariableTemp(GlVarName)= ", GlobalVariableTemp(GlVarName) ); } } //--------------------------------- void OnDeinit(const int reason) { if(bGlVarDelete) GlobalVariableDel(GlVarName); }
Вот такой вариант, все очень просто при помощи временной глобальной переменной которая не сохраняется при перезагрузках терминала
Запускать терминал с уже запущенными 2-3 советниками пробовали?
Запускать терминал с уже запущенными 2-3 советниками пробовали?
Ну да если трейдер после Алерта
Alert("!!! Expert is already running !!!")
оставит второй советник на графике, то после перезапуска терминала оба могут работать.
Тут человеческий фактор ну очень должен рулить))
Тут спасет только
вместо
return
Если нужен атомарный доступ, логично использовать средства которые его уже предоставляют.
Из доступных в MQL это открыть файл без флагов FILE_SHARE_READ FILE_SHARE_WRITE или globalvariablesetoncondition
Из-за принципиальной ненадежности глобальных переменных предпочитаю файл. Удобно, проблем никаких, пользую такой способ давным давно.
Если нужен атомарный доступ, логично использовать средства которые его уже предоставляют.
Из доступных в MQL это открыть файл без флагов FILE_SHARE_READ FILE_SHARE_WRITE или globalvariablesetoncondition
Из-за принципиальной ненадежности глобальных переменных предпочитаю файл. Удобно, проблем никаких, пользую такой способ давным давно.
В качестве простого семафора globalvariablesetoncondition - то что нужно.
Ну да если трейдер после Алерта
оставит второй советник на графике, то после перезапуска терминала оба могут работать.
Тут человеческий фактор ну очень должен рулить))
Тут спасет только
ExpertRemove()
вместо
return
Проще: return( -1 ); Это не позволит повесить второй эксперт
"Событие Init генерируется сразу после загрузки эксперта или индикатора. Функция OnInit() используется для инициализации. Если OnInit() имеет возвращаемое значение типа int, то ненулевой код возврата означает неудачную инициализацию и генерирует событие Deinit с кодом причины деинициализации REASON_INITFAILED.
Результат выполнения функции OnInit() анализируется исполняющей подсистемой терминала только в том случае, если программа скомпилирована с использованием #property strict."
Проще: return( -1 ); Это не позволит повесить второй эксперт
"Событие Init генерируется сразу после загрузки эксперта или индикатора. Функция OnInit() используется для инициализации. Если OnInit() имеет возвращаемое значение типа int, то ненулевой код возврата означает неудачную инициализацию и генерирует событие Deinit с кодом причины деинициализации REASON_INITFAILED.
Результат выполнения функции OnInit() анализируется исполняющей подсистемой терминала только в том случае, если программа скомпилирована с использованием #property strict."
В МТ5 да, в МТ4 встречал дальнейшее выполнение. Лучше прописать ExpertRemove()
В МТ5 да, в МТ4 встречал дальнейшее выполнение. Лучше прописать ExpertRemove()
#property strict int OnInit() { ExpertRemove(); return( 0 ); }
2018.03.04 20:31:43.750 Script 110 EURUSD,H1: removed
2018.03.04 20:31:43.750 110 EURUSD,H1: uninit reason 0
2018.03.04 20:31:43.750 110 EURUSD,H1: initialized
2018.03.04 20:31:43.750 110 EURUSD,H1: ExpertRemove function called
2018.03.04 20:31:43.734 Script 110 EURUSD,H1: loaded successfully
#property strict int OnInit() { return( -1 ); }
2018.03.04 20:30:14.296 Script 110 EURUSD,H1: loaded successfully
Результат одинаковый, поскольку ничего не напечаталось из OnStart():
void OnStart() { Print( "Expert not removed" ); }
А, вот если не указать #property strict
В первом случае будет то же самое, а во втором:
2018.03.04 20:42:08.843 Script 110 EURUSD,H1: removed
2018.03.04 20:42:08.843 110 EURUSD,H1: uninit reason 0
2018.03.04 20:42:08.843 110 EURUSD,H1: Expert not removed
2018.03.04 20:42:08.843 110 EURUSD,H1: initialized
2018.03.04 20:42:08.828 Script 110 EURUSD,H1: loaded successfully
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
МТ4
Задача - чтобы советник закрывающий все ордера всех пар, стоял один на терминал. И трейдер не мог по своей невнимательности на еще одном графике навесить еще один такой же советник. Когда у трейдера за 30 графиков, то все не усмотришь, человеческий фактор.
В МТ5 есть ChartGetString(id, CHART_EXPERT_NAME)
и путем просмотра всех графиков искать имя советника, а в МТ4 нет такого.
Может кто подскажет?