Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2516

 
Здравствуйте! Мне нужно создать прямоугольник через клики мышки по графику. Как определить первую точку, я понимаю. Через использование lparam. Но когда я делаю клик во второй раз, то первый и второй получается одинаковыми. Подскажите, как сделать так, чтобы первый клик был с одной ценой, а второй клик был уже с другой ценой(Т.е они не должны быть равны)
Сейчас мой код выглядит примерно следующим образом:
void OnChartEvent(const int id,         // event ID  
                  const long& lparam,   // event parameter of the long type
                  const double& dparam, // event parameter of the double type
                  const string& sparam) // event parameter of the string type
  { 
  if(id==CHARTEVENT_CLICK){
  l=(int)lparam;
  }
  
  if(id==CHARTEVENT_CLICK){
  y=(int)lparam;
  Print(l + " " + y);
  }  
 } 
С точки зрения логики, я понимаю, что это не будет работать так, как мне нужно. Но своих знаний в программирование мне не хватает для решения данной проблемы. И Могли бы вы привести код, как быть в случае, если будет выглядеть код, если будет более двух нажатий на график. К примеру три(Для построения волна Эллиота или треугольника)

Ранее человек уже отвечал на этот вопрос, но я его не понял, поэтому задал его снова
 
Sergei Gurov #:
Здравствуйте! Мне нужно создать прямоугольник через клики мышки по графику. Как определить первую точку, я понимаю. Через использование lparam. Но когда я делаю клик во второй раз, то первый и второй получается одинаковыми. Подскажите, как сделать так, чтобы первый клик был с одной ценой, а второй клик был уже с другой ценой(Т.е они не должны быть равны)
Сейчас мой код выглядит примерно следующим образом:
С точки зрения логики, я понимаю, что это не будет работать так, как мне нужно. Но своих знаний в программирование мне не хватает для решения данной проблемы. И Могли бы вы привести код, как быть в случае, если будет выглядеть код, если будет более двух нажатий на график. К примеру три(Для построения волна Эллиота или треугольника)

Ранее человек уже отвечал на этот вопрос, но я его не понял, поэтому задал его снова
bool f_click=true;
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // event ID  
                  const long& lparam,   // event parameter of the long type
                  const double& dparam, // event parameter of the double type
                  const string& sparam) // event parameter of the string type
  { 
  if(f_click&&id==CHARTEVENT_CLICK){
  l=(int)lparam; f_click=false;
  }
  
  if(!f_click&&id==CHARTEVENT_CLICK){
  y=(int)lparam; f_click=true;
  Print(l + " " + y);
  }  
 } 
 
Sergei Gurov #:
Здравствуйте! Мне нужно создать прямоугольник через клики мышки по графику. Как определить первую точку, я понимаю. Через использование lparam. Но когда я делаю клик во второй раз, то первый и второй получается одинаковыми. Подскажите, как сделать так, чтобы первый клик был с одной ценой, а второй клик был уже с другой ценой(Т.е они не должны быть равны)
Сейчас мой код выглядит примерно следующим образом:
С точки зрения логики, я понимаю, что это не будет работать так, как мне нужно. Но своих знаний в программирование мне не хватает для решения данной проблемы. И Могли бы вы привести код, как быть в случае, если будет выглядеть код, если будет более двух нажатий на график. К примеру три(Для построения волна Эллиота или треугольника)

Ранее человек уже отвечал на этот вопрос, но я его не понял, поэтому задал его снова
void OnChartEvent(const int id,         // event ID  
                  const long& lparam,   // event parameter of the long type
                  const double& dparam, // event parameter of the double type
                  const string& sparam) // event parameter of the string type
  { 
  if(id==CHARTEVENT_CLICK){
  l=(int)lparam;
  }
  
  if(id==CHARTEVENT_CLICK && l>0){
  y=(int)lparam;
  Print(l + " " + y);
  }  
 } 

И после рисования переменную l надо обнулить для следующего прямоугольника…

 
Tretyakov Rostyslav #:
bool f_click=true; //+------------------------------------------------------------------+ void OnChartEvent(const int id,         // event ID                     const long& lparam,   // event parameter of the long type                   const double& dparam, // event parameter of the double type                   const string& sparam) // event parameter of the string type   {   if(f_click&&id==CHARTEVENT_CLICK){   l=(int)lparam; f_click=false;   }      if(!f_click&&id==CHARTEVENT_CLICK){   y=(int)lparam; f_click=true;   Print(l + " " + y);   }   }

Ваш способ к сожалению не работает. Выводит одинаковые данные 

 
Sergei Gurov #:

Ваш способ к сожалению не работает. Выводит одинаковые данные 

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

 
Извиняюсь, не указал это в прошлом сообщение. Я кликаю по разным точкам графика. Кликов будет более 2. Как тогда будет выглядеть код?
Один человек подсказал способ для двух точек, но не для трех
Для двух код выглядит так:
void OnChartEvent(const int id,         // event ID  
                  const long& lparam,   // event parameter of the long type
                  const double& dparam, // event parameter of the double type
                  const string& sparam) // event parameter of the string type
  { 
    static bool first_click = true;
    if(id==CHARTEVENT_CLICK) {
      if (first_clik) l = (int)lparam;
      else {
        y = (int)lparam;
        Print(l," ",y);
      }
      first_click =!first_click;
   }
 } 
 
int cl_1=0,cl_2=1;
long l=0,y=1;
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // event ID  
                  const long& lparam,   // event parameter of the long type
                  const double& dparam, // event parameter of the double type
                  const string& sparam) // event parameter of the string type
  { 
  if(id==CHARTEVENT_CLICK){
  if(cl_1==0){l=(int)lparam;cl_1=1;cl_2=1;}
  if(cl_2==0){y=(int)lparam;cl_1=0;}
  Print(l + " " + y);
  cl_2=0;
  }
 }
2025.01.03 17:43:38.874 ZZ_BB XAUUSD,M5: 280 377
2025.01.03 17:43:36.922 ZZ_BB XAUUSD,M5: 280 287
2025.01.03 17:43:34.978 ZZ_BB XAUUSD,M5: 275 287
2025.01.03 17:43:33.189 ZZ_BB XAUUSD,M5: 275 291
2025.01.03 17:43:31.553 ZZ_BB XAUUSD,M5: 246 291
2025.01.03 17:43:30.534 ZZ_BB XAUUSD,M5: 246 1
 
Tretyakov Rostyslav #:

Это с двумя. А если с тремя? 

 
Sergei Gurov #:

Это с двумя. А если с тремя? 

Независимо от количества кликов выдаются значения текущего и предыдущего кликов.
 
Tretyakov Rostyslav #:
Независимо от количества кликов выдаются значения текущего и предыдущего кликов.

Понял. Огромное спасибо!