Особенности языка mql5, тонкости и приёмы работы - страница 178

 
Andrey Barinov:

Там где не работает ExpertRemove - еще есть ChartClose(). Я не понимаю в чем проблема. Что происходит после смены счета? Появляется доп чарт с советником? Или просто символ текущего чарта меняется? Может меняется ChartID и поэтому Ваше предыдущее решение не работает? Тики то полюбому обрабатываются, значит нужно выгружаться в ОнТик, если ОнИнит не происходит.

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

Дошел до такого рабочего решения.

#include <fxsaber\Expert.mqh> // https://www.mql5.com/ru/code/19003

// Выгружает себя, если после смены счета отсутствует символ.
void OnDeinit( const int Reason )
{
  if (Reason == REASON_ACCOUNT)
  {
    MqlTick Tick;
    
    if (!SymbolInfoInteger(_Symbol, SYMBOL_CUSTOM) && !SymbolInfoTick(_Symbol, Tick))
    {
      Alert("Account is changed!");
      
      if (EXPERT::Remove())
        Alert("Expert is removed!");
      
      // ExpertRemove(); // Не поможет.
      // ChartClose();   // Не лучшее решение.
    }
//  else
      // Для кастомных и других случаев дополнить код следущим решением.
      // https://www.mql5.com/ru/forum/170952/page175#comment_16365819    
  }  
}


ЗЫ Требовалось для боевого советника.

 
fxsaber:

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

Исходник будет позже. Сначала проверьте это-ли для вас особенности.

 
Alexey Viktorov:

Исходник будет позже. Сначала проверьте это-ли для вас особенности.

Запустил. Не работает.

2020.05.21 10:49:58.028 00 (EURUSD,M1)  Идиот
2020.05.21 10:49:58.028 00 (EURUSD,M1)  ExpertRemove() function called

Видимо, это уже тенденция, использовать русские слова в логе.

 
fxsaber:

Запустил. Не работает.

Видимо, это уже тенденция, использовать русские слова в логе.

Это не логи. Я не хотел вас обидеть. Это я пишу для себя, когда чего-то не получается. А потом забыл удалить.

Если вы ожидали не то чего просили, то увольте. Вы хотели удалить советник с графика при смене счёта, это советник выполняет. Как не работает у вас я знать не хочу.
 
Alexey Viktorov:

Это не логи. Я не хотел вас обидеть. Это я пишу для себя, когда чего-то не получается. А потом забыл удалить.

Найдете рабочее решение, отличное от предложенного, будет интересно посмотреть.

 
Alexey Viktorov:

Вы хотели удалить советник с графика при смене счёта, это советник выполняет.

К сожалению, не выполняет.



Вообще, вызов ExpertRemove при REASON_ACCOUNT - абсолютно бессмысленная вещь.

 
fxsaber:

К сожалению, не выполняет.



Вообще, вызов ExpertRemove при REASON_ACCOUNT - абсолютно бессмысленная вещь.

Если вы не новичок, то должны знать, что советник работает только с графиком. Без графика работает только сервис. Как он работает ??? дерзайте.

 
Alexey Viktorov:

Если вы не новичок, то должны знать, что советник работает только с графиком. Без графика работает только сервис. Как он работает ??? дерзайте.

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

 
fxsaber:

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

Ну да. Компетентных тут только один.

 

Как вариант.

int OnInit(void)
{
     string name_global = "exp_account";
     if( GlobalVariableCheck(name_global) )
     {
          if( AccountInfoInteger(ACCOUNT_LOGIN) !=  GlobalVariableGet(name_global) )
               if( GlobalVariableDel(name_global) )
                    ExpertRemove();
     }
     else
          GlobalVariableSet( name_global, AccountInfoInteger(ACCOUNT_LOGIN) );

     return(INIT_SUCCEEDED);
}
Причина обращения: