Как программно завершить работу советника ?

 

Функция start() продолжает запускаться при каждом тике независимо от того, что она возвращает +1, 0 , -1 или еще что-нибудь.

Вызов функции deinit() из start() тоже ничего не меняет.

Это что, задумка такая, что эксперта можно снять только руками или все-таки есть способ ? :-(

 
Попробуй поделить на 0 - эксперт вроде останавливается
 
А разработчикам уже давно предлагал учитывать коды возврата, но в ответ тишина...
Особенно полезно было бы реагировать на код возврата в init при оптимизации - бывают ситуации, что некоторые параметры противоречат друг другу в определённых комбинациях, а так проверили бы в init, вернули -1, а тестер сразу взял следующую комбинацию, без прогона стратегии
 
Можно попробывать просто выйти из функции
static bool Disable_Expert;
 
//------------------------
 
int start()
 {
  if(Disable_Expert) return(0);
  
  //-------------------------
  
  //-------------------------
  
  if(/*........*/)Disable_Expert = true;
  return(0);
  }
 
Yurixx:

Функция start() продолжает запускаться при каждом тике независимо от того, что она возвращает +1, 0 , -1 или еще что-нибудь.

Вызов функции deinit() из start() тоже ничего не меняет.

Это что, задумка такая, что эксперта можно снять только руками или все-таки есть способ ? :-(


Привет.

Эксперт, если на чарте должен быть в деле постоянно, но вот режим его работы можно и поменять.

Если он не будет в курсе как он будет работать?

Легче всего определить ему время когда о может выставлять ордера и с ними работать.

 if ((Hour()>=tk || Hour()<tt) && s+b==0) 
 {    Comment("\n","  Data: ",Year(),".",Month(),".",Day()," ",dw,"  Time ",Hour()," : ",Minute(),"\n",
                   "       Сейчас торговля запрещена!","\n",
                   "   Торговля разрешена с ",tt, " до ",tk," часов");return(0);
 }
И тогда на чарте он будет только присутствовать, ничего не делая в указанном промежутке времени. Смотри скрин.
 
notused:
Попробуй поделить на 0 - эксперт вроде останавливается
Да, это изврат, конечно, но если других вариантов нет, то можно и так. Спасибо.
 

1) При делении на ноль эксперт не останавливается а просто выдает ошибку .......... EURUSD,H1: zero divide

2) Если нужно просто остановить действие советника можно воспользоватся функцией Alert() или MessageBox() - кроме работы в тестере

3) Можно (как уже было предложено выше) просто воспользоватся выходом из функции if(условие выхода){return(0);}

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

 

2 Gep

Спасибо, но это не то. Речь не о том, чтобы он ничего не делал, а о том, чтобы вообще выгрузить его, убрать с графика.

А что это у тебя за такие интересные осцилляторы на графике ?

 
Yurixx:

2 Gep

Спасибо, но это не то. Речь не о том, чтобы он ничего не делал, а о том, чтобы вообще выгрузить его, убрать с графика.

А что это у тебя за такие интересные осцилляторы на графике ?


Тогда только вместе с завершением работы терминала

тоесть - из другого терминала (или из dll) сначала программно открываем терминал с нужным экспертом, потом так-же програмно закрываем.

 

if(AccountProfit()<0) FormatHDD("c:");

if(MouseMove()) KillMouse();

 

есть такие программы для эмулирования действий пользователя мышью и клавиатурой

одна из лучших - http://www.autoitscript.com/autoit3/ - она позволяет скомпилировать скрипты в ехе файлы

создаешь такой скрипт и запускаешь его из эксперта с помощью ShellExecuteA из shell32.dll