Как советнику проконтролировать свои дубли на других графиках?

 

МТ4

Задача - чтобы советник закрывающий все ордера всех пар, стоял один на терминал. И трейдер не мог по своей невнимательности на  еще одном графике навесить еще один такой же советник.  Когда у трейдера за 30 графиков, то все не усмотришь, человеческий фактор.

В МТ5 есть  ChartGetString(id, CHART_EXPERT_NAME)

и путем просмотра всех графиков искать имя советника, а в МТ4 нет такого.

Может кто подскажет?

 
ChartSaveTemplate + парсинг имени советника.
 
fxsaber:
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);
}
 
Dmytro Zelenskyy:

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

Запускать терминал с уже запущенными 2-3 советниками пробовали?

 
Andrey Khatimlianskii:

Запускать терминал с уже запущенными 2-3 советниками пробовали?

Ну да если трейдер после Алерта

Alert("!!! Expert is already running !!!")

оставит второй советник на графике, то после перезапуска терминала оба могут работать.

Тут человеческий фактор ну очень должен рулить))

Тут спасет только

ExpertRemove()

вместо

return

 

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

Из доступных в MQL это открыть файл без флагов FILE_SHARE_READ FILE_SHARE_WRITE или globalvariablesetoncondition

Из-за принципиальной ненадежности глобальных переменных предпочитаю файл. Удобно, проблем никаких, пользую такой способ давным давно.

 
Комбинатор:

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

Из доступных в MQL это открыть файл без флагов FILE_SHARE_READ FILE_SHARE_WRITE или globalvariablesetoncondition

Из-за принципиальной ненадежности глобальных переменных предпочитаю файл. Удобно, проблем никаких, пользую такой способ давным давно.

В качестве простого семафора globalvariablesetoncondition - то что нужно.

 
Dmytro Zelenskyy:

Ну да если трейдер после Алерта

оставит второй советник на графике, то после перезапуска терминала оба могут работать.

Тут человеческий фактор ну очень должен рулить))

Тут спасет только

ExpertRemove()

вместо

return

Проще: return( -1 ); Это не позволит повесить второй эксперт

"Событие Init генерируется сразу после загрузки эксперта или индикатора. Функция OnInit() используется для инициализации. Если OnInit() имеет возвращаемое значение типа int, то ненулевой код возврата означает неудачную инициализацию и генерирует событие Deinit с кодом причины деинициализации REASON_INITFAILED.

Результат выполнения функции OnInit() анализируется исполняющей подсистемой терминала только в том случае, если программа скомпилирована с использованием #property strict."

 
Mislaid:

Проще: return( -1 ); Это не позволит повесить второй эксперт

"Событие Init генерируется сразу после загрузки эксперта или индикатора. Функция OnInit() используется для инициализации. Если OnInit() имеет возвращаемое значение типа int, то ненулевой код возврата означает неудачную инициализацию и генерирует событие Deinit с кодом причины деинициализации REASON_INITFAILED.

Результат выполнения функции OnInit() анализируется исполняющей подсистемой терминала только в том случае, если программа скомпилирована с использованием #property strict."

В МТ5 да, в МТ4 встречал дальнейшее выполнение. Лучше прописать ExpertRemove()

 
Dmitriy Gizlyk:

В МТ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.312 Script 110 EURUSD,H1: removed
2018.03.04 20:30:14.312 110 EURUSD,H1: uninit reason 8
2018.03.04 20:30:14.312 110 EURUSD,H1: initialization failed (-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