Обсуждение статьи "Рецепты MQL5 - Элементы управления в подокне индикатора - Кнопки" - страница 4

 
DC2008:

А то, что "функции кнопок размещены в функции OnInit" - очень смешно!

Впрочем, может Вы не поняли о чём идёт речь? Если нажать на кнопку, должна сработать какая-то функция пользователя, которая выполнит какую-то микрозадачу.

 
DC2008:

Хорошо, давайте посмеёмся. Статью написали Вы, "никто Вас за язык не тянул".

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

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

А то, что "функции кнопок размещены в функции OnInit" - очень смешно!

Это Вас за язык никто не тянул. Доказательства приводить будете? Точнее опровержение моего утверждения? К Вашему сведению далеко не всё ещё описано в Справочнике. То есть, работа над справочником идёт, вносятся дополнения и исправления. Всё всегда нужно проверять самому. 

Поверьте, код из Вашей статьи намного больше "путает" начинающих и не только, что можно увидеть в обсуждении к Вашей статье. 

Впрочем, может Вы не поняли о чём идёт речь? Если нажать на кнопку, должна сработать какая-то функция пользователя, которая выполнит какую-то микрозадачу.

Да, я понял всё буквально. Задавайте точнее свои вопросы. Но я предвижу, что мой ответ будет Вами осмеян, так как у Вас сегодня такая функция похоже.

В данном случае "микрозадачей" было изменение цвета кнопки. Я специально не стал добавлять какие-то дополнительные функции, чтобы не было ничего лишнего. Как раз для того, чтобы не перегружать код.

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

 

Уважаемый автор статьи, Вы её писали не для меня, а для начинающих. Действительно, мне Ваши решения не интересны, но речь о тех, кто только разбирается с языком. Про какие такие "другие программы" идёт речь? И как функция OnDeinit одной программы может влиять на функции других программ?

Идёт обсуждение статьи и что Вас так возмущает?

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

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
DC2008:

Уважаемый автор статьи, Вы её писали не для меня, а для начинающих. 

Именно так. 

Действительно, мне Ваши решения не интересны, но речь о тех, кто только разбирается с языком. 

Но вопросы задаёте Вы.

Про какие такие "другие программы" идёт речь?

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

И как функция OnDeinit одной программы может влиять на функции других программ?

Влияет. Я об этом написал. Редактор опубликовав статью это подтвердил. Можете тоже проверить и убедиться в этом сами. 

Идёт обсуждение статьи и что Вас так возмущает?

Ничего. Я жду опровержения своего утверждения. ) 

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

От новичков пока вопросов не поступало. Да и вопросов быть не может. Всё предельно понятно, а каждая строка кода подробно прокомментирована. 

 

Сначала глушим это:

void OnTimer()
  {
//--- Проверим, включено ли отслеживание событий мыши
   //CheckChartEventMouseMove();

  }

т.е. теперь мы не отслеживаем события мыши, так?

Запускаем на графике Ваш код:

 

теперь запускаем "другую программу", пусть это будет опять Ваш код:

 

наверное что-то пошло не так? или так и задумано?

 

теперь удаляем один из индикаторов и по мнению автора кода мы потеряли "отслеживание мыши", однако этого не происходит:

 
C-4:

Если Вы не претендуете, то я тогда даже не знаю кто тогда может претендовать? Данальд Кнут? Билл Гейтс?

 Это я на комплимент нарывался.. Удалось)

 

C-4:
Теперь понятно. Но непонятно только то, что ведущие продукты Маркета созданные Вами, Вам не принадлежат. Не обидно?

1. Еще не вечер)

2. Моя поделка тоже постоянно в топе, хотя она ни в какое сравнение не идет с панелью.

3. Успех панели во многом обусловлен стараниями автора идеи, поэтому говорить о том, что это мой продукт - некорректно.

4. Работал я не бесплатно) 

 
DC2008:

...

теперь удаляем один из индикаторов и по мнению автора кода мы потеряли "отслеживание мыши", однако этого не происходит:

