Прервать выполнение эксперта при изменении входных параметров.

 

Прошу помощи у джедаев! :)

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

Чтобы предельно точно понять суть того о чем я толкую:

1) Запускаем на чарте такой вот код эксперта:

#property version "1.00"

input int Setting_ = 0;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   Print ("OnInit:",Setting_);
   
   return (INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   Print ("OnDeinit(",reason,"):",Setting_);
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   while (!_StopFlag)
   {
      Sleep(1000);
   }
}

2) Открываем окно настроек и меняем параметр "Setting_" на 1.

3) И применяем изменения (нажимаем ОК).

4) И видим, что нет перехода к ф-и OnDeinit. Т.е. мы не выходим из OnTick, а значит не продолжаем идти по цепи: OnTick->OnDeinit->OnInit->OnTick

Так вот, чтобы изменения применялись, должен выполниться OnInit, но OnInit не будет выполняться до тех пор, пока вычисления в OnTick(или в любой другой) не прекратятся.

На сколько я знаю, есть лишь проверка на остановку программы через _StopFlag (флаг остановки mql5-программы при ПОЛНОМ выходе), но это только для полного выхода. А вот как определить, что входные настройки изменились во время выполнения, чтобы остановить тяжелые вычисления и перейти к деиниту я не знаю.

Может кто из гуру сталкивался с такой ситуацией и смог решить ее?

Может у здешних джедаев есть какой-нибудь супер секретный хак? :)

 
Сразу предупреждаю, что гениальная идея про разбиение тяжелых вычислений на кусочки и применение таймера мной уже рассмотрены и отсеяны, т.к. для ряда задач требуют капитального геморроя! :)
 
Marat Sultanov:

1. И видим, что нет перехода к ф-и OnDeinit. Т.е. мы не выходим из OnTick, а значит не продолжаем идти по цепи: OnTick->OnDeinit->OnInit->OnTick


2. Так вот, чтобы изменения применялись, должен выполниться OnInit, но OnInit не будет выполняться до тех пор, пока вычисления в OnTick(или в любой другой) не прекратятся.

На сколько я знаю, есть лишь проверка на остановку программы через _StopFlag (флаг остановки mql5-программы), но это только для полного выхода.

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

Может кто из гуру сталкивался с такой ситуацией и смог решить ее?

Может у здешних джедаев есть какой-нибудь супер секретный хак? :)

1. Сразу на событии прихода тика Ваша программа входит в бесконечную спячку. Пока она спит, она не прекратит свою работу и не перейдет к функции DeInit(). 

2. Функция OnInit() всегда выполняется в первую очередь.

3. Сохраняйте посление настройки в файле, чтобы иметь возможность сравнить текущие настройки с последними.
 
Реter Konow:

1. Сразу на событии прихода тика Ваша программа входит в бесконечную спячку. Пока она спит, она не прекратит свою работу и не перейдет к функции DeInit(). 

2. Функция OnInit() всегда выполняется в первую очередь.

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


1. Само собой :) Мне это не нужно объяснять, т.к. я сделал это для простого примера эмуляции долгого вычисления, это всего лишь простейший пример для демонстрации...

2. Само собой :)

3. Какой смысл сохранять в файл настройки если мы можем инфу хранить в переменных глобальной области? Да и в любом случае, чем это может помочь нам: открыть *set файл настроек эксперта, распарсить его и сравнить его со старыми настройками? Так это не проканает, т.к. мы не сможем выйти за границы файловой песочницы.

 

в МТ4 всё работает... 

МТ5 - опять отличился)

 
Marat Sultanov:


1. Само собой :) Мне это не нужно объяснять, т.к. я сделал это для простого примера эмуляции долгого вычисления, это всего лишь простейший пример для демонстрации...

2. Само собой :)

3. Какой смысл сохранять в файл настройки если мы можем инфу хранить в переменных глобальной области? Да и в любом случае, чем это может помочь нам: открыть *set файл настроек эксперта, распарсить его и сравнить его со старыми настройками? Так это не проканает, т.к. мы не сможем выйти за границы файловой песочницы.

Одно дело долгие вычисления, другое дело - бесконечный цикл. У Вас второй вариант. Зайдя в него, выйти Вы уже не можете. Только снять программу с графика. 

Цепочка которую Вы описали не может работать. Сначала онинит, потом онтик. Деинит только при критической ошибке или снятии программы с графика. Ну или несистемный вызов еще. 


Честно говоря, не понимаю в чем сложность. Неподходящие входные настройки фильтруйте в условиях и все.

 
 
Marat Sultanov:


Возможно, Вы имеете ввиду, что пользователь меняет входные параметры в процессе исполнения долгих вычислений (например на граф. панели советника)? Если вычисления такие долгие, что их стоит отменять при изменении настроек, то внутри цикла этих вычислений нужно постоянно проверять флаг события изменения настроек и если событие произошло, -выходить из цикла вычислений.
 
Сейчас входные параметры изменяются только после выхода из On-функции.
 
fxsaber:
Сейчас входные параметры изменяются только после выхода из On-функции.

А разве изменение входных параметров не перезапускает советник? Я думал что программа перезагружается и все вычисления сами останавливаются.
 
fxsaber:
Сейчас входные параметры изменяются только после выхода из On-функции.

выход по стоп-флагу не работает (в мт5)