[MQL4] Функция проверяет свободен ли Magic номер

romanzif

Постоялец
Команда форума
Администратор
Форекс робот VolnaFX
Монет
23,220
Очень часто пользователи советников забывают менять Magic номер.
А мы знаем, к чему это может привести.
Может поломаться вся логика советника который работает с серией ордеров или принимает решения на основе уже закрытых ордеров.
Смешать ордера с разных графиков и т.д.

Предлагаю в функции onInit() вызывать функцию проверку использовался или используется Magic номер который задан в советнике.

Код:
int OnInit()
{
   if (CheckMagic())
   {
      Alert("Этот Magic номер уже занят. Пожалуйста введите другой");
      return(INIT_PARAMETERS_INCORRECT);
   }
}
Если функция возвращает TRUE, то данный Magic уже занят и нужно вывести сообщение трейдеру.

Код:
//+------------------------------------------------------------------+
bool CheckMagic()
{
   for (int i=OrdersTotal()-1; i >= 0; i--) // проверяем ордера в рынке
   {
      if (OrderSelect(i,SELECT_BY_POS))
      {
         if (OrderMagicNumber() == Magic) return(true);
      }
   }
 
   for (int i=OrdersHistoryTotal()-1; i >= 0; i--) // проверяем закрытые ордера
   {
      if (OrderSelect(i,SELECT_BY_POS, MODE_HISTORY))
      {
         if (OrderMagicNumber() == Magic) return(true);
      }
   }
     
   return(false);    
}
//+------------------------------------------------------------------+
 

UASpace

Новенький
Форумчанин
Монет
935
Очень полезная функция, спасибо!
Но у меня вот какие мысли, в вашей функции нет проверки символа, на котором установлен советник. Это не даст установить советник на разные инструменты с одинаковым мейджиком. Я часто использую один мейджик, торгуя советником на разных инструментах по одной ТС.
Думаю, целесообразно добавить проверку символа в функцию, ну или добавлять в советник в настройки флаг например так:
Контролировать Magic номер = true или false
 

romanzif

Постоялец
Команда форума
Администратор
Форекс робот VolnaFX
Монет
23,220
Я специально не проверяю символ так как считаю что одинакового меджика не должно быть вообще.
 

UASpace

Новенький
Форумчанин
Монет
935
Я специально не проверяю символ так как считаю что одинакового меджика не должно быть вообще.
Если учитывать то, что советниками, часто, пользуются неопытные трейдеры, тогда Вы однозначно правы.
Но у меня еще вопрос. Функция OnInit() срабатывает не только при первом старте советника, но и при изменении и сохранении настроек. А значит, если будет открыта хоть одна сделка, то при изменении настроек советник определит, что его же меджик занят и предложит изменить меджик. Этот момент решить можно, добавив проверку первого запуска. А вот как быть, если ВПС после выхода обновления ОС попросит перезагрузки? Тогда, при повторном запуске, советник откажется работать со своими же ордерами. Или я чего то не понимаю?
 

romanzif

Постоялец
Команда форума
Администратор
Форекс робот VolnaFX
Монет
23,220
Если учитывать то, что советниками, часто, пользуются неопытные трейдеры, тогда Вы однозначно правы.
Но у меня еще вопрос. Функция OnInit() срабатывает не только при первом старте советника, но и при изменении и сохранении настроек. А значит, если будет открыта хоть одна сделка, то при изменении настроек советник определит, что его же меджик занят и предложит изменить меджик. Этот момент решить можно, добавив проверку первого запуска. А вот как быть, если ВПС после выхода обновления ОС попросит перезагрузки? Тогда, при повторном запуске, советник откажется работать со своими же ордерами. Или я чего то не понимаю?
Да, вы правы.
Тогда предлагаю убрать строку
Код:
return(INIT_PARAMETERS_INCORRECT);
и просто выводить предупреждение, тогда человек понимает это он перезапускает советник и надо подхватить ордера или проглядел и поставил случайно магик который занят на другом графике
 

UASpace

Новенький
Форумчанин
Монет
935
Да, вы правы.
Тогда предлагаю убрать строку
Код:
return(INIT_PARAMETERS_INCORRECT);
и просто выводить предупреждение, тогда человек понимает это он перезапускает советник и надо подхватить ордера или проглядел и поставил случайно магик который занят на другом графике
Да, так наверное и нужно, вот только бы придумать, так, что бы при совпадении меджика выскакивало маленькое окошко с предупреждением и двумя кнопкапи, например "Продолжить" и "Отмена" и при отмене возвращаться в меню настроек. Ну или что то подобное) Как такое делать, я не знаю, но при необходимости можно погуглить. Главное, что сама идея проверки меджика хорошая, остальное, дело техники:)
 
Последнее редактирование:

romanzif

Постоялец
Команда форума
Администратор
Форекс робот VolnaFX
Монет
23,220
Да, тек наверное и нужно, вот только бы придумать, так, что бы при совпадении меджика выскакивало маленькое окошко с предупреждением и двумя кнопкапи, например "Продолжить" и "Отмена" и при отмене возвращаться в меню настроек. Ну или что то подобное) Как такое делать, я не знаю, но при необходимости можно погуглить. Главное, что сама идея проверки меджика хорошая, остальное, дело техники:)
насколько я понимаю Метатрейдер не даст такое окошко сделать.
возможно ошибаюсь
 

UASpace

Новенький
Форумчанин
Монет
935
насколько я понимаю Метатрейдер не даст такое окошко сделать.
возможно ошибаюсь
Тогда, как вариант, сделать паузу в выполнении на некоторое время, 30-60 сек. функцией Sleep(30000); Тогда вероятность, что пользователь обратит внимание на предупреждение, возрастет.
Или, добавить в функцию только контроль первого запуска, а в настройки советника добавить пунктик, например: "Включить контроль Magic номера", и по умолчанию поставить true. Это немного усложнит пользование советником, но решит проблему как корректной работы советника при изменении настроек, так и проблему перезапуска.
 

Сигналы

Заработок онлайн

Верх