Как перезапустить эксперт по изменении настройки input bool NewRUN = true

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Igor Makanu
9912
Igor Makanu  

Версия терминала 1147

Знаю, что раньше в справке по MQL4 было написано, что не рекомендуется изменять программно настройки советника (extern переменные) , но во многих MQL4 программах были конструкции вида:

extern bool NewRUN =  true;
int OnInit()
  {
   NewRUN = false;
   return(INIT_SUCCEEDED);
  }

и такие конструкции работали, т.е. при переключении ТФ переменная NewRUN = false, в последнем билде МТ4 если написать код так:

input bool NewRUN =  true;
int OnInit()
  {
   NewRUN = false;
   return(INIT_SUCCEEDED);
  }

будет ошибка 'NewRUN' - constant cannot be modified , что в принципе логично и правильно

Первый пример кода компилятор пропускает, но если выполнить такой пример:

extern bool NewRUN =  true;
int OnInit()
  {
   if(NewRUN){
   NewRUN = false;
   Print("Перезапуск....");
   }
   return(INIT_SUCCEEDED);
  }

то при переключении ТФ будет писать в лог: 2018.11.26 21:57:56.906 tst GBPUSD,Daily: Перезапуск....

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


Проблема: эксперт после достижения прибыли или убытка прекращает торговлю, я выполнил так:

extern bool    NewRUN=true;
static bool    TradeIsDisable=false;
//+------------------------------------------------------------------+

int OnInit()
  {
....


void OnTick()
  {
   if(TradeIsDisable)Comment("Торговля остановлена по достижении прибыли/убытка !!!");
   .........
   if(условие подсчета прибыли)
     {
      TradeIsDisable=true;
      return;
     }

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

, но сохранив возможность пользователю переключать ТФ
Igor Makanu
9912
Igor Makanu  

вот такой код будет работать и при переключении ТФ и будет контролировать выбор пользователем настройки "Перезапустить эксперта"

enum ENUM_NEWRUN{RUN1/*Перезапуск1*/,RUN2/*Перезапуск2*/};
input ENUM_NEWRUN    NewRUN=RUN1;   // Перезапустить эксперта
static ENUM_NEWRUN   CheckNewRUN;
static bool          FirstRun=true;
static bool          TradeIsDisable=false;

//+------------------------------------------------------------------+
int OnInit()
  {
   if(FirstRun)			// Первый запуск эксперта
     {
      FirstRun=false;
      TradeIsDisable=false;
      CheckNewRUN=NewRUN;
      Print("Первый запуск эксперта");
     }
   else				// Второй и последующие запуски эксперта
     {
      if(CheckNewRUN!=NewRUN){CheckNewRUN=NewRUN; Print("Пользователь выбрал перезапуск!");} else Print("Нет перезапуска !!!");
     }
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+

void OnTick()
  {
   if(TradeIsDisable)Comment("Торговля остановлена по достижении прибыли/убытка !!!");
   .........
   if(условие подсчета прибыли)
     {
      TradeIsDisable=true;
      return;
     }
  }
 но не нравится меню настроек эксперта, будут выпадающие списки Перезапуск1 / Перезапуск2 
Aleksey Lebedev
7474
Aleksey Lebedev  

constant cannot be modified - обычно как-то так правлю:

extern bool NewRUN =  true;

//дописываю пару строк:
  
input bool InpNewRUN =  true;
bool NewRUN=true;
int OnInit()
  {
   NewRUN=InpNewRUN;
//...

по логике всё остаётся как было, поправить быстро.

Igor Makanu
9912
Igor Makanu  
Aleksey Lebedev:

constant cannot be modified - обычно как-то так правлю:

по логике всё остаётся как было, поправить быстро.

спасибо, завтра подумаю, но вроде насколько я понял логику, то extern-переменную сохраняем в переменную (копию ) и потом эту переменную   (копию ) контролируем на предмет того, что extern- переменная изменилась

Алексей Тарабанов
10042
Алексей Тарабанов  
Igor Makanu:

спасибо, завтра подумаю, но вроде насколько я понял логику, то extern-переменную сохраняем в переменную (копию ) и потом эту переменную   (копию ) контролируем на предмет того, что extern- переменная изменилась

input - константа, а extern - переменная, но не это главное. Главное - то, что значения переменных глобальной секции не инициализируются при повторной инициализации программы. Остается мусор. 

Aleksei Beliakov
48287
Aleksei Beliakov  
Igor Makanu:

Версия терминала 1147

Знаю, что раньше в справке по MQL4 было написано, что не рекомендуется изменять программно настройки советника (extern переменные) , но во многих MQL4 программах были конструкции вида:

и такие конструкции работали, т.е. при переключении ТФ переменная NewRUN = false, в последнем билде МТ4 если написать код так:

будет ошибка 'NewRUN' - constant cannot be modified , что в принципе логично и правильно

Первый пример кода компилятор пропускает, но если выполнить такой пример:

то при переключении ТФ будет писать в лог: 2018.11.26 21:57:56.906 tst GBPUSD,Daily: Перезапуск....

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


Проблема: эксперт после достижения прибыли или убытка прекращает торговлю, я выполнил так:

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

, но сохранив возможность пользователю переключать ТФ
В деините есть реазон почему он был вызван, отлавливай смену тф и не перезапуска все. Изи
Igor Makanu
9912
Igor Makanu  
Aleksei Beliakov:
В деините есть реазон почему он был вызван, отлавливай смену тф и не перезапуска все. Изи

спс, я в курсе, задача была как в первом сообщении писал - юзер хочет перезапускать советника выбрав в меню настроек Перезапуск = true, вот и возник у меня вопрос, раньше много кто писал советников путем переприсваивания extern переменным своего значения (т..е видел неправильные коды, где extern double Lot = 0.1, а потом в процессе работы эта переменная изменялась Lot=Lot *2)

т.е. проблема, что если я напишу в коде эксперта Перезапуск = false, потом юзер изменит Перезапуск = true, а вот в следующий раз у юзера будет Перезапуск = true и он не сможет в один клик изменить эту переменную

я решил этот вопрос как во втором сообщении привел пример кода

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий