Как перезапустить советник с помощью функции?

 

Специалисты, помогите пожалуйста. Как перезапустить советник с помощью функции? Нужно стобы при определенном значении переменной, сова начинала работать сначала.

Что подставить вместо if(stop_expert == 1) return;

Вот что у нас есть

int OnInit()
{
   InitTradeTime();

   _request_timeout = request_timeout * 60;
   _request_wait_timeout = request_wait_timeout;
   _lot = AccountBalance() * risk/100;
   EventSetTimer(request_timeout);
   
   min_lot = MarketInfo(Symbol(),MODE_MINLOT);         // Минимальное количество лотов
   max_lot = MarketInfo(Symbol(),MODE_MAXLOT);         // Максимальное количество лотов  
   
   InitValues();   
   if(stop_expert == 1) return;
   if(trade_skip_by_start==Yes)
   {
      last_order_type = order_type;
   }
      
   CheckLastOrder(true);
   OnTick();
   OnTimer();
   return(INIT_SUCCEEDED);
}
 
Ivan Ovchinnikov:

Что подставить вместо if(stop_expert == 1) return;

if(stop_expert == 1)
   return INIT_FAILED;
Только это не перезапуск, выгрузка. Потом пользователь пусть сам снова запускает.
 
Ihor Herasko:
Только это не перезапуск, выгрузка. Потом пользователь пусть сам снова запускает.

Так не нужно. А что нельзя сделать, чтобы он сначала начал обработку событий?

 
К примеру нам не удалось получить некоторые значения и дальше советнику нет смысла выполняться. Надо чтобы он перезпустился и попытался снова.
 
Ivan Ovchinnikov:
К примеру нам не удалось получить некоторые значения и дальше советнику нет смысла выполняться. Надо чтобы он перезпустился и попытался снова.

Так если "нет смысла", то зачем пытаться? Что изменится от повторного расчета одних и тех же данных. 

Теоретически можно зациклить эту функцию. Но практически делать такое не рекомендуется. На то это и инициализация. К примеру, ждать каких-то данных по ценам здесь не стоит. Такое переносится в OnTick() или OnTimer().

 

Господа экстрасенсы! Не отклоняемся от темы. Вопрос сформулирован достаточно ясно:

"Что подставить вместо if(stop_expert == 1) return;"

 

Надо OnInit() переименовать, подшаманить чтобы возвращала truer/false, и вызывать ее из OnTick(). Еще переменная bool потребуется, если она false, то функция вызывается, как только функция вернула true, то переменной присваивается true и функция больше не будет вызываться.

void OnTick(){
        if(!strt){
                if(MyOnInit()){
                        strt=true;
                }
                else{
                        return;
                }
        }

...
}
 
Dmitry Fedoseev:

Надо OnInit() переименовать, подшаманить чтобы возвращала truer/false, и вызывать ее из OnTick(). Еще переменная bool потребуется, если она false, то функция вызывается, как только функция вернула true, то переменной присваивается true и функция больше не будет вызываться.

У меня другие сентенции. При старте терминала все советники получают виртуальный статус "disabled". Чтобы инициализировать советник необходимо совершить некоторые действия. 
 
Dmitry Fedoseev:

Надо OnInit() переименовать, подшаманить чтобы возвращала truer/false, и вызывать ее из OnTick(). Еще переменная bool потребуется, если она false, то функция вызывается, как только функция вернула true, то переменной присваивается true и функция больше не будет вызываться.

по идее можно-же и не переименовывать.. int OnInit() он и есть рядовая функция, но заодно и точка входа...

/// внутри OnTick()

if (OnInit()!=INIT_SUCCESSFULL) ExpertRemove();

else return;

только в самом OnInit() надо корректно всё инициализовать и помнить про RemoveReason

 
Ivan Ovchinnikov:

Специалисты, помогите пожалуйста. Как перезапустить советник с помощью функции? Нужно стобы при определенном значении переменной, сова начинала работать сначала.

Что подставить вместо if(stop_expert == 1) return;

Вот что у нас есть

Вместо return укажите код, приводящий к аварийному завершению советника и его рестарту. Это не сложно. 

 
Ivan Ovchinnikov:

Специалисты, помогите пожалуйста. Как перезапустить советник с помощью функции? Нужно стобы при определенном значении переменной, сова начинала работать сначала.

Что подставить вместо if(stop_expert == 1) return;

Вот что у нас есть

какой то не верный код у Вас, т.к. инициализация не произойдет а советник все равно работать будет  ......

советник можно перезапустить путем вызова OnInit из тела OnTick при некотором условии

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