mql4 события

 

Нужна Ваша помощь. Есть советник на 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;

        }

     }

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