Теперь проверьте, срабатывает ли событие OnDeinit() в индикаторах. Именно об этом интересном моменте я упоминал до этого. :) А именно в OnDeinit(), в примере из статьи, отключается событие слежения за движением. С какого-то билда похоже OnDeinit() в индикаторах вообще перестал работать. Это баг и нужно сообщить разработчикам.

Далее, чтобы убедиться, что моё утверждение верно, нужно сделать пустышку эксперта (в экспертах функция OnDeinit() работает), в котором достаточно добавить вот такую строчку кода (выделено):

//+------------------------------------------------------------------+
//|                                                         TEST.mq5 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Deinitialization function of the expert                          |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- Отключим слежение за событиями мыши
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,false);
  }
//+------------------------------------------------------------------+
//| OnTick                                                           |
//+------------------------------------------------------------------+
void OnTick()
  {
  }
//+------------------------------------------------------------------+

//---

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

По поводу вот этого:

наверное что-то пошло не так? или так и задумано?

Это известно. Это не задумано так, а просто не учтено в этой статье. Статья, как всегда является простым примером, а не готовым решением на все случаи жизни. )

 

 
Сергей, ну полноте Вам кипишь наводить. Мне вот например тоже было не понятно зачем использовать таймер. Но за пару моментов нашел объяснение в статье и тут же все понял. Я не проверял на практике это утверждение, но в этом доверяю автору, понимая, что написал он это не спроста, и если таймер был введен, на то были причины. 
 
void OnDeinit(const int reason)
  {
//--- Отключим слежение за событиями мыши
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,false);
  }

Вообще данный код видится весьма проблемным. Нет реальных оснований выключать отслеживания передвижения мыши при отключении эксперта/индикатора. Если уж так хочется заморочиться, надо восстанавливать состояние бывшее до инициацилизации эксперта:

bool mouseStatus;
void OnInit()
  {
  mouseStatus = ChartGetInteger(0,CHART_EVENT_MOUSE_MOVE);
  }

void OnDeinit(const int reason)
  {
   //--- Отключим слежение за событиями мыши
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,mauseStatus);
  }
 
C-4:

Вообще данный код видится весьма проблемным. Нет реальных оснований выключать отслеживания передвижения мыши при отключении эксперта/индикатора. 

Нет, Вы не правы. Есть реальные основания для отключения отслеживания передвижения мыши. И сейчас я это докажу. )

Например, у Вас на графике запущено две программы. Эксперт, в котором нужно отслеживать событие перемещения мыши. И индикатор, в котором не нужно отслеживать событие передвижения мыши, но нужно допустим отслеживать, какие-нибудь другие события графика.

Теперь запустите вот этот код эксперта:

#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Включим слежение за событиями мыши
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Deinitialization function of the expert                          |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- Отключим слежение за событиями мыши
   //ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,false);
  }
//+------------------------------------------------------------------+
//| OnTick                                                           |
//+------------------------------------------------------------------+
void OnTick()
  {
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int    id,
                  const long   &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- Отслеживание движения мыши и нажатия левой кнопки мыши
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      static int count=1;
      Print("CHARTEVENT_MOUSE_MOVE; EXPERT; ",count);
      count++;
     }
  }
//+------------------------------------------------------------------+

В нём во время инициализации, в функции OnInit(), включается отслеживание события передвижения мыши. Но намеренно закомментирована строка в функции OnDeinit(), где это слежение должно отключаться.

Загрузите также на график индикатор. Вот его код:

#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Deinitialization function of the expert                          |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- Отслеживание движения мыши и нажатия левой кнопки мыши
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      static long count=1;
      Print("CHARTEVENT_MOUSE_MOVE; INDICATOR; ",count);
      count++;
     }
  }
//+------------------------------------------------------------------+

И первая и вторая программа выводит в журнал сообщение о том, что событие поступает. Теперь удалите эксперта с графика. Допустим, Вы с его помощью произвели какие-то вычисления и он Вам больше не нужен. После его удаления, так как событие отслеживания передвижения мыши не было отключено, индикатор продолжает принимать это событие. А это не нужно.

Теперь согласны? )

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