Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Dmytro Zelenskyy
15139
Dmytro Zelenskyy  

МТ4

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

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

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

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

fxsaber
12139
fxsaber  
ChartSaveTemplate + парсинг имени советника.
Dmytro Zelenskyy
15139
Dmytro Zelenskyy  
fxsaber:
ChartSaveTemplate + парсинг имени советника.

Дельно, спасибо.

Dmytro Zelenskyy
15139
Dmytro Zelenskyy  

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


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);
}
Andrey Khatimlianskii
60179
Andrey Khatimlianskii  
Dmytro Zelenskyy:

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

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

Dmytro Zelenskyy
15139
Dmytro Zelenskyy  
Andrey Khatimlianskii:

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

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

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

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

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

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

ExpertRemove()

вместо

return

Комбинатор
17145
Комбинатор  

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

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

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

Andrey Khatimlianskii
60179
Andrey Khatimlianskii  
Комбинатор:

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

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

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

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

Mislaid
636
Mislaid  
Dmytro Zelenskyy:

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

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

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

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

ExpertRemove()

вместо

return

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

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

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

Dmitriy Gizlyk
17280
Dmitriy Gizlyk  
Mislaid:

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

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

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

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

Mislaid
636
Mislaid  
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



Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий