Нужна Ваша помощь. Есть советник на mql4. Кнопкой Start запускается цыкл. Подскажите, пожалуйста, как выйти из цыкла при нажатии на кнопку "Stop"? Функция  funStop() срабатывает

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

//+----------------- Button

void PutButton(string name,int x,int y,string text,int fontsize,color colortext,color colorfon,int width,int heigh)

  {

   ObjectCreate(0,name,OBJ_BUTTON,ChartWindowFind(),0,0);

   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);

   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);

   ObjectSetInteger(0,name,OBJPROP_XSIZE,width);

   ObjectSetInteger(0,name,OBJPROP_YSIZE,heigh);

   ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_LEFT_LOWER);

   ObjectSetString(0,name,OBJPROP_TEXT,text);

   ObjectSetString(0,name,OBJPROP_FONT,"Arial");

   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,fontsize);

   ObjectSetInteger(0,name,OBJPROP_COLOR,colortext);

   ObjectSetInteger(0,name,OBJPROP_BGCOLOR,colorfon);

   ObjectSetInteger(0,name,OBJPROP_BORDER_COLOR,Blue);

   ObjectSetInteger(0,name,OBJPROP_BACK,false);

   ObjectSetInteger(0,name,OBJPROP_STATE,false);

  }

//-------< flags >------------------------------------

bool gl_flStop=false;


//-------< названия графических обектов >-------------

string gl_nameObButtStart="Start";

string gl_nameObButtStop="Stop";

//+------------------------------------------------------------------+

int OnInit()

  {

   PutButton(gl_nameObButtStart,10,75,"Start",14,clrBlue,clrKhaki,60,60);

   PutButton(gl_nameObButtStop,100,75,"Stop",14,clrBlue,clrKhaki,60,60);

   return(INIT_SUCCEEDED);

  }

//+------------------------------------------------------------------+

void OnChartEvent(const int id,

                  const long &lparam,

                  const double &dparam,

                  const string &sparam)

  {

//--- проверим событие на нажатие кнопки мышки

   if(id==CHARTEVENT_OBJECT_CLICK)

     {

      string clickedChartObject=sparam;

      //--- Start

      if(clickedChartObject==gl_nameObButtStart)

        {

         funStart();

        }

      //--- Stop

      if(clickedChartObject==gl_nameObButtStop)

        {

         funStop();

        }

      ChartRedraw();// принудительно перерисуем все объекты на графике

     }

  }

//+------------------------------------------------------------------+

void funStart()

  {

   gl_flStop=false;

   for(int i=0; i<10; i++)

     {

      Sleep(200);

      Alert(i);

      if(gl_flStop==true) {break;}

     }

  }

//+------------------------------------------------------------------+

void funStop()

  {

   Alert("Stop");

   gl_flStop=true;

  }

//+------------------------------------------------------------------+


вот это замарочки - ну прям внутырь цикла и пиши в начало проверку на то не нажата ли кнопка стоп со всеми вытекающими - полноценный вызов из цикла той функции которая должна это проверять на каждом проходе цикла
supperUser29596:  Есть советник на mql4. Кнопкой Start запускается цыкл. Подскажите, пожалуйста, как выйти из цыкла при нажатии на кнопку "Stop"? Функция  funStop() срабатывает только после завершения цыкла, а мне надо что бы сразу при нажатии на кнопку выйти из цыкла.
void funStart()
  {
   Stop=false;
   for(int i=0; i<10; i++)
     {
      Sleep(200);
      Alert(i);
      if(Stop==true) {break;}
     }
  }
  Stop=false;
  for(int i=0; i<10; i++)
  {
    Alert(i);
    for(int k=0; k<40; k++)  // уменьшил задержку срабатывания в 40 раз
    {
      if(Stop) {break;}
      Sleep(5);
    }
      if(Stop) {break;}
  }

supperUser29596:

Нужна Ваша помощь. Есть советник на mql4. Кнопкой Start запускается цыкл. Подскажите, пожалуйста, как выйти из цыкла при нажатии на кнопку "Stop"? Функция  funStop() срабатывает

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

В тело цикла поставьте проверку нажатия кнопки 

if(ObjectSetInteger(0,name,OBJPROP_STATE,true))
 break;

и не забудьте вернуть значение

ObjectSetInteger(0,name,OBJPROP_STATE,false);

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

mql4 события

STARIJ, 2018.03.14 17:41

  Stop=false;
  for(int i=0; i<10; i++)
  {
    Alert(i);
    for(int k=0; k<40; k++)  // уменьшил задержку срабатывания в 40 раз
    {
      if(Stop) {break;}
      Sleep(5);
    }
      if(Stop) {break;}
  }


А это к чему?
Alexey Viktorov:

В тело цикла поставьте проверку нажатия кнопки 

и не забудьте вернуть значение

Thank you very much!!! Без Вашей помощи не разобрался бы, все работает) 

   for(int i=0; i<20; i++)

     {

      Sleep(200);

      Alert(i);

      

      if( ObjectGetInteger(0,gl_nameObButtStop,OBJPROP_STATE,true))

        {

         ObjectSetInteger(0,gl_nameObButtStop,OBJPROP_STATE,false);

         break;

        }

     }