Подскажите, возможно ли из советника отключить его самого?

 
Доброго всем дня! Возникла необходимость по завершении определённого болка программы остановить советника, выключить его, т.е. чтобы не передавалась команда return к новому циклу его работы. Как это можно сделать (если можно вообще)? Скажем, в бейсике или фортране был, если мне память не изменяет, такой оператор stop...
 
startdata:
Доброго всем дня! Возникла необходимость по завершении определённого болка программы остановить советника, выключить его, т.е. чтобы не передавалась команда return к новому циклу его работы. Как это можно сделать (если можно вообще)? Скажем, в бейсике или фортране был, если мне память не изменяет, такой оператор stop...

Насколько я знаю, такой возможности нет.
 

Я, конечно, не спец. в мкл, но интуиция подсказывает мне: можно попробывать каким-то образом разместить ссылку на deinit внутри функции start. Но как это сделать я сам не знаю)

 
startdata:
Доброго всем дня! Возникла необходимость по завершении определённого болка программы остановить советника, выключить его, т.е. чтобы не передавалась команда return к новому циклу его работы. Как это можно сделать (если можно вообще)? Скажем, в бейсике или фортране был, если мне память не изменяет, такой оператор stop...
Можно примерно так
bool stop=false;
 
int start()
{
  if (stop) return(0);
 
  ....
// Ваш блок----
 {
 
  if (тра-та-та...  завершении определённого болка программы) {stop=true; return(0);}
 }
//--------------
 
}
 
startdata:
Доброго всем дня! Возникла необходимость по завершении определённого болка программы остановить советника, выключить его, т.е. чтобы не передавалась команда return к новому циклу его работы. Как это можно сделать (если можно вообще)? Скажем, в бейсике или фортране был, если мне память не изменяет, такой оператор stop...


В нынешней реализации MQL4 для любой прикладной программы порядок запуска на исполнение специальных функций определяется их собственными свойствами (Учебник по MQL4 Программа на MQL4 Специальные функции ). Для советника это значит, что клиентский терминал будет запускать функцию start() на каждом тике, поэтому единственный способ отключить какие бы то ни было активные действия программы состоит в составлении правильного алгоритма.

Например, когда наступают заданные условия, можно присвоить некоторой глобальной переменной некоторое значение, означающее запрет. При каждом запуске функции start() это значение должно быть проанализировано и в зависимости от значения должен исполняться или не исполняться основной код:

bool Work = true;    // Глобальная переменная
int start()
   {
   if (Work == true) // Если нет запрета, то исполнять основной код
      {
      // Здесь основной код программы
      // Здесь основной код программы
      // Здесь основной код программы
      // А где-нибудь, например, в конце программы анализатор:
      if (/*здесь условия, при которых уже не надо работать*/)
         {
         Work = false;// Это означает запрет, т.е. отныне не исполнять основной код
         }      
      }
   return;
   }
Обратите внимание, переменная Work должна быть глобальной (Учебник по MQL4 Переменные Виды переменных ).
 
Antitak:

Я, конечно, не спец. в мкл, но интуиция подсказывает мне: можно попробывать каким-то образом разместить ссылку на deinit внутри функции start. Но как это сделать я сам не знаю)


Из функции start() вызвать на исполнение функцию deinit() можно как и любую другую функцию. Функция deinit() будет исполнена, но это не приведёт к закрытию программы. В MQL4 нет программного способа выгрузить программу из окна финансового инструмента (за исключением скриптов, в которых функция start() исполняется всего один раз, после чего скрипт выгружается - это свойство скрипта).
 
SK. писал (а):
В нынешней реализации MQL4 для любой прикладной программы порядок запуска на исполнение специальных функций определяется их собственными свойствами (Учебник по MQL4 Программа на MQL4 Специальные функции ). Для советника это значит, что клиентский терминал будет запускать функцию start() на каждом тике, поэтому единственный способ отключить какие бы то ни было активные действия программы состоит в составлении правильного алгоритма.

Блин, а вот хоть чуть логики обнародуйте почему так сделано. Что нельзя было сделать например return ( -1 ) это означает, завершение по ошибке.


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

int Exit ( )
{  
   int a,b;
   b=0;
   a=a/b;
   return (a);
}
 
MProgrammer:

Блин, а вот хоть чуть логики обнародуйте почему так сделано. Что нельзя было сделать например return ( -1 ) это означает, завершение по ошибке.

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

На самом деле ответ очевиден: аппетит приходит во время еды.

Ещё несколько лет назад вообще никто не собирался заниматься автотрейдингом. Сегодня возможности платформы не отвечают аппетитам пользователей. Может быть, поэтому в MQ разрабатывается MQL5..

Логика очень простая. Когда мы, как потребители, берём что-то в использование, нам зачастую кажется, что так и должно быть. В некоторых случаях мы недовольны (вот лично мне не нравится бардачок во всех современных автомобилях, который, ну всенепременнейше, делают ниже коленки; вот, не могу я этого понять - хоть тресни; почему не сделать повыше, на уровне груди, чтоб можно было заглянуть вовнутрь, не опуская голову под коленку?).

Когда мы (они), как разработчики, проектируем нечто с нуля - нечто такое, чего ещё не было в природе, - то нам очень трудо заранее предусмотреть все возможные неудобства, - некоторые из них вылазят когда дело уже сделано, т.е. на этапе эксплуатации. Может быть, поэтому разработчики поощряют высказывания пользователей в теме Пожелания к MQL5..

 

Вообще,(раз пошёл такой разговор...) в языке не хватает каких-то элементарностей - типа тех же функций, как stop, или организация подпрограмм и безусловных переходов на строки, как в нормальных языках высоного уровня, типа бейсик или фортран с паскалем. А насчёт выключения советника при определённых условиях - судя по всему, из моего советника проще запустить сторонний виндосовский скрипт на выполнение, который элементарно будет нажимать кнопку управления советником в МТ4. По меньшей мере, в моём случае такой способ, видимо, наиболее привлекателен.....

 

Или всё таки запробую то, что предложили уважаемые Figar0 и SK. Надо как следует разобраться... Всем огромное спасибо за советы!!!!!

 
Глобальная переменная, файл как семафор.
Причина обращения: