Как остановить выполнение программы, пока не выполнено условие ?

 

Здравствуйте.

Задача:  в OnInit()   выводится на график  "поле ввода"  OBJ_EDIT.   Нужно сделать так, чтоб пока в поле ввода не введена никакая информация, программа дальше не выполнялась.

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

Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов
  • www.mql5.com
Типы объектов - Константы объектов - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Это не в OnInit делается. Классическая FSM:

int state=INITIAL_STATE;

int OnInit() {

state=RestoreOldState(); // восстанавливаем прежнее состояние, на момент до рестарта совентника

}

void  OnTick() {

if (state==INITIAL_STATE) {

// пока состояние "не до конца стартанули" - ни чего и делать

DoNothing();

return;

}

}

void OnChartEvent(....) {

if (sparam==MY_EDIT && ... )  {

state=READY_TO_RUN;

        }

}

void OnDeinit(const int reason) {

SaveState();

}

PS/ пристрелите уже веб-мастера наконец-то... Единственный сайт где стиль <code></code> сжирает отступы. 
 
Aleksandr Slavskii:

Здравствуйте.

Задача:  в OnInit()   выводится на график  "поле ввода"  OBJ_EDIT.   Нужно сделать так, чтоб пока в поле ввода не введена никакая информация, программа дальше не выполнялась.

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

А чем обработка событий в OnChartEvent не нравится?

 
Maxim Kuznetsov:


Делайте как положено, а не задом наперед. Делать так: код вставлять через кнопку  Code

Вот результат (предварительно код причёсан стилизатором) - и оказывается, что никто никакие пробелы не кушает. 

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2020, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
int state=INITIAL_STATE;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   state=RestoreOldState(); // восстанавливаем прежнее состояние, на момент до рестарта совентника
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void  OnTick()
  {
   if(state==INITIAL_STATE)
     {
      // пока состояние "не до конца стартанули" - ни чего и делать
      DoNothing();
      return;
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnChartEvent(....)
  {
   if(sparam==MY_EDIT && ...)
     {
      state=READY_TO_RUN;
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   SaveState();
  }
//+------------------------------------------------------------------+

Просто делайте как полагается, а не как вздумается.

 
Maxim Kuznetsov:

Это не в OnInit делается. Классическая FSM:

int state=INITIAL_STATE;

int OnInit() {

state=RestoreOldState(); // восстанавливаем прежнее состояние, на момент до рестарта совентника

}

void  OnTick() {

if (state==INITIAL_STATE) {

// пока состояние "не до конца стартанули" - ни чего и делать

DoNothing();

return;

}

}

void OnChartEvent(....) {

if (sparam==MY_EDIT && ... )  {

state=READY_TO_RUN;

        }

}

void OnDeinit(const int reason) {

SaveState();

}

PS/ пристрелите уже веб-мастера наконец-то... Единственный сайт где стиль <code></code> сжирает отступы. 

Спасибо, мне ваше решение нравится)))

 
Aliaksandr Hryshyn:

А чем обработка событий в OnChartEvent не нравится?

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

А как мне в этом может помочь  OnChartEvent , я не знаю.

 
Aleksandr Slavskii:

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

А как мне в этом может помочь  OnChartEvent , я не знаю.

CHARTEVENT_OBJECT_ENDEDIT

 
Andrey Barinov:

CHARTEVENT_OBJECT_ENDEDIT

Ну по сути то, хоть так хоть эдак а всё равно получается бесконечный цикл. Код предложенный Maxim Kuznetsov по сути тот же бесконечный цикл с интервалом равным времени прихода следующего тика.

Что то у меня отладка не хочет нормально работать, не могу проверить.

Вот такая конструкция будет работать?  Просто я не знаю точно, пока не прошла инициализация советника, обрабатываются ли события?

bool state = false;
//+------------------------------------------------------------------+
int OnInit()
  {
   EditCreate();
   while(!state)
      Sleep(3000);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // идентификатор события   
                  const long& lparam,   // параметр события типа long 
                  const double& dparam, // параметр события типа double 
                  const string& sparam  // параметр события типа string 
                  ) 
  {
   if(id==CHARTEVENT_OBJECT_ENDEDIT) 
      state = true;
  }
//+------------------------------------------------------------------+
P.S. не будет работать, так как чтоб зайти в OnChartEvent, надо сначала выйти из цикла, а он бесконечный.
 
Aleksandr Slavskii:
bool flag;
//+------------------------------------------------------------------+
int OnInit()
 {
   flag= true;
   ...
   return(INIT_SUCCEEDED);
 }

void OnTick()
 {
   if(flag) {
    if(ObjectGetString(0,"name",OBJPROP_TEXT,0)=="") {
     Alert("Заполните значением");// можно обернуть паузой в 5 секунд, но не Sleep()
     OnInit();
     return;
    } else {
     flag=false;
    }
   }
  ...
 }
 
Vitaly Muzichenko:

Sleep()  в OnInit()  действительно нельзя, в тестере вызывает ошибку.

Думал кратенько описать задачу будет достаточно, но...

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

Вот я хотел написать код, чтоб он его мог вставить в советник/индикатор скомпилировать и всё, индикатор/советник не стартанёт без ключа.

У друга уровень понимания кода на уровне , "ух ты буковки!!!".  И объяснять ему, что это надо вставить сюда, а это туда, довольно таки сложно и долго. 

Вот мне надо, чтоб пока не заполнено "поле ввода", советник не стартовал, при этом надо, чтоб код в советник можно было скопировать в два клика.

Просто лениво писать скрипт который сам будет изменять нужный советник. Хотя если не найду простого решения, придётся так делать.


// можно обернуть паузой в 5 секунд, но не Sleep()

вот это не понял.  Как обернуть паузой?


P.S. " Sleep()  в OnInit()  действительно нельзя, в тестере вызывает ошибку."

На самом деле ошибку вызывал бесконечный цикл, а не Sleep().

Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов
  • www.mql5.com
Типы объектов - Константы объектов - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Aleksandr Slavskii:

Sleep()  в OnInit()  действительно нельзя, в тестере вызывает ошибку. ...

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


Sleep в индикаторах вообще не работает. Так что вам правильно показали коды. Пишите через флаг, или STATE.

Причина обращения: