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

 
Ilya Baranov:

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

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

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

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

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

Только не надо из глобальных переменных делать оперативную память

======

Я за метод, который будет использовать ячейку памяти компьютера.

Как сделать такое - есть у кого нибудь решение?

 
Renat Akhtyamov:

Только не надо из глобальных переменных делать оперативную память

======

Я за метод, который будет использовать ячейку памяти компьютера.

Как сделать такое - есть у кого нибудь решение?

В памяти компьютера с ОС Windows имеется несколько программно доступных ячеек памяти. Остались от старой архитектуры. Использовал их на языках Assembler, Basic, Pascal для определения повторного запуска программы. Если программа уже когда-то запускалась - то в памяти признак. Если перезагрузить компьютер - стирается. Но в MQL отсутствует доступ к памяти, a хотелось бы без DLL

 
Renat Akhtyamov:

Только не надо из глобальных переменных делать оперативную память

======

Я за метод, который будет использовать ячейку памяти компьютера.

Как сделать такое - есть у кого нибудь решение?

Вы сами себе придумали ограничение, а теперь идете на принцип.

Временные глобальные переменные используются для передачи данных от одной программы в терминале в другую. Для чего их еще использовать, как не по прямому назначению?

Кроме того, их использование потокобезопасно.

С оперативной памятью получите то же самое, но делать дольше и вряд ли надежнее. Обязательно потребуется атомарный доступ.

 
Boris.Kurbin:

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

GlobalVariableTemp

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

 
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
//---
   if(!GlobalVariableCheck("the_EA_is_already_running"))
   {  GlobalVariableSet("the_EA_is_already_running",0);
   }
   else   
   {  GlobalVariableSet("the_EA_is_already_running",1);
      ExpertRemove();
   }
//+------------------------------------------------------------------+
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
   if(GlobalVariableCheck("the_EA_is_already_running"))
   {  if(GlobalVariableGet("the_EA_is_already_running") == 0) GlobalVariableDel("the_EA_is_already_running");
      else GlobalVariableSet("the_EA_is_already_running",0);
   }
//---
}

При аварийном завершении удалите переменную через F3.

 
В MT4 можно определять, на каких чартах какие эксперты запущены. Поэтому исходная задача решается и без глобальных переменных